aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_fork.c
diff options
context:
space:
mode:
authorMatthew Dillon <dillon@FreeBSD.org>2002-03-27 05:39:23 +0000
committerMatthew Dillon <dillon@FreeBSD.org>2002-03-27 05:39:23 +0000
commitd74ac6819b2cc8e5c18a099a97ffc16616b4e94d (patch)
tree8233f61cf29e01829b91c6a5cf27defe60e6b8d8 /sys/kern/kern_fork.c
parent50a565560242eb8b86d01bb62036d501aa4fa52b (diff)
downloadsrc-d74ac6819b2cc8e5c18a099a97ffc16616b4e94d.tar.gz
src-d74ac6819b2cc8e5c18a099a97ffc16616b4e94d.zip
Compromise for critical*()/cpu_critical*() recommit. Cleanup the interrupt
disablement assumptions in kern_fork.c by adding another API call, cpu_critical_fork_exit(). Cleanup the td_savecrit field by moving it from MI to MD. Temporarily move cpu_critical*() from <arch>/include/cpufunc.h to <arch>/<arch>/critical.c (stage-2 will clean this up). Implement interrupt deferral for i386 that allows interrupts to remain enabled inside critical sections. This also fixes an IPI interlock bug, and requires uses of icu_lock to be enclosed in a true interrupt disablement. This is the stage-1 commit. Stage-2 will occur after stage-1 has stabilized, and will move cpu_critical*() into its own header file(s) + other things. This commit may break non-i386 architectures in trivial ways. This should be temporary. Reviewed by: core Approved by: core
Notes
Notes: svn path=/head/; revision=93264
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r--sys/kern/kern_fork.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index d508cbf238c8..723fd62d2825 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -774,12 +774,16 @@ fork_exit(callout, arg, frame)
td->td_kse->ke_oncpu = PCPU_GET(cpuid);
/*
- * Setup the sched_lock state so that we can release it.
+ * Finish setting up thread glue. We need to initialize
+ * the thread into a td_critnest=1 state. Some platforms
+ * may have already partially or fully initialized td_critnest
+ * and/or td_md.md_savecrit (when applciable).
+ *
+ * see <arch>/<arch>/critical.c
*/
sched_lock.mtx_lock = (uintptr_t)td;
sched_lock.mtx_recurse = 0;
- td->td_critnest = 1;
- td->td_savecrit = CRITICAL_FORK;
+ cpu_critical_fork_exit();
CTR3(KTR_PROC, "fork_exit: new proc %p (pid %d, %s)", p, p->p_pid,
p->p_comm);
if (PCPU_GET(switchtime.sec) == 0)