Call kthread_exit() rather than kproc_exit() for a premature kthread exit.
authorjhb <jhb@FreeBSD.org>
Mon, 8 Feb 2016 23:11:23 +0000 (23:11 +0000)
committerjhb <jhb@FreeBSD.org>
Mon, 8 Feb 2016 23:11:23 +0000 (23:11 +0000)
commitf6d0271729d6eb549c3ccc7d80a28b200801e97c
tree5fc44fa2cb5016bf6a4e5bae61fb3bde94f6db2e
parent9fbc164e2be5ab7b5f5e7389fd84d8dfad592ece
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
sys/kern/kern_fork.c