Do some minor critical path performance improvements in the scheduler
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 10 Apr 2004 20:55:24 +0000 (20:55 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 10 Apr 2004 20:55:24 +0000 (20:55 +0000)
and at the user/system boundary.  Avoid some unnecessary segment prefix ops,
remove some unnecessary memory ops by using more optimal critical
section inlines, and use 32 bit arithmatic instead of 64 bit arithmatic
when calculating system tick overheads in userret().

This saves a whopping 5ns worth of syscall overhead, which just proves
how silly I am sometimes.

16 files changed:
sys/i386/i386/trap.c
sys/i386/i386/vm_machdep.c
sys/i386/isa/intr_machdep.c
sys/kern/kern_resource.c
sys/kern/kern_sig.c
sys/kern/kern_switch.c
sys/kern/kern_synch.c
sys/kern/kern_time.c
sys/kern/lwkt_msgport.c
sys/kern/lwkt_thread.c
sys/platform/pc32/i386/trap.c
sys/platform/pc32/i386/vm_machdep.c
sys/platform/pc32/isa/intr_machdep.c
sys/sys/proc.h
sys/sys/thread.h
sys/sys/thread2.h

index 199d434..170d1db 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)trap.c        7.4 (Berkeley) 5/13/91
  * $FreeBSD: src/sys/i386/i386/trap.c,v 1.147.2.11 2003/02/27 19:09:59 luoqi Exp $
- * $DragonFly: src/sys/i386/i386/Attic/trap.c,v 1.48 2004/03/30 19:14:04 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/trap.c,v 1.49 2004/04/10 20:55:20 dillon Exp $
  */
 
 /*
@@ -222,8 +222,14 @@ userexit(struct proc *p)
        acquire_curproc(p);
 }
 
+/*
+ * userret() handles signals, upcalls, and deals with system profiling
+ * charges.  Note that td_sticks is a 64 bit quantity, but there's no
+ * point doing 64 arithmatic on the delta calculation so the absolute
+ * tick values are truncated to an integer.
+ */
 static void
-userret(struct proc *p, struct trapframe *frame, u_quad_t oticks)
+userret(struct proc *p, struct trapframe *frame, int sticks)
 {
        int sig;
 
@@ -258,7 +264,7 @@ userret(struct proc *p, struct trapframe *frame, u_quad_t oticks)
         */
        if (p->p_flag & P_PROFIL) {
                addupc_task(p, frame->tf_eip, 
-                   (u_int)(curthread->td_sticks - oticks));
+                       (u_int)((int)p->p_thread->td_sticks - sticks));
        }
 
        /*
@@ -292,7 +298,7 @@ trap(frame)
 {
        struct thread *td = curthread;
        struct proc *p;
-       u_quad_t sticks = 0;
+       int sticks = 0;
        int i = 0, ucode = 0, type, code;
        vm_offset_t eva;
 
@@ -368,11 +374,11 @@ restart:
                if (frame.tf_eflags & PSL_VM &&
                    (type == T_PROTFLT || type == T_STKFLT)) {
 #ifdef SMP
-                       KKASSERT(curthread->td_mpcount > 0);
+                       KKASSERT(td->td_mpcount > 0);
 #endif
                        i = vm86_emulate((struct vm86frame *)&frame);
 #ifdef SMP
-                       KKASSERT(curthread->td_mpcount > 0);
+                       KKASSERT(td->td_mpcount > 0);
 #endif
                        if (i != 0) {
                                /*
@@ -404,7 +410,7 @@ restart:
 
                userenter(td);
 
-               sticks = curthread->td_sticks;
+               sticks = (int)td->td_sticks;
                p->p_md.md_regs = &frame;
 
                switch (type) {
@@ -587,7 +593,7 @@ kernel_trap:
                         * nesting level check.
                         */
                        if (frame.tf_eip == (int)cpu_switch_load_gs) {
-                               curthread->td_pcb->pcb_gs = 0;
+                               td->td_pcb->pcb_gs = 0;
                                psignal(p, SIGBUS);
                                goto out2;
                        }
@@ -609,8 +615,9 @@ kernel_trap:
                                                   doreti_popl_es_fault);
                                MAYBE_DORETI_FAULT(doreti_popl_fs,
                                                   doreti_popl_fs_fault);
-                               if (curthread->td_pcb->pcb_onfault) {
-                                       frame.tf_eip = (int)curthread->td_pcb->pcb_onfault;
+                               if (td->td_pcb->pcb_onfault) {
+                                       frame.tf_eip = 
+                                           (register_t)td->td_pcb->pcb_onfault;
                                        goto out2;
                                }
                        }
@@ -745,13 +752,13 @@ kernel_trap:
 out:
 #ifdef SMP
         if (ISPL(frame.tf_cs) == SEL_UPL)
-               KASSERT(curthread->td_mpcount == 1, ("badmpcount trap from %p", (void *)frame.tf_eip));
+               KASSERT(td->td_mpcount == 1, ("badmpcount trap from %p", (void *)frame.tf_eip));
 #endif
        userret(p, &frame, sticks);
        userexit(p);
 out2:
 #ifdef SMP
-       KKASSERT(curthread->td_mpcount > 0);
+       KKASSERT(td->td_mpcount > 0);
 #endif
        rel_mplock();
 }
@@ -775,7 +782,8 @@ trap_pfault(frame, usermode, eva)
        vm_map_t map = 0;
        int rv = 0;
        vm_prot_t ftype;
-       struct proc *p = curproc;
+       thread_t td = curthread;
+       struct proc *p = td->td_proc;   /* may be NULL */
 
        if (frame->tf_err & PGEX_W)
                ftype = VM_PROT_WRITE;
@@ -789,8 +797,8 @@ trap_pfault(frame, usermode, eva)
 
                if (p == NULL ||
                    (!usermode && va < VM_MAXUSER_ADDRESS &&
-                    (mycpu->gd_intr_nesting_level != 0 || 
-                     curthread->td_pcb->pcb_onfault == NULL))) {
+                    (td->td_gd->gd_intr_nesting_level != 0 || 
+                     td->td_pcb->pcb_onfault == NULL))) {
                        trap_fatal(frame, eva);
                        return (-1);
                }
@@ -852,8 +860,9 @@ trap_pfault(frame, usermode, eva)
                return (0);
 nogo:
        if (!usermode) {
-               if (mycpu->gd_intr_nesting_level == 0 && curthread->td_pcb->pcb_onfault) {
-                       frame->tf_eip = (int)curthread->td_pcb->pcb_onfault;
+               if (mtd->td_gd->gd_intr_nesting_level == 0 && 
+                   td->td_pcb->pcb_onfault) {
+                       frame->tf_eip = (register_t)td->td_pcb->pcb_onfault;
                        return (0);
                }
                trap_fatal(frame, eva);
@@ -878,7 +887,8 @@ trap_pfault(frame, usermode, eva)
        vm_map_t map = 0;
        int rv = 0;
        vm_prot_t ftype;
-       struct proc *p = curproc;
+       thread_t td = curthread;
+       struct proc *p = td->td_proc;
 
        va = trunc_page(eva);
        if (va >= KERNBASE) {
@@ -959,8 +969,9 @@ trap_pfault(frame, usermode, eva)
                return (0);
 nogo:
        if (!usermode) {
-               if (mycpu->gd_intr_nesting_level == 0 && curthread->td_pcb->pcb_onfault) {
-                       frame->tf_eip = (int)curthread->td_pcb->pcb_onfault;
+               if (td->td_gd->gd_intr_nesting_level == 0 &&
+                   td->td_pcb->pcb_onfault) {
+                       frame->tf_eip = (register_t)td->td_pcb->pcb_onfault;
                        return (0);
                }
                trap_fatal(frame, eva);
@@ -1173,7 +1184,7 @@ syscall2(struct trapframe frame)
        int i;
        struct sysent *callp;
        register_t orig_tf_eflags;
-       u_quad_t sticks;
+       int sticks;
        int error;
        int narg;
        u_int code;
@@ -1188,18 +1199,12 @@ syscall2(struct trapframe frame)
 #endif
 
 #ifdef SMP
-       KASSERT(curthread->td_mpcount == 0, ("badmpcount syscall from %p", (void *)frame.tf_eip));
+       KASSERT(td->td_mpcount == 0, ("badmpcount syscall from %p", (void *)frame.tf_eip));
        get_mplock();
 #endif
-       /*
-        * access non-atomic field from critical section.  p_sticks is
-        * updated by the clock interrupt.  Also use this opportunity
-        * to lazy-raise our LWKT priority.
-        */
-       userenter(td);
-       crit_enter_quick(td);
-       sticks = curthread->td_sticks;
-       crit_exit_quick(td);
+       userenter(td);          /* lazy raise our priority */
+
+       sticks = (int)td->td_sticks;
 
        p->p_md.md_regs = &frame;
        params = (caddr_t)frame.tf_esp + sizeof(int);
@@ -1355,7 +1360,7 @@ bad:
        /*
         * Release the MP lock if we had to get it
         */
-       KASSERT(curthread->td_mpcount == 1, ("badmpcount syscall from %p", (void *)frame.tf_eip));
+       KASSERT(td->td_mpcount == 1, ("badmpcount syscall from %p", (void *)frame.tf_eip));
        rel_mplock();
 #endif
 }
@@ -1373,7 +1378,7 @@ sendsys2(struct trapframe frame)
        struct sysent *callp;
        union sysunion *sysun;
        lwkt_msg_t umsg;
-       u_quad_t sticks;
+       int sticks;
        int error;
        int narg;
        u_int code = 0;
@@ -1389,7 +1394,7 @@ sendsys2(struct trapframe frame)
 #endif
 
 #ifdef SMP
-       KASSERT(curthread->td_mpcount == 0, ("badmpcount syscall from %p", (void *)frame.tf_eip));
+       KASSERT(td->td_mpcount == 0, ("badmpcount syscall from %p", (void *)frame.tf_eip));
        get_mplock();
 #endif
        /*
@@ -1398,9 +1403,7 @@ sendsys2(struct trapframe frame)
         * to lazy-raise our LWKT priority.
         */
        userenter(td);
-       crit_enter_quick(td);
-       sticks = curthread->td_sticks;
-       crit_exit_quick(td);
+       sticks = td->td_sticks;
 
        p->p_md.md_regs = &frame;
        orig_tf_eflags = frame.tf_eflags;
@@ -1632,7 +1635,7 @@ good:
        /*
         * Release the MP lock if we had to get it
         */
-       KASSERT(curthread->td_mpcount == 1, ("badmpcount syscall from %p", (void *)frame.tf_eip));
+       KASSERT(td->td_mpcount == 1, ("badmpcount syscall from %p", (void *)frame.tf_eip));
        rel_mplock();
 #endif
 }
@@ -1661,7 +1664,7 @@ fork_return(p, frame)
        userexit(p);
        p->p_flag &= ~P_PASSIVE_ACQ;
 #ifdef SMP
-       KKASSERT(curthread->td_mpcount == 1);
+       KKASSERT(p->p_thread->td_mpcount == 1);
        rel_mplock();
 #endif
 }
index 989d27e..e80a7dc 100644 (file)
@@ -39,7 +39,7 @@
  *     from: @(#)vm_machdep.c  7.3 (Berkeley) 5/13/91
  *     Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$
  * $FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.132.2.9 2003/01/25 19:02:23 dillon Exp $
- * $DragonFly: src/sys/i386/i386/Attic/vm_machdep.c,v 1.28 2004/03/29 17:30:23 drhodus Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/vm_machdep.c,v 1.29 2004/04/10 20:55:20 dillon Exp $
  */
 
 #include "use_npx.h"
@@ -271,10 +271,10 @@ cpu_proc_exit(void)
                 reset_dbregs();
                 pcb->pcb_flags &= ~PCB_DBREGS;
         }
-       mycpu->gd_cnt.v_swtch++;
+       td->td_gd->gd_cnt.v_swtch++;
 
-       crit_enter();
-       lwkt_deschedule_self();
+       crit_enter_quick(td);
+       lwkt_deschedule_self(td);
        cpu_thread_exit();
 }
 
index a388eb2..b22b929 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     from: @(#)isa.c 7.2 (Berkeley) 5/13/91
  * $FreeBSD: src/sys/i386/isa/intr_machdep.c,v 1.29.2.5 2001/10/14 06:54:27 luigi Exp $
- * $DragonFly: src/sys/i386/isa/Attic/intr_machdep.c,v 1.21 2004/03/30 19:14:08 dillon Exp $
+ * $DragonFly: src/sys/i386/isa/Attic/intr_machdep.c,v 1.22 2004/04/10 20:55:22 dillon Exp $
  */
 /*
  * This file contains an aggregated module marked:
@@ -1022,14 +1022,17 @@ ithread_done(int irq)
 {
     struct mdglobaldata *gd = mdcpu;
     int mask = 1 << irq;
+    thread_t td;
 
-    KKASSERT(curthread->td_pri >= TDPRI_CRIT);
-    lwkt_deschedule_self();
+    td = gd->mi.gd_curthread;
+
+    KKASSERT(td->td_pri >= TDPRI_CRIT);
+    lwkt_deschedule_self(td);
     INTREN(mask);
     if (gd->gd_ipending & mask) {
        atomic_clear_int_nonlocked(&gd->gd_ipending, mask);
        INTRDIS(mask);
-       lwkt_schedule_self();
+       lwkt_schedule_self(td);
     } else {
        lwkt_switch();
     }
index 72cdb49..dbec75d 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_resource.c     8.5 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/kern_resource.c,v 1.55.2.5 2001/11/03 01:41:08 ps Exp $
- * $DragonFly: src/sys/kern/kern_resource.c,v 1.18 2004/01/24 07:55:50 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_resource.c,v 1.19 2004/04/10 20:55:23 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -59,6 +59,8 @@
 #include <vm/pmap.h>
 #include <vm/vm_map.h>
 
+#include <sys/thread2.h>
+
 static int donice (struct proc *chgp, int n);
 
 static MALLOC_DEFINE(M_UIDINFO, "uidinfo", "uidinfo structures");
@@ -433,14 +435,13 @@ calcru(struct proc *p, struct timeval *up, struct timeval *sp,
        struct timeval *ip)
 {
        struct thread *td = p->p_thread;
-       int s;
 
        /*
         * Calculate at the statclock level.  YYY if the thread is owned by
         * another cpu we need to forward the request to the other cpu, or
         * have a token to interlock the information.
         */
-       s = splstatclock();
+       crit_enter();
        up->tv_sec = td->td_uticks / 1000000;
        up->tv_usec = td->td_uticks % 1000000;
        sp->tv_sec = td->td_sticks / 1000000;
@@ -449,7 +450,7 @@ calcru(struct proc *p, struct timeval *up, struct timeval *sp,
                ip->tv_sec = td->td_iticks / 1000000;
                ip->tv_usec = td->td_iticks % 1000000;
        }
-       splx(s);
+       crit_exit();
 }
 
 /* ARGSUSED */
index f47b4c7..10c2a79 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_sig.c  8.7 (Berkeley) 4/18/94
  * $FreeBSD: src/sys/kern/kern_sig.c,v 1.72.2.17 2003/05/16 16:34:34 obrien Exp $
- * $DragonFly: src/sys/kern/kern_sig.c,v 1.28 2004/04/10 18:15:37 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_sig.c,v 1.29 2004/04/10 20:55:23 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -1069,7 +1069,7 @@ issignal(struct proc *p)
                        psignal(p->p_pptr, SIGCHLD);
                        do {
                                stop(p);
-                               mi_switch();
+                               mi_switch(p);
                        } while (!trace_req(p) && p->p_flag & P_TRACED);
 
                        /*
@@ -1149,7 +1149,7 @@ issignal(struct proc *p)
                                stop(p);
                                if ((p->p_pptr->p_procsig->ps_flag & PS_NOCLDSTOP) == 0)
                                        psignal(p->p_pptr, SIGCHLD);
-                               mi_switch();
+                               mi_switch(p);
                                break;
                        } else if (prop & SA_IGNORE) {
                                /*
index d9a6e4e..3daa272 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_switch.c,v 1.3.2.1 2000/05/16 06:58:12 dillon Exp $
- * $DragonFly: src/sys/kern/Attic/kern_switch.c,v 1.20 2004/03/30 19:14:11 dillon Exp $
+ * $DragonFly: src/sys/kern/Attic/kern_switch.c,v 1.21 2004/04/10 20:55:23 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -675,7 +675,7 @@ acquire_curproc(struct proc *p)
                 * priority.
                 */
                clear_lwkt_resched();
-               lwkt_deschedule_self();
+               lwkt_deschedule_self(curthread);
                p->p_flag &= ~P_CP_RELEASED;
                setrunqueue(p);
                lwkt_switch();
@@ -800,9 +800,9 @@ sched_thread(void *dummy)
     for (;;) {
        struct proc *np;
 
-       lwkt_deschedule_self();         /* interlock */
+       lwkt_deschedule_self(gd->gd_curthread); /* interlock */
        rdyprocmask |= cpumask;
-       crit_enter();
+       crit_enter_quick(gd->gd_curthread);
        if ((curprocmask & cpumask) == 0 && (np = chooseproc(NULL)) != NULL) {
            curprocmask |= cpumask;
            gd->gd_upri = np->p_priority;
@@ -810,7 +810,7 @@ sched_thread(void *dummy)
            lwkt_acquire(np->p_thread);
            lwkt_schedule(np->p_thread);
        }
-       crit_exit();
+       crit_exit_quick(gd->gd_curthread);
        lwkt_switch();
     }
 }
index e96b8ed..aa5d2b4 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_synch.c        8.9 (Berkeley) 5/19/95
  * $FreeBSD: src/sys/kern/kern_synch.c,v 1.87.2.6 2002/10/13 07:29:53 kbyanc Exp $
- * $DragonFly: src/sys/kern/kern_synch.c,v 1.31 2004/03/30 19:14:11 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_synch.c,v 1.32 2004/04/10 20:55:23 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -323,7 +323,7 @@ tsleep(void *ident, int flags, const char *wmesg, int timo)
 {
        struct thread *td = curthread;
        struct proc *p = td->td_proc;           /* may be NULL */
-       int s, sig = 0, catch = flags & PCATCH;
+       int sig = 0, catch = flags & PCATCH;
        int id = LOOKUP(ident);
        struct callout_handle thandle;
 
@@ -342,12 +342,11 @@ tsleep(void *ident, int flags, const char *wmesg, int timo)
                return (0);
        }
        KKASSERT(td != &mycpu->gd_idlethread);  /* you must be kidding! */
-       s = splhigh();
+       crit_enter_quick(td);
        KASSERT(ident != NULL, ("tsleep: no ident"));
        KASSERT(p == NULL || p->p_stat == SRUN, ("tsleep %p %s %d",
                ident, wmesg, p->p_stat));
 
-       crit_enter();
        td->td_wchan = ident;
        td->td_wmesg = wmesg;
        if (p) {
@@ -356,7 +355,7 @@ tsleep(void *ident, int flags, const char *wmesg, int timo)
                release_curproc(p);
                p->p_slptime = 0;
        }
-       lwkt_deschedule_self();
+       lwkt_deschedule_self(td);
        TAILQ_INSERT_TAIL(&slpque[id], td, td_threadq);
        if (timo)
                thandle = timeout(endtsleep, (void *)td, timo);
@@ -375,7 +374,7 @@ tsleep(void *ident, int flags, const char *wmesg, int timo)
                        if ((sig = CURSIG(p))) {
                                if (td->td_wchan) {
                                        unsleep(td);
-                                       lwkt_schedule_self();
+                                       lwkt_schedule_self(td);
                                }
                                p->p_stat = SRUN;
                                goto resume;
@@ -398,16 +397,15 @@ tsleep(void *ident, int flags, const char *wmesg, int timo)
                 */
                clrrunnable(p, SSLEEP);
                p->p_stats->p_ru.ru_nvcsw++;
-               mi_switch();
+               mi_switch(p);
                KASSERT(p->p_stat == SRUN, ("tsleep: stat not srun"));
        } else {
                lwkt_switch();
        }
 resume:
-       crit_exit();
        if (p)
                p->p_flag &= ~P_SINTR;
-       splx(s);
+       crit_exit_quick(td);
        td->td_flags &= ~TDF_NORESCHED;
        if (td->td_flags & TDF_TIMEOUT) {
                td->td_flags &= ~TDF_TIMEOUT;
@@ -444,9 +442,8 @@ endtsleep(void *arg)
 {
        thread_t td = arg;
        struct proc *p;
-       int s;
 
-       s = splhigh();
+       crit_enter();
        if (td->td_wchan) {
                td->td_flags |= TDF_TIMEOUT;
                if ((p = td->td_proc) != NULL) {
@@ -459,7 +456,7 @@ endtsleep(void *arg)
                        lwkt_schedule(td);
                }
        }
-       splx(s);
+       crit_exit();
 }
 
 /*
@@ -468,9 +465,7 @@ endtsleep(void *arg)
 void
 unsleep(struct thread *td)
 {
-       int s;
-
-       s = splhigh();
+       crit_enter();
        if (td->td_wchan) {
 #if 0
                if (p->p_flag & P_XSLEEP) {
@@ -482,7 +477,7 @@ unsleep(struct thread *td)
                TAILQ_REMOVE(&slpque[LOOKUP(td->td_wchan)], td, td_threadq);
                td->td_wchan = NULL;
        }
-       splx(s);
+       crit_exit();
 }
 
 #if 0
@@ -493,9 +488,8 @@ void
 xwakeup(struct xwait *w)
 {
        struct proc *p;
-       int s;
 
-       s = splhigh();
+       crit_enter();
        ++w->gen;
        while ((p = TAILQ_FIRST(&w->waitq)) != NULL) {
                TAILQ_REMOVE(&w->waitq, p, p_procq);
@@ -517,7 +511,7 @@ xwakeup(struct xwait *w)
                        }
                }
        }
-       splx(s);
+       crit_exit();
 }
 #endif
 
@@ -531,10 +525,9 @@ _wakeup(void *ident, int count)
        struct thread *td;
        struct thread *ntd;
        struct proc *p;
-       int s;
        int id = LOOKUP(ident);
 
-       s = splhigh();
+       crit_enter();
        qp = &slpque[id];
 restart:
        for (td = TAILQ_FIRST(qp); td != NULL; td = ntd) {
@@ -563,7 +556,7 @@ restart:
                        goto restart;
                }
        }
-       splx(s);
+       crit_exit();
 }
 
 void
@@ -580,35 +573,19 @@ wakeup_one(void *ident)
 
 /*
  * The machine independent parts of mi_switch().
- * Must be called at splstatclock() or higher.
+ *
+ * 'p' must be the current process.
  */
 void
-mi_switch()
+mi_switch(struct proc *p)
 {
-       struct thread *td = curthread;
-       struct proc *p = td->td_proc;   /* XXX */
+       thread_t td = p->p_thread;
        struct rlimit *rlim;
-       int x;
        u_int64_t ttime;
 
-       /*
-        * XXX this spl is almost unnecessary.  It is partly to allow for
-        * sloppy callers that don't do it (issignal() via CURSIG() is the
-        * main offender).  It is partly to work around a bug in the i386
-        * cpu_switch() (the ipl is not preserved).  We ran for years
-        * without it.  I think there was only a interrupt latency problem.
-        * The main caller, tsleep(), does an splx() a couple of instructions
-        * after calling here.  The buggy caller, issignal(), usually calls
-        * here at spl0() and sometimes returns at splhigh().  The process
-        * then runs for a little too long at splhigh().  The ipl gets fixed
-        * when the process returns to user mode (or earlier).
-        *
-        * It would probably be better to always call here at spl0(). Callers
-        * are prepared to give up control to another process, so they must
-        * be prepared to be interrupted.  The clock stuff here may not
-        * actually need splstatclock().
-        */
-       x = splstatclock();
+       KKASSERT(td == mycpu->gd_curthread);
+
+       crit_enter_quick(td);
 
        /*
         * Check if the process exceeds its cpu resource allocation.
@@ -639,10 +616,9 @@ mi_switch()
         */
        mycpu->gd_cnt.v_swtch++;
        if (p->p_stat == SSTOP)
-               lwkt_deschedule_self();
+               lwkt_deschedule_self(td);
        lwkt_switch();
-
-       splx(x);
+       crit_exit_quick(td);
 }
 
 /*
index 0c19e37..0ea0917 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)kern_time.c 8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/kern/kern_time.c,v 1.68.2.1 2002/10/01 08:00:41 bde Exp $
- * $DragonFly: src/sys/kern/kern_time.c,v 1.14 2004/01/30 05:42:17 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_time.c,v 1.15 2004/04/10 20:55:23 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -250,19 +250,20 @@ nanosleep1(struct timespec *rqt, struct timespec *rmt)
                ticks = tv.tv_usec / tick;      /* approximate */
 
                if (tv.tv_sec == 0 && ticks == 0) {
+                       thread_t td = curthread;
                        if (tried_yield || tv.tv_usec < sleep_hard_us) {
                                tried_yield = 0;
                                uio_yield();
                        } else {
-                               crit_enter();
+                               crit_enter_quick(td);
                                systimer_init_oneshot(&info, ns1_systimer,
-                                               curthread, tv.tv_usec);
-                               lwkt_deschedule_self();
-                               crit_exit();
+                                               td, tv.tv_usec);
+                               lwkt_deschedule_self(td);
+                               crit_exit_quick(td);
                                lwkt_switch();
                                systimer_del(&info); /* make sure it's gone */
                        }
-                       error = iscaught(curproc);
+                       error = iscaught(td->td_proc);
                } else if (tv.tv_sec == 0) {
                        error = tsleep(&nanowait, PCATCH, "nanslp", ticks);
                } else {
index 831d402..a495bb0 100644 (file)
@@ -26,7 +26,7 @@
  * NOTE! This file may be compiled for userland libraries as well as for
  * the kernel.
  *
- * $DragonFly: src/sys/kern/lwkt_msgport.c,v 1.17 2004/04/05 18:49:19 dillon Exp $
+ * $DragonFly: src/sys/kern/lwkt_msgport.c,v 1.18 2004/04/10 20:55:23 dillon Exp $
  */
 
 #ifdef _KERNEL
@@ -328,14 +328,15 @@ lwkt_default_abortport(lwkt_port_t port, lwkt_msg_t msg)
 void *
 lwkt_default_waitport(lwkt_port_t port, lwkt_msg_t msg)
 {
-    KKASSERT(port->mp_td == curthread);
+    thread_t td = curthread;
 
-    crit_enter();
+    KKASSERT(port->mp_td == td);
+    crit_enter_quick(td);
     if (msg == NULL) {
        if ((msg = TAILQ_FIRST(&port->mp_msgq)) == NULL) {
            port->mp_flags |= MSGPORTF_WAITING;
            do {
-               lwkt_deschedule_self();
+               lwkt_deschedule_self(td);
                lwkt_switch();
            } while ((msg = TAILQ_FIRST(&port->mp_msgq)) == NULL);
            port->mp_flags &= ~MSGPORTF_WAITING;
@@ -360,7 +361,7 @@ lwkt_default_waitport(lwkt_port_t port, lwkt_msg_t msg)
            if ((msg->ms_flags & MSGF_DONE) == 0) {
                port->mp_flags |= MSGPORTF_WAITING; /* saved by the BGL */
                do {
-                   lwkt_deschedule_self();
+                   lwkt_deschedule_self(td);
                    lwkt_switch();
                } while ((msg->ms_flags & MSGF_DONE) == 0);
                port->mp_flags &= ~MSGPORTF_WAITING; /* saved by the BGL */
@@ -374,7 +375,7 @@ lwkt_default_waitport(lwkt_port_t port, lwkt_msg_t msg)
            }
        }
     }
-    crit_exit();
+    crit_exit_quick(td);
     return(msg);
 }
 
index de7c2ea..4bde18b 100644 (file)
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.58 2004/03/30 19:14:11 dillon Exp $
+ * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.59 2004/04/10 20:55:23 dillon Exp $
  */
 
 /*
@@ -141,6 +141,41 @@ _lwkt_enqueue(thread_t td)
     }
 }
 
+/*
+ * Schedule a thread to run.  As the current thread we can always safely
+ * schedule ourselves, and a shortcut procedure is provided for that
+ * function.
+ *
+ * (non-blocking, self contained on a per cpu basis)
+ */
+void
+lwkt_schedule_self(thread_t td)
+{
+    crit_enter_quick(td);
+    KASSERT(td->td_wait == NULL, ("lwkt_schedule_self(): td_wait not NULL!"));
+    KASSERT(td != &td->td_gd->gd_idlethread, ("lwkt_schedule_self(): scheduling gd_idlethread is illegal!"));
+    _lwkt_enqueue(td);
+#ifdef _KERNEL
+    if (td->td_proc && td->td_proc->p_stat == SSLEEP)
+       panic("SCHED SELF PANIC");
+#endif
+    crit_exit_quick(td);
+}
+
+/*
+ * Deschedule a thread.
+ *
+ * (non-blocking, self contained on a per cpu basis)
+ */
+void
+lwkt_deschedule_self(thread_t td)
+{
+    crit_enter_quick(td);
+    KASSERT(td->td_wait == NULL, ("lwkt_schedule_self(): td_wait not NULL!"));
+    _lwkt_dequeue(td);
+    crit_exit_quick(td);
+}
+
 #ifdef _KERNEL
 
 /*
@@ -188,20 +223,21 @@ lwkt_alloc_thread(struct thread *td, int cpu)
 {
     void *stack;
     int flags = 0;
+    globaldata_t gd = mycpu;
 
     if (td == NULL) {
-       crit_enter();
-       if (mycpu->gd_tdfreecount > 0) {
-           --mycpu->gd_tdfreecount;
-           td = TAILQ_FIRST(&mycpu->gd_tdfreeq);
+       crit_enter_gd(gd);
+       if (gd->gd_tdfreecount > 0) {
+           --gd->gd_tdfreecount;
+           td = TAILQ_FIRST(&gd->gd_tdfreeq);
            KASSERT(td != NULL && (td->td_flags & TDF_RUNNING) == 0,
                ("lwkt_alloc_thread: unexpected NULL or corrupted td"));
-           TAILQ_REMOVE(&mycpu->gd_tdfreeq, td, td_threadq);
-           crit_exit();
+           TAILQ_REMOVE(&gd->gd_tdfreeq, td, td_threadq);
+           crit_exit_gd(gd);
            stack = td->td_kstack;
            flags = td->td_flags & (TDF_ALLOCATED_STACK|TDF_ALLOCATED_THREAD);
        } else {
-           crit_exit();
+           crit_exit_gd(gd);
 #ifdef _KERNEL
            td = zalloc(thread_zone);
 #else
@@ -257,6 +293,8 @@ lwkt_init_thread_remote(void *arg)
 void
 lwkt_init_thread(thread_t td, void *stack, int flags, struct globaldata *gd)
 {
+    globaldata_t mygd = mycpu;
+
     bzero(td, sizeof(struct thread));
     td->td_kstack = stack;
     td->td_flags |= flags;
@@ -265,17 +303,17 @@ lwkt_init_thread(thread_t td, void *stack, int flags, struct globaldata *gd)
     lwkt_initport(&td->td_msgport, td);
     pmap_init_thread(td);
 #ifdef SMP
-    if (gd == mycpu) {
-       crit_enter();
+    if (gd == mygd) {
+       crit_enter_gd(mygd);
        TAILQ_INSERT_TAIL(&gd->gd_tdallq, td, td_allq);
-       crit_exit();
+       crit_exit_gd(mygd);
     } else {
        lwkt_send_ipiq(gd, lwkt_init_thread_remote, td);
     }
 #else
-    crit_enter();
+    crit_enter_gd(mygd);
     TAILQ_INSERT_TAIL(&gd->gd_tdallq, td, td_allq);
-    crit_exit();
+    crit_exit_gd(mygd);
 #endif
 }
 
@@ -323,16 +361,16 @@ lwkt_free_thread(thread_t td)
     KASSERT((td->td_flags & TDF_RUNNING) == 0,
        ("lwkt_free_thread: did not exit! %p", td));
 
-    crit_enter();
+    crit_enter_gd(gd);
     TAILQ_REMOVE(&gd->gd_tdallq, td, td_allq);
     if (gd->gd_tdfreecount < CACHE_NTHREADS &&
        (td->td_flags & TDF_ALLOCATED_THREAD)
     ) {
        ++gd->gd_tdfreecount;
        TAILQ_INSERT_HEAD(&gd->gd_tdfreeq, td, td_threadq);
-       crit_exit();
+       crit_exit_gd(gd);
     } else {
-       crit_exit();
+       crit_exit_gd(gd);
        if (td->td_kstack && (td->td_flags & TDF_ALLOCATED_STACK)) {
 #ifdef _KERNEL
            kmem_free(kernel_map, (vm_offset_t)td->td_kstack, THREAD_STACK);
@@ -379,8 +417,8 @@ lwkt_free_thread(thread_t td)
 void
 lwkt_switch(void)
 {
-    globaldata_t gd;
-    thread_t td = curthread;
+    globaldata_t gd = mycpu;
+    thread_t td = gd->gd_curthread;
     thread_t ntd;
 #ifdef SMP
     int mpheld;
@@ -390,7 +428,7 @@ lwkt_switch(void)
      * Switching from within a 'fast' (non thread switched) interrupt is
      * illegal.
      */
-    if (mycpu->gd_intr_nesting_level && panicstr == NULL) {
+    if (gd->gd_intr_nesting_level && panicstr == NULL) {
        panic("lwkt_switch: cannot switch from within a fast interrupt, yet\n");
     }
 
@@ -406,7 +444,7 @@ lwkt_switch(void)
     if (td->td_release)
            td->td_release(td);
 
-    crit_enter();
+    crit_enter_gd(gd);
     ++switch_count;
 
 #ifdef SMP
@@ -474,7 +512,6 @@ lwkt_switch(void)
         * We are switching threads.  If there are any pending requests for
         * tokens we can satisfy all of them here.
         */
-       gd = mycpu;
 #ifdef SMP
        if (gd->gd_tokreqbase)
                lwkt_drain_token_requests();
@@ -553,11 +590,10 @@ again:
        ASSERT_MP_LOCK_HELD();
     }
 #endif
-    if (td != ntd) {
+    if (td != ntd)
        td->td_switch(ntd);
-    }
-
-    crit_exit();
+    /* NOTE: current cpu may have changed after switch */
+    crit_exit_quick(td);
 }
 
 /*
@@ -736,7 +772,7 @@ lwkt_yield_quick(void)
     if (untimely_switch && td->td_nest_count == 0 &&
        gd->gd_intr_nesting_level == 0
     ) {
-       crit_enter();
+       crit_enter_quick(td);
        /*
         * YYY temporary hacks until we disassociate the userland scheduler
         * from the LWKT scheduler.
@@ -744,9 +780,9 @@ lwkt_yield_quick(void)
        if (td->td_flags & TDF_RUNQ) {
            lwkt_switch();              /* will not reenter yield function */
        } else {
-           lwkt_schedule_self();       /* make sure we are scheduled */
+           lwkt_schedule_self(td);     /* make sure we are scheduled */
            lwkt_switch();              /* will not reenter yield function */
-           lwkt_deschedule_self();     /* make sure we are descheduled */
+           lwkt_deschedule_self(td);   /* make sure we are descheduled */
        }
        crit_exit_noyield(td);
     }
@@ -762,33 +798,10 @@ lwkt_yield_quick(void)
 void
 lwkt_yield(void)
 {
-    lwkt_schedule_self();
+    lwkt_schedule_self(curthread);
     lwkt_switch();
 }
 
-/*
- * Schedule a thread to run.  As the current thread we can always safely
- * schedule ourselves, and a shortcut procedure is provided for that
- * function.
- *
- * (non-blocking, self contained on a per cpu basis)
- */
-void
-lwkt_schedule_self(void)
-{
-    thread_t td = curthread;
-
-    crit_enter_quick(td);
-    KASSERT(td->td_wait == NULL, ("lwkt_schedule_self(): td_wait not NULL!"));
-    KASSERT(td != &td->td_gd->gd_idlethread, ("lwkt_schedule_self(): scheduling gd_idlethread is illegal!"));
-    _lwkt_enqueue(td);
-#ifdef _KERNEL
-    if (td->td_proc && td->td_proc->p_stat == SSLEEP)
-       panic("SCHED SELF PANIC");
-#endif
-    crit_exit_quick(td);
-}
-
 /*
  * Generic schedule.  Possibly schedule threads belonging to other cpus and
  * deal with threads that might be blocked on a wait queue.
@@ -815,6 +828,8 @@ _lwkt_schedule_post(thread_t ntd, int cpri)
 void
 lwkt_schedule(thread_t td)
 {
+    globaldata_t mygd = mycpu;
+
 #ifdef INVARIANTS
     KASSERT(td != &td->td_gd->gd_idlethread, ("lwkt_schedule(): scheduling gd_idlethread is illegal!"));
     if ((td->td_flags & TDF_PREEMPT_LOCK) == 0 && td->td_proc 
@@ -831,8 +846,8 @@ lwkt_schedule(thread_t td)
        panic("SCHED PANIC");
     }
 #endif
-    crit_enter();
-    if (td == curthread) {
+    crit_enter_gd(mygd);
+    if (td == mygd->gd_curthread) {
        _lwkt_enqueue(td);
     } else {
        lwkt_wait_t w;
@@ -881,7 +896,7 @@ lwkt_schedule(thread_t td)
             * target cpu will deal with it.
             */
 #ifdef SMP
-           if (td->td_gd == mycpu) {
+           if (td->td_gd == mygd) {
                _lwkt_enqueue(td);
                _lwkt_schedule_post(td, TDPRI_CRIT);
            } else {
@@ -893,7 +908,7 @@ lwkt_schedule(thread_t td)
 #endif
        }
     }
-    crit_exit();
+    crit_exit_gd(mygd);
 }
 
 /*
@@ -907,38 +922,23 @@ lwkt_schedule(thread_t td)
 void
 lwkt_acquire(thread_t td)
 {
-    struct globaldata *gd;
+    globaldata_t gd;
+    globaldata_t mygd;
 
     gd = td->td_gd;
+    mygd = mycpu;
     KKASSERT((td->td_flags & TDF_RUNQ) == 0);
     while (td->td_flags & TDF_RUNNING) /* XXX spin */
        ;
-    if (gd != mycpu) {
-       crit_enter();
+    if (gd != mygd) {
+       crit_enter_gd(mygd);
        TAILQ_REMOVE(&gd->gd_tdallq, td, td_allq);      /* protected by BGL */
-       gd = mycpu;
-       td->td_gd = gd;
-       TAILQ_INSERT_TAIL(&gd->gd_tdallq, td, td_allq); /* protected by BGL */
-       crit_exit();
+       td->td_gd = mygd;
+       TAILQ_INSERT_TAIL(&mygd->gd_tdallq, td, td_allq); /* protected by BGL */
+       crit_exit_gd(mygd);
     }
 }
 
-/*
- * Deschedule a thread.
- *
- * (non-blocking, self contained on a per cpu basis)
- */
-void
-lwkt_deschedule_self(void)
-{
-    thread_t td = curthread;
-
-    crit_enter();
-    KASSERT(td->td_wait == NULL, ("lwkt_schedule_self(): td_wait not NULL!"));
-    _lwkt_dequeue(td);
-    crit_exit();
-}
-
 /*
  * Generic deschedule.  Descheduling threads other then your own should be
  * done only in carefully controlled circumstances.  Descheduling is 
@@ -1144,8 +1144,8 @@ lwkt_exit(void)
     if (td->td_flags & TDF_VERBOSE)
        printf("kthread %p %s has exited\n", td, td->td_comm);
     caps_exit(td);
-    crit_enter();
-    lwkt_deschedule_self();
+    crit_enter_quick(td);
+    lwkt_deschedule_self(td);
     ++mycpu->gd_tdfreecount;
     TAILQ_INSERT_TAIL(&mycpu->gd_tdfreeq, td, td_threadq);
     cpu_thread_exit();
index e68d641..140bac9 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)trap.c        7.4 (Berkeley) 5/13/91
  * $FreeBSD: src/sys/i386/i386/trap.c,v 1.147.2.11 2003/02/27 19:09:59 luoqi Exp $
- * $DragonFly: src/sys/platform/pc32/i386/trap.c,v 1.48 2004/03/30 19:14:04 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/trap.c,v 1.49 2004/04/10 20:55:20 dillon Exp $
  */
 
 /*
@@ -222,8 +222,14 @@ userexit(struct proc *p)
        acquire_curproc(p);
 }
 
+/*
+ * userret() handles signals, upcalls, and deals with system profiling
+ * charges.  Note that td_sticks is a 64 bit quantity, but there's no
+ * point doing 64 arithmatic on the delta calculation so the absolute
+ * tick values are truncated to an integer.
+ */
 static void
-userret(struct proc *p, struct trapframe *frame, u_quad_t oticks)
+userret(struct proc *p, struct trapframe *frame, int sticks)
 {
        int sig;
 
@@ -258,7 +264,7 @@ userret(struct proc *p, struct trapframe *frame, u_quad_t oticks)
         */
        if (p->p_flag & P_PROFIL) {
                addupc_task(p, frame->tf_eip, 
-                   (u_int)(curthread->td_sticks - oticks));
+                       (u_int)((int)p->p_thread->td_sticks - sticks));
        }
 
        /*
@@ -292,7 +298,7 @@ trap(frame)
 {
        struct thread *td = curthread;
        struct proc *p;
-       u_quad_t sticks = 0;
+       int sticks = 0;
        int i = 0, ucode = 0, type, code;
        vm_offset_t eva;
 
@@ -368,11 +374,11 @@ restart:
                if (frame.tf_eflags & PSL_VM &&
                    (type == T_PROTFLT || type == T_STKFLT)) {
 #ifdef SMP
-                       KKASSERT(curthread->td_mpcount > 0);
+                       KKASSERT(td->td_mpcount > 0);
 #endif
                        i = vm86_emulate((struct vm86frame *)&frame);
 #ifdef SMP
-                       KKASSERT(curthread->td_mpcount > 0);
+                       KKASSERT(td->td_mpcount > 0);
 #endif
                        if (i != 0) {
                                /*
@@ -404,7 +410,7 @@ restart:
 
                userenter(td);
 
-               sticks = curthread->td_sticks;
+               sticks = (int)td->td_sticks;
                p->p_md.md_regs = &frame;
 
                switch (type) {
@@ -587,7 +593,7 @@ kernel_trap:
                         * nesting level check.
                         */
                        if (frame.tf_eip == (int)cpu_switch_load_gs) {
-                               curthread->td_pcb->pcb_gs = 0;
+                               td->td_pcb->pcb_gs = 0;
                                psignal(p, SIGBUS);
                                goto out2;
                        }
@@ -609,8 +615,9 @@ kernel_trap:
                                                   doreti_popl_es_fault);
                                MAYBE_DORETI_FAULT(doreti_popl_fs,
                                                   doreti_popl_fs_fault);
-                               if (curthread->td_pcb->pcb_onfault) {
-                                       frame.tf_eip = (int)curthread->td_pcb->pcb_onfault;
+                               if (td->td_pcb->pcb_onfault) {
+                                       frame.tf_eip = 
+                                           (register_t)td->td_pcb->pcb_onfault;
                                        goto out2;
                                }
                        }
@@ -745,13 +752,13 @@ kernel_trap:
 out:
 #ifdef SMP
         if (ISPL(frame.tf_cs) == SEL_UPL)
-               KASSERT(curthread->td_mpcount == 1, ("badmpcount trap from %p", (void *)frame.tf_eip));
+               KASSERT(td->td_mpcount == 1, ("badmpcount trap from %p", (void *)frame.tf_eip));
 #endif
        userret(p, &frame, sticks);
        userexit(p);
 out2:
 #ifdef SMP
-       KKASSERT(curthread->td_mpcount > 0);
+       KKASSERT(td->td_mpcount > 0);
 #endif
        rel_mplock();
 }
@@ -775,7 +782,8 @@ trap_pfault(frame, usermode, eva)
        vm_map_t map = 0;
        int rv = 0;
        vm_prot_t ftype;
-       struct proc *p = curproc;
+       thread_t td = curthread;
+       struct proc *p = td->td_proc;   /* may be NULL */
 
        if (frame->tf_err & PGEX_W)
                ftype = VM_PROT_WRITE;
@@ -789,8 +797,8 @@ trap_pfault(frame, usermode, eva)
 
                if (p == NULL ||
                    (!usermode && va < VM_MAXUSER_ADDRESS &&
-                    (mycpu->gd_intr_nesting_level != 0 || 
-                     curthread->td_pcb->pcb_onfault == NULL))) {
+                    (td->td_gd->gd_intr_nesting_level != 0 || 
+                     td->td_pcb->pcb_onfault == NULL))) {
                        trap_fatal(frame, eva);
                        return (-1);
                }
@@ -852,8 +860,9 @@ trap_pfault(frame, usermode, eva)
                return (0);
 nogo:
        if (!usermode) {
-               if (mycpu->gd_intr_nesting_level == 0 && curthread->td_pcb->pcb_onfault) {
-                       frame->tf_eip = (int)curthread->td_pcb->pcb_onfault;
+               if (mtd->td_gd->gd_intr_nesting_level == 0 && 
+                   td->td_pcb->pcb_onfault) {
+                       frame->tf_eip = (register_t)td->td_pcb->pcb_onfault;
                        return (0);
                }
                trap_fatal(frame, eva);
@@ -878,7 +887,8 @@ trap_pfault(frame, usermode, eva)
        vm_map_t map = 0;
        int rv = 0;
        vm_prot_t ftype;
-       struct proc *p = curproc;
+       thread_t td = curthread;
+       struct proc *p = td->td_proc;
 
        va = trunc_page(eva);
        if (va >= KERNBASE) {
@@ -959,8 +969,9 @@ trap_pfault(frame, usermode, eva)
                return (0);
 nogo:
        if (!usermode) {
-               if (mycpu->gd_intr_nesting_level == 0 && curthread->td_pcb->pcb_onfault) {
-                       frame->tf_eip = (int)curthread->td_pcb->pcb_onfault;
+               if (td->td_gd->gd_intr_nesting_level == 0 &&
+                   td->td_pcb->pcb_onfault) {
+                       frame->tf_eip = (register_t)td->td_pcb->pcb_onfault;
                        return (0);
                }
                trap_fatal(frame, eva);
@@ -1173,7 +1184,7 @@ syscall2(struct trapframe frame)
        int i;
        struct sysent *callp;
        register_t orig_tf_eflags;
-       u_quad_t sticks;
+       int sticks;
        int error;
        int narg;
        u_int code;
@@ -1188,18 +1199,12 @@ syscall2(struct trapframe frame)
 #endif
 
 #ifdef SMP
-       KASSERT(curthread->td_mpcount == 0, ("badmpcount syscall from %p", (void *)frame.tf_eip));
+       KASSERT(td->td_mpcount == 0, ("badmpcount syscall from %p", (void *)frame.tf_eip));
        get_mplock();
 #endif
-       /*
-        * access non-atomic field from critical section.  p_sticks is
-        * updated by the clock interrupt.  Also use this opportunity
-        * to lazy-raise our LWKT priority.
-        */
-       userenter(td);
-       crit_enter_quick(td);
-       sticks = curthread->td_sticks;
-       crit_exit_quick(td);
+       userenter(td);          /* lazy raise our priority */
+
+       sticks = (int)td->td_sticks;
 
        p->p_md.md_regs = &frame;
        params = (caddr_t)frame.tf_esp + sizeof(int);
@@ -1355,7 +1360,7 @@ bad:
        /*
         * Release the MP lock if we had to get it
         */
-       KASSERT(curthread->td_mpcount == 1, ("badmpcount syscall from %p", (void *)frame.tf_eip));
+       KASSERT(td->td_mpcount == 1, ("badmpcount syscall from %p", (void *)frame.tf_eip));
        rel_mplock();
 #endif
 }
@@ -1373,7 +1378,7 @@ sendsys2(struct trapframe frame)
        struct sysent *callp;
        union sysunion *sysun;
        lwkt_msg_t umsg;
-       u_quad_t sticks;
+       int sticks;
        int error;
        int narg;
        u_int code = 0;
@@ -1389,7 +1394,7 @@ sendsys2(struct trapframe frame)
 #endif
 
 #ifdef SMP
-       KASSERT(curthread->td_mpcount == 0, ("badmpcount syscall from %p", (void *)frame.tf_eip));
+       KASSERT(td->td_mpcount == 0, ("badmpcount syscall from %p", (void *)frame.tf_eip));
        get_mplock();
 #endif
        /*
@@ -1398,9 +1403,7 @@ sendsys2(struct trapframe frame)
         * to lazy-raise our LWKT priority.
         */
        userenter(td);
-       crit_enter_quick(td);
-       sticks = curthread->td_sticks;
-       crit_exit_quick(td);
+       sticks = td->td_sticks;
 
        p->p_md.md_regs = &frame;
        orig_tf_eflags = frame.tf_eflags;
@@ -1632,7 +1635,7 @@ good:
        /*
         * Release the MP lock if we had to get it
         */
-       KASSERT(curthread->td_mpcount == 1, ("badmpcount syscall from %p", (void *)frame.tf_eip));
+       KASSERT(td->td_mpcount == 1, ("badmpcount syscall from %p", (void *)frame.tf_eip));
        rel_mplock();
 #endif
 }
@@ -1661,7 +1664,7 @@ fork_return(p, frame)
        userexit(p);
        p->p_flag &= ~P_PASSIVE_ACQ;
 #ifdef SMP
-       KKASSERT(curthread->td_mpcount == 1);
+       KKASSERT(p->p_thread->td_mpcount == 1);
        rel_mplock();
 #endif
 }
index d2eac1c..c21ad93 100644 (file)
@@ -39,7 +39,7 @@
  *     from: @(#)vm_machdep.c  7.3 (Berkeley) 5/13/91
  *     Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$
  * $FreeBSD: src/sys/i386/i386/vm_machdep.c,v 1.132.2.9 2003/01/25 19:02:23 dillon Exp $
- * $DragonFly: src/sys/platform/pc32/i386/vm_machdep.c,v 1.28 2004/03/29 17:30:23 drhodus Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/vm_machdep.c,v 1.29 2004/04/10 20:55:20 dillon Exp $
  */
 
 #include "use_npx.h"
@@ -271,10 +271,10 @@ cpu_proc_exit(void)
                 reset_dbregs();
                 pcb->pcb_flags &= ~PCB_DBREGS;
         }
-       mycpu->gd_cnt.v_swtch++;
+       td->td_gd->gd_cnt.v_swtch++;
 
-       crit_enter();
-       lwkt_deschedule_self();
+       crit_enter_quick(td);
+       lwkt_deschedule_self(td);
        cpu_thread_exit();
 }
 
index ae44c5f..b399c5f 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     from: @(#)isa.c 7.2 (Berkeley) 5/13/91
  * $FreeBSD: src/sys/i386/isa/intr_machdep.c,v 1.29.2.5 2001/10/14 06:54:27 luigi Exp $
- * $DragonFly: src/sys/platform/pc32/isa/intr_machdep.c,v 1.21 2004/03/30 19:14:08 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/isa/intr_machdep.c,v 1.22 2004/04/10 20:55:22 dillon Exp $
  */
 /*
  * This file contains an aggregated module marked:
@@ -1022,14 +1022,17 @@ ithread_done(int irq)
 {
     struct mdglobaldata *gd = mdcpu;
     int mask = 1 << irq;
+    thread_t td;
 
-    KKASSERT(curthread->td_pri >= TDPRI_CRIT);
-    lwkt_deschedule_self();
+    td = gd->mi.gd_curthread;
+
+    KKASSERT(td->td_pri >= TDPRI_CRIT);
+    lwkt_deschedule_self(td);
     INTREN(mask);
     if (gd->gd_ipending & mask) {
        atomic_clear_int_nonlocked(&gd->gd_ipending, mask);
        INTRDIS(mask);
-       lwkt_schedule_self();
+       lwkt_schedule_self(td);
     } else {
        lwkt_switch();
     }
index 0cbe349..9eed0c4 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)proc.h      8.15 (Berkeley) 5/19/95
  * $FreeBSD: src/sys/sys/proc.h,v 1.99.2.9 2003/06/06 20:21:32 tegge Exp $
- * $DragonFly: src/sys/sys/proc.h,v 1.47 2004/03/30 19:14:13 dillon Exp $
+ * $DragonFly: src/sys/sys/proc.h,v 1.48 2004/04/10 20:55:24 dillon Exp $
  */
 
 #ifndef _SYS_PROC_H_
@@ -424,7 +424,7 @@ int enterpgrp (struct proc *p, pid_t pgid, int mksess);
 void   fixjobc (struct proc *p, struct pgrp *pgrp, int entering);
 int    inferior (struct proc *p);
 int    leavepgrp (struct proc *p);
-void   mi_switch (void);
+void   mi_switch (struct proc *p);
 void   procinit (void);
 void   relscurproc(struct proc *curp);
 int    p_trespass (struct ucred *cr1, struct ucred *cr2);
index 6a15545..e176807 100644 (file)
@@ -7,7 +7,7 @@
  * Types which must already be defined when this header is included by
  * userland:   struct md_thread
  * 
- * $DragonFly: src/sys/sys/thread.h,v 1.50 2004/03/31 20:23:40 dillon Exp $
+ * $DragonFly: src/sys/sys/thread.h,v 1.51 2004/04/10 20:55:24 dillon Exp $
  */
 
 #ifndef _SYS_THREAD_H_
@@ -320,9 +320,9 @@ extern void lwkt_gdinit(struct globaldata *gd);
 extern void lwkt_switch(void);
 extern void lwkt_preempt(thread_t ntd, int critpri);
 extern void lwkt_schedule(thread_t td);
-extern void lwkt_schedule_self(void);
+extern void lwkt_schedule_self(thread_t td);
 extern void lwkt_deschedule(thread_t td);
-extern void lwkt_deschedule_self(void);
+extern void lwkt_deschedule_self(thread_t td);
 extern void lwkt_acquire(thread_t td);
 extern void lwkt_yield(void);
 extern void lwkt_yield_quick(void);
index 84f9328..f94ea71 100644 (file)
@@ -8,7 +8,7 @@
  *     on a different cpu will not be immediately scheduled by a yield() on
  *     this cpu.
  *
- * $DragonFly: src/sys/sys/thread2.h,v 1.13 2004/03/01 06:33:19 dillon Exp $
+ * $DragonFly: src/sys/sys/thread2.h,v 1.14 2004/04/10 20:55:24 dillon Exp $
  */
 
 #ifndef _SYS_THREAD2_H_
@@ -55,6 +55,12 @@ crit_enter_quick(struct thread *curtd)
     curtd->td_pri += TDPRI_CRIT;
 }
 
+static __inline void
+crit_enter_gd(globaldata_t mygd)
+{
+    crit_enter_quick(mygd->gd_curthread);
+}
+
 static __inline void
 crit_exit_noyield(struct thread *curtd)
 {
@@ -87,6 +93,12 @@ crit_exit_quick(struct thread *curtd)
        lwkt_yield_quick();
 }
 
+static __inline void
+crit_exit_gd(globaldata_t mygd)
+{
+    crit_exit_quick(mygd->gd_curthread);
+}
+
 static __inline int
 crit_panic_save(void)
 {