diff options
author | jhb <jhb@FreeBSD.org> | 2016-02-08 23:11:23 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2016-02-08 23:11:23 +0000 |
commit | f6d0271729d6eb549c3ccc7d80a28b200801e97c (patch) | |
tree | 5fc44fa2cb5016bf6a4e5bae61fb3bde94f6db2e /sys/kern | |
parent | 9fbc164e2be5ab7b5f5e7389fd84d8dfad592ece (diff) | |
download | FreeBSD-src-f6d0271729d6eb549c3ccc7d80a28b200801e97c.zip FreeBSD-src-f6d0271729d6eb549c3ccc7d80a28b200801e97c.tar.gz |
Call kthread_exit() rather than kproc_exit() for a premature kthread exit.
Kernel threads (and processes) are supposed to call kthread_exit() (or
kproc_exit()) to terminate. However, the kernel includes a fallback in
fork_exit() to force a kthread exit if a kernel thread's "main" routine
returns. This fallback was added back when the kernel only had processes
and was not updated to call kthread_exit() instead of kproc_exit() when
threads were added to the kernel.
This mistake was particular exciting when the errant thread belonged to
proc0. Due to the missing P_KTHREAD flag the fallback did not kick in
and instead tried to return to userland via whatever garbage was in the
trapframe. With P_KTHREAD set it tried to terminate proc0 resulting in
other amusements.
PR: 204999
MFC after: 1 week
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_fork.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 9abe08c..34af264 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -1040,7 +1040,7 @@ fork_exit(void (*callout)(void *, struct trapframe *), void *arg, if (p->p_flag & P_KTHREAD) { printf("Kernel thread \"%s\" (pid %d) exited prematurely.\n", td->td_name, p->p_pid); - kproc_exit(0); + kthread_exit(); } mtx_assert(&Giant, MA_NOTOWNED); |