diff options
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r-- | sys/kern/kern_fork.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index f20cefe..c0e3204 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -768,6 +768,7 @@ fork_exit(callout, arg, frame) { struct proc *p; struct thread *td; + struct thread *dtd; td = curthread; p = td->td_proc; @@ -778,6 +779,17 @@ fork_exit(callout, arg, frame) sched_fork_exit(td); /* + * Processes normally resume in mi_switch() after being + * cpu_switch()'ed to, but when children start up they arrive here + * instead, so we must do much the same things as mi_switch() would. + */ + if ((dtd = PCPU_GET(deadthread))) { + PCPU_SET(deadthread, NULL); + thread_stash(dtd); + } + thread_unlock(td); + + /* * cpu_set_fork_handler intercepts this function call to * have this call a non-return function to stay in kernel mode. * initproc has its own fork handler, but it does return. |