Fix a minor bug in lwkt_init_thread() (the thread was being added to the
authorMatthew Dillon <dillon@dragonflybsd.org>
Fri, 25 Jul 2003 05:26:52 +0000 (05:26 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Fri, 25 Jul 2003 05:26:52 +0000 (05:26 +0000)
wrong td_allq).

Remove thread->td_cpu.  thread->td_gd (which points to the globaldata
structure) is sufficient.  Add e_cpuid to eproc to compensate.

sys/kern/kern_intr.c
sys/kern/kern_proc.c
sys/kern/kern_sig.c
sys/kern/kern_switch.c
sys/kern/lwkt_msgport.c
sys/kern/lwkt_thread.c
sys/sys/thread.h
sys/sys/user.h

index c1d5705..e045c6e 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_intr.c,v 1.24.2.1 2001/10/14 20:05:50 luigi Exp $
- * $DragonFly: src/sys/kern/kern_intr.c,v 1.9 2003/07/11 01:23:24 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_intr.c,v 1.10 2003/07/25 05:26:50 dillon Exp $
  *
  */
 
@@ -201,11 +201,11 @@ sched_ithd(int intr)
        if (intlists[intr] == NULL) {
            printf("sched_ithd: stray interrupt %d\n", intr);
        } else {
-           if (td->td_cpu == mycpu->gd_cpuid) {
+           if (td->td_gd == mycpu) {
                irunning[intr] = 1;
                lwkt_schedule(td);      /* preemption handled internally */
            } else {
-               lwkt_send_ipiq(td->td_cpu, sched_ithd_remote, (void *)intr);
+               lwkt_send_ipiq(td->td_gd->gd_cpuid, sched_ithd_remote, (void *)intr);
            }
        }
     } else {
index 1307721..06923d2 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)kern_proc.c 8.7 (Berkeley) 2/14/95
  * $FreeBSD: src/sys/kern/kern_proc.c,v 1.63.2.9 2003/05/08 07:47:16 kbyanc Exp $
- * $DragonFly: src/sys/kern/kern_proc.c,v 1.9 2003/06/30 23:54:02 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_proc.c,v 1.10 2003/07/25 05:26:50 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -364,6 +364,7 @@ fill_eproc_td(thread_t td, struct eproc *ep, struct proc *xp)
        ep->e_sticks = td->td_sticks;
        ep->e_iticks = td->td_iticks;
        ep->e_tdev = NOUDEV;
+       ep->e_cpuid = td->td_gd->gd_cpuid;
        if (td->td_wmesg) {
                strncpy(ep->e_wmesg, td->td_wmesg, WMESGLEN);
                ep->e_wmesg[WMESGLEN] = 0;
index a18c00f..2b13e5b 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.12 2003/07/24 01:41:25 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_sig.c,v 1.13 2003/07/25 05:26:50 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -1075,9 +1075,10 @@ psignal(p, sig)
                if (p == lwkt_preempted_proc()) {
                        signotify();
                } else {
-                       int cpuid = p->p_thread->td_cpu;
-                       if (cpuid != mycpu->gd_cpuid)
-                               lwkt_send_ipiq(cpuid, signotify_remote, p);
+                       struct thread *td = p->p_thread;
+
+                       if (td->td_gd != mycpu)
+                               lwkt_send_ipiq(td->td_gd->gd_cpuid, signotify_remote, p);
                }
 #else
                if (p == lwkt_preempted_proc())
index 6749674..6ad37fc 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.8 2003/07/11 17:42:10 dillon Exp $
+ * $DragonFly: src/sys/kern/Attic/kern_switch.c,v 1.9 2003/07/25 05:26:50 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -76,7 +76,7 @@ static int usched_optimal;
 SYSCTL_INT(_debug, OID_AUTO, usched_optimal, CTLFLAG_RW,
         &usched_optimal, 0, "Passive Release was nonoptimal");
 
-#define USCHED_COUNTER(td)     ((td->td_cpu == mycpu->gd_cpuid) ? ++usched_optimal : ++usched_steal)
+#define USCHED_COUNTER(td)     ((td->td_gd == mycpu) ? ++usched_optimal : ++usched_steal)
 
 /*
  * Initialize the run queues at boot time.
@@ -341,11 +341,11 @@ release_curproc(struct proc *p)
        struct proc *np;
 
 #ifdef ONLY_ONE_USER_CPU
-       KKASSERT(mycpu->gd_cpuid == 0 && p->p_thread->td_cpu == 0);
+       KKASSERT(mycpu->gd_cpuid == 0 && p->p_thread->td_gd == mycpu);
 #endif
        crit_enter();
        clear_resched();
-       cpuid = p->p_thread->td_cpu;
+       cpuid = p->p_thread->td_gd->gd_cpuid;
        p->p_flag |= P_CP_RELEASED;
        if (p->p_flag & P_CURPROC) {
                p->p_flag &= ~P_CURPROC;
@@ -405,12 +405,12 @@ acquire_curproc(struct proc *p)
         * will mess w/ this proc?  Or will it?  What about curprocmask?
         */
 #ifdef ONLY_ONE_USER_CPU
-       KKASSERT(mycpu->gd_cpuid == 0 && p->p_thread->td_cpu == 0);
+       KKASSERT(mycpu->gd_cpuid == 0 && p->p_thread->td_gd == mycpu);
 #endif
        crit_enter();
        p->p_flag &= ~P_CP_RELEASED;
        while ((p->p_flag & P_CURPROC) == 0) {
-               cpuid = p->p_thread->td_cpu;    /* load/reload cpuid */
+               cpuid = p->p_thread->td_gd->gd_cpuid;   /* load/reload cpuid */
                if ((curprocmask & (1 << cpuid)) == 0) {
                        curprocmask |= 1 << cpuid;
                        if ((np = chooseproc()) != NULL) {
index 6d882b3..3f172fc 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_msgport.c,v 1.3 2003/07/24 23:52:38 dillon Exp $
+ * $DragonFly: src/sys/kern/lwkt_msgport.c,v 1.4 2003/07/25 05:26:50 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -222,13 +222,13 @@ _lwkt_replyport(lwkt_port_t port, lwkt_msg_t msg)
 {
     thread_t td = port->mp_td;
 
-    if (td->td_cpu == mycpu->gd_cpuid) {
+    if (td->td_gd == mycpu) {
        TAILQ_INSERT_TAIL(&port->mp_msgq, msg, ms_node);
        msg->ms_flags |= MSGF_DONE | MSGF_REPLY | MSGF_QUEUED;
        if (port->mp_flags & MSGPORTF_WAITING)
            lwkt_schedule(td);
     } else {
-       lwkt_send_ipiq(td->td_cpu, (ipifunc_t)lwkt_replyport_remote, msg);
+       lwkt_send_ipiq(td->td_gd->gd_cpuid, (ipifunc_t)lwkt_replyport_remote, msg);
     }
 }
 
@@ -270,14 +270,14 @@ _lwkt_putport(lwkt_port_t port, lwkt_msg_t msg)
 {
     thread_t td = port->mp_td;
 
-    if (td->td_cpu == mycpu->gd_cpuid) {
+    if (td->td_gd == mycpu) {
        TAILQ_INSERT_TAIL(&port->mp_msgq, msg, ms_node);
        msg->ms_flags |= MSGF_QUEUED;
        if (port->mp_flags & MSGPORTF_WAITING)
            lwkt_schedule(td);
     } else {
        msg->ms_target_port = port;
-       lwkt_send_ipiq(td->td_cpu, (ipifunc_t)lwkt_putport_remote, msg);
+       lwkt_send_ipiq(td->td_gd->gd_cpuid, (ipifunc_t)lwkt_putport_remote, msg);
     }
 }
 
@@ -320,7 +320,7 @@ _lwkt_abortport(lwkt_port_t port)
     thread_t td = port->mp_td;
     lwkt_msg_t msg;
 
-    if (td->td_cpu == mycpu->gd_cpuid) {
+    if (td->td_gd == mycpu) {
 again:
        msg = TAILQ_FIRST(&port->mp_msgq);
        while (msg) {
@@ -333,7 +333,7 @@ again:
            msg = TAILQ_NEXT(msg, ms_node);
        }
     } else {
-       lwkt_send_ipiq(td->td_cpu, (ipifunc_t)lwkt_abortport_remote, port);
+       lwkt_send_ipiq(td->td_gd->gd_cpuid, (ipifunc_t)lwkt_abortport_remote, port);
     }
 }
 
index 346e02f..ade1ef9 100644 (file)
@@ -28,7 +28,7 @@
  *     to use a critical section to avoid problems.  Foreign thread 
  *     scheduling is queued via (async) IPIs.
  *
- * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.26 2003/07/20 07:46:18 dillon Exp $
+ * $DragonFly: src/sys/kern/lwkt_thread.c,v 1.27 2003/07/25 05:26:50 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -188,6 +188,7 @@ lwkt_alloc_thread(struct thread *td)
  * lwkt_alloc_thread() and also used to initialize the per-cpu idlethread.
  *
  * NOTE!  called from low level boot code, we cannot do anything fancy!
+ * Only the low level boot code will call this function with gd != mycpu.
  */
 void
 lwkt_init_thread(thread_t td, void *stack, int flags, struct globaldata *gd)
@@ -197,11 +198,10 @@ lwkt_init_thread(thread_t td, void *stack, int flags, struct globaldata *gd)
     td->td_flags |= flags;
     td->td_gd = gd;
     td->td_pri = TDPRI_CRIT;
-    td->td_cpu = gd->gd_cpuid; /* YYY don't really need this if have td_gd */
     lwkt_init_port(&td->td_msgport, td);
     pmap_init_thread(td);
     crit_enter();
-    TAILQ_INSERT_TAIL(&mycpu->gd_tdallq, td, td_allq);
+    TAILQ_INSERT_TAIL(&gd->gd_tdallq, td, td_allq);
     crit_exit();
 }
 
@@ -511,7 +511,7 @@ lwkt_preempt(thread_t ntd, int critpri)
        return;
     }
 #ifdef SMP
-    if (ntd->td_cpu != mycpu->gd_cpuid) {
+    if (ntd->td_gd != mycpu) {
        ++preempt_miss;
        return;
     }
@@ -697,7 +697,7 @@ lwkt_schedule(thread_t td)
                TAILQ_REMOVE(&w->wa_waitq, td, td_threadq);
                --w->wa_count;
                td->td_wait = NULL;
-               if (td->td_cpu == mycpu->gd_cpuid) {
+               if (td->td_gd == mycpu) {
                    _lwkt_enqueue(td);
                    if (td->td_preemptable) {
                        td->td_preemptable(td, TDPRI_CRIT*2); /* YYY +token */
@@ -705,7 +705,7 @@ lwkt_schedule(thread_t td)
                        need_resched();
                    }
                } else {
-                   lwkt_send_ipiq(td->td_cpu, (ipifunc_t)lwkt_schedule, td);
+                   lwkt_send_ipiq(td->td_gd->gd_cpuid, (ipifunc_t)lwkt_schedule, td);
                }
                lwkt_reltoken(&w->wa_token);
            } else {
@@ -718,7 +718,7 @@ lwkt_schedule(thread_t td)
             * do not own the thread there might be a race but the
             * target cpu will deal with it.
             */
-           if (td->td_cpu == mycpu->gd_cpuid) {
+           if (td->td_gd == mycpu) {
                _lwkt_enqueue(td);
                if (td->td_preemptable) {
                    td->td_preemptable(td, TDPRI_CRIT);
@@ -726,7 +726,7 @@ lwkt_schedule(thread_t td)
                    need_resched();
                }
            } else {
-               lwkt_send_ipiq(td->td_cpu, (ipifunc_t)lwkt_schedule, td);
+               lwkt_send_ipiq(td->td_gd->gd_cpuid, (ipifunc_t)lwkt_schedule, td);
            }
        }
     }
@@ -745,19 +745,16 @@ void
 lwkt_acquire(thread_t td)
 {
     struct globaldata *gd;
-    int ocpu;
 
     gd = td->td_gd;
     KKASSERT((td->td_flags & TDF_RUNQ) == 0);
     while (td->td_flags & TDF_RUNNING) /* XXX spin */
        ;
     if (gd != mycpu) {
-       ocpu = td->td_cpu;
        crit_enter();
        TAILQ_REMOVE(&gd->gd_tdallq, td, td_allq);      /* protected by BGL */
        gd = mycpu;
        td->td_gd = gd;
-       td->td_cpu = gd->gd_cpuid;
        TAILQ_INSERT_TAIL(&gd->gd_tdallq, td, td_allq); /* protected by BGL */
        crit_exit();
     }
@@ -793,10 +790,10 @@ lwkt_deschedule(thread_t td)
     if (td == curthread) {
        _lwkt_dequeue(td);
     } else {
-       if (td->td_cpu == mycpu->gd_cpuid) {
+       if (td->td_gd == mycpu) {
            _lwkt_dequeue(td);
        } else {
-           lwkt_send_ipiq(td->td_cpu, (ipifunc_t)lwkt_deschedule, td);
+           lwkt_send_ipiq(td->td_gd->gd_cpuid, (ipifunc_t)lwkt_deschedule, td);
        }
     }
     crit_exit();
@@ -815,7 +812,7 @@ void
 lwkt_setpri(thread_t td, int pri)
 {
     KKASSERT(pri >= 0);
-    KKASSERT(td->td_cpu == mycpu->gd_cpuid);
+    KKASSERT(td->td_gd == mycpu);
     crit_enter();
     if (td->td_flags & TDF_RUNQ) {
        _lwkt_dequeue(td);
@@ -921,10 +918,10 @@ lwkt_signal(lwkt_wait_t w, int count)
        TAILQ_REMOVE(&w->wa_waitq, td, td_threadq);
        td->td_wait = NULL;
        td->td_wmesg = NULL;
-       if (td->td_cpu == mycpu->gd_cpuid) {
+       if (td->td_gd == mycpu) {
            _lwkt_enqueue(td);
        } else {
-           lwkt_send_ipiq(td->td_cpu, (ipifunc_t)lwkt_schedule, td);
+           lwkt_send_ipiq(td->td_gd->gd_cpuid, (ipifunc_t)lwkt_schedule, td);
        }
        lwkt_regettoken(&w->wa_token);
     }
index b764c09..7e463ec 100644 (file)
@@ -4,7 +4,7 @@
  *     Implements the architecture independant portion of the LWKT 
  *     subsystem.
  * 
- * $DragonFly: src/sys/sys/thread.h,v 1.27 2003/07/24 23:52:39 dillon Exp $
+ * $DragonFly: src/sys/sys/thread.h,v 1.28 2003/07/25 05:26:52 dillon Exp $
  */
 
 #ifndef _SYS_THREAD_H_
@@ -112,11 +112,10 @@ typedef struct lwkt_rwlock {
 
 /*
  * Thread structure.  Note that ownership of a thread structure is special
- * cased and there is no 'token'.  A thread is always owned by td_cpu and
- * any manipulation of the thread by some other cpu must be done through
- * cpu_*msg() functions.  e.g. you could request ownership of a thread that
- * way, or hand a thread off to another cpu by changing td_cpu and sending
- * a schedule request to the other cpu.
+ * cased and there is no 'token'.  A thread is always owned by the cpu
+ * represented by td_gd, any manipulation of the thread by some other cpu
+ * must be done through cpu_*msg() functions.  e.g. you could request
+ * ownership of a thread that way, or hand a thread off to another cpu.
  *
  * NOTE: td_pri is bumped by TDPRI_CRIT when entering a critical section,
  * but this does not effect how the thread is scheduled by LWKT.
@@ -132,7 +131,6 @@ struct thread {
     struct globaldata *td_gd;  /* associated with this cpu */
     const char *td_wmesg;      /* string name for blockage */
     void       *td_wchan;      /* waiting on channel */
-    int                td_cpu;         /* cpu owning the thread */
     int                td_pri;         /* 0-31, 31=highest priority (note 1) */
     int                td_flags;       /* THF flags */
     int                td_gen;         /* wait queue chasing generation number */
index be5184c..200d123 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)user.h      8.2 (Berkeley) 9/23/93
  * $FreeBSD: src/sys/sys/user.h,v 1.24.2.1 2001/10/11 08:20:18 peter Exp $
- * $DragonFly: src/sys/sys/user.h,v 1.9 2003/07/13 05:45:12 dillon Exp $
+ * $DragonFly: src/sys/sys/user.h,v 1.10 2003/07/25 05:26:52 dillon Exp $
  */
 
 #ifndef _SYS_USER_H_
@@ -77,6 +77,7 @@ struct kinfo_proc {
                u_int64_t e_uticks;             /* time accouting */
                u_int64_t e_sticks;
                u_int64_t e_iticks;
+               int     e_cpuid;                /* last scheduled on cpu */
                pid_t   e_ppid;                 /* parent process id */
                pid_t   e_pgid;                 /* process group id */
                short   e_jobc;                 /* job control counter */