summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_fork.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-02-20 05:26:15 +0000
committerjhb <jhb@FreeBSD.org>2001-02-20 05:26:15 +0000
commit27efeb0d3097def44db638ca1b56b51d59d27262 (patch)
tree1f8a102953b3fe1c9808c071ae97fe452a9e22c0 /sys/kern/kern_fork.c
parent186e24ad6b2494564362a9d8c0824ab7c38db682 (diff)
downloadFreeBSD-src-27efeb0d3097def44db638ca1b56b51d59d27262.zip
FreeBSD-src-27efeb0d3097def44db638ca1b56b51d59d27262.tar.gz
- Don't call clear_resched() in userret(), instead, clear the resched flag
in mi_switch() just before calling cpu_switch() so that the first switch after a resched request will satisfy the request. - While I'm at it, move a few things into mi_switch() and out of cpu_switch(), specifically set the p_oncpu and p_lastcpu members of proc in mi_switch(), and handle the sched_lock state change across a context switch in mi_switch(). - Since cpu_switch() no longer handles the sched_lock state change, we have to setup an initial state for sched_lock in fork_exit() before we release it.
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r--sys/kern/kern_fork.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index ee5b602..c754e5d 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -651,6 +651,11 @@ fork_exit(callout, arg, frame)
{
struct proc *p;
+ /*
+ * Setup the sched_lock state so that we can release it.
+ */
+ sched_lock.mtx_lock = curproc;
+ sched_lock.mtx_recurse = 0;
mtx_unlock_spin(&sched_lock);
/*
* XXX: We really shouldn't have to do this.
@@ -668,6 +673,7 @@ fork_exit(callout, arg, frame)
* have this call a non-return function to stay in kernel mode.
* initproc has its own fork handler, but it does return.
*/
+ KASSERT(callout != NULL, ("NULL callout in fork_exit"));
callout(arg, frame);
/*
OpenPOWER on IntegriCloud