aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/exit.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/exit.c')
-rw-r--r--kernel/exit.c61
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 */
320int allow_signal(int sig)
321{
322 if (!valid_signal(sig) || sig < 1)
323 return -EINVAL;
324
325 spin_lock_irq(&current->sighand->siglock);
326 /* This is only needed for daemonize()'ed kthreads */
327 sigdelset(&current->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(&current->sighand->siglock);
336 return 0;
337}
338
339EXPORT_SYMBOL(allow_signal);
340
341int disallow_signal(int sig)
342{
343 if (!valid_signal(sig) || sig < 1)
344 return -EINVAL;
345
346 spin_lock_irq(&current->sighand->siglock);
347 current->sighand->action[(sig)-1].sa.sa_handler = SIG_IGN;
348 recalc_sigpending();
349 spin_unlock_irq(&current->sighand->siglock);
350 return 0;
351}
352
353EXPORT_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