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 |
