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:
parent
e42f8233fc
commit
49c394a970
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user