diff options
Diffstat (limited to 'kernel/signal.c')
| -rw-r--r-- | kernel/signal.c | 14 | 
1 files changed, 11 insertions, 3 deletions
| diff --git a/kernel/signal.c b/kernel/signal.c index ba4d1ef39a9e..f2718350bf4b 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -91,7 +91,7 @@ static bool sig_task_ignored(struct task_struct *t, int sig, bool force)  		return true;  	/* Only allow kernel generated signals to this kthread */ -	if (unlikely((t->flags & (PF_KTHREAD | PF_IO_WORKER)) && +	if (unlikely((t->flags & PF_KTHREAD) &&  		     (handler == SIG_KTHREAD_KERNEL) && !force))  		return true; @@ -1096,7 +1096,7 @@ static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struc  	/*  	 * Skip useless siginfo allocation for SIGKILL and kernel threads.  	 */ -	if ((sig == SIGKILL) || (t->flags & (PF_KTHREAD | PF_IO_WORKER))) +	if ((sig == SIGKILL) || (t->flags & PF_KTHREAD))  		goto out_set;  	/* @@ -2768,13 +2768,21 @@ relock:  		}  		/* +		 * PF_IO_WORKER threads will catch and exit on fatal signals +		 * themselves. They have cleanup that must be performed, so +		 * we cannot call do_exit() on their behalf. +		 */ +		if (current->flags & PF_IO_WORKER) +			goto out; + +		/*  		 * Death signals, no core dump.  		 */  		do_group_exit(ksig->info.si_signo);  		/* NOTREACHED */  	}  	spin_unlock_irq(&sighand->siglock); - +out:  	ksig->sig = signr;  	if (!(ksig->ka.sa.sa_flags & SA_EXPOSE_TAGBITS)) |