diff options
Diffstat (limited to 'kernel/exit.c')
-rw-r--r-- | kernel/exit.c | 61 |
1 files changed, 13 insertions, 48 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 6ed6a1d552b5..e5c4668f1799 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -313,46 +313,7 @@ kill_orphaned_pgrp(struct task_struct *tsk, struct task_struct *parent) | |||
313 | } | 313 | } |
314 | } | 314 | } |
315 | 315 | ||
316 | /* | 316 | #ifdef CONFIG_MEMCG |
317 | * Let kernel threads use this to say that they allow a certain signal. | ||
318 | * Must not be used if kthread was cloned with CLONE_SIGHAND. | ||
319 | */ | ||
320 | int allow_signal(int sig) | ||
321 | { | ||
322 | if (!valid_signal(sig) || sig < 1) | ||
323 | return -EINVAL; | ||
324 | |||
325 | spin_lock_irq(¤t->sighand->siglock); | ||
326 | /* This is only needed for daemonize()'ed kthreads */ | ||
327 | sigdelset(¤t->blocked, sig); | ||
328 | /* | ||
329 | * Kernel threads handle their own signals. Let the signal code | ||
330 | * know it'll be handled, so that they don't get converted to | ||
331 | * SIGKILL or just silently dropped. | ||
332 | */ | ||
333 | current->sighand->action[(sig)-1].sa.sa_handler = (void __user *)2; | ||
334 | recalc_sigpending(); | ||
335 | spin_unlock_irq(¤t->sighand->siglock); | ||
336 | return 0; | ||
337 | } | ||
338 | |||
339 | EXPORT_SYMBOL(allow_signal); | ||
340 | |||
341 | int disallow_signal(int sig) | ||
342 | { | ||
343 | if (!valid_signal(sig) || sig < 1) | ||
344 | return -EINVAL; | ||
345 | |||
346 | spin_lock_irq(¤t->sighand->siglock); | ||
347 | current->sighand->action[(sig)-1].sa.sa_handler = SIG_IGN; | ||
348 | recalc_sigpending(); | ||
349 | spin_unlock_irq(¤t->sighand->siglock); | ||
350 | return 0; | ||
351 | } | ||
352 | |||
353 | EXPORT_SYMBOL(disallow_signal); | ||
354 | |||
355 | #ifdef CONFIG_MM_OWNER | ||
356 | /* | 317 | /* |
357 | * A task is exiting. If it owned this mm, find a new owner for the mm. | 318 | * A task is exiting. If it owned this mm, find a new owner for the mm. |
358 | */ | 319 | */ |
@@ -395,14 +356,18 @@ retry: | |||
395 | } | 356 | } |
396 | 357 | ||
397 | /* | 358 | /* |
398 | * Search through everything else. We should not get | 359 | * Search through everything else, we should not get here often. |
399 | * here often | ||
400 | */ | 360 | */ |
401 | do_each_thread(g, c) { | 361 | for_each_process(g) { |
402 | if (c->mm == mm) | 362 | if (g->flags & PF_KTHREAD) |
403 | goto assign_new_owner; | 363 | continue; |
404 | } while_each_thread(g, c); | 364 | for_each_thread(g, c) { |
405 | 365 | if (c->mm == mm) | |
366 | goto assign_new_owner; | ||
367 | if (c->mm) | ||
368 | break; | ||
369 | } | ||
370 | } | ||
406 | read_unlock(&tasklist_lock); | 371 | read_unlock(&tasklist_lock); |
407 | /* | 372 | /* |
408 | * We found no owner yet mm_users > 1: this implies that we are | 373 | * We found no owner yet mm_users > 1: this implies that we are |
@@ -434,7 +399,7 @@ assign_new_owner: | |||
434 | task_unlock(c); | 399 | task_unlock(c); |
435 | put_task_struct(c); | 400 | put_task_struct(c); |
436 | } | 401 | } |
437 | #endif /* CONFIG_MM_OWNER */ | 402 | #endif /* CONFIG_MEMCG */ |
438 | 403 | ||
439 | /* | 404 | /* |
440 | * Turn us into a lazy TLB process if we | 405 | * Turn us into a lazy TLB process if we |