Re-schedule signals after kthread exits, since apparently there are

processes which combine kernel and non-kernel threads, e.g. nfsd.  For
such processes, termination of a kthread must recheck signal delivery
among other threads according to masks.

Reported and tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2016-08-10 13:47:12 +00:00
parent e42f8233fc
commit 49c394a970
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=303914

View File

@ -320,11 +320,13 @@ void
kthread_exit(void)
{
struct proc *p;
struct thread *td;
p = curthread->td_proc;
td = curthread;
p = td->td_proc;
/* A module may be waiting for us to exit. */
wakeup(curthread);
wakeup(td);
/*
* The last exiting thread in a kernel process must tear down
@ -337,9 +339,10 @@ kthread_exit(void)
rw_wunlock(&tidhash_lock);
kproc_exit(0);
}
LIST_REMOVE(curthread, td_hash);
LIST_REMOVE(td, td_hash);
rw_wunlock(&tidhash_lock);
umtx_thread_exit(curthread);
umtx_thread_exit(td);
tdsigcleanup(td);
PROC_SLOCK(p);
thread_exit();
}