kernel - lwkt_token revamp
[dragonfly.git] / sys / kern / lwkt_thread.c
index 288b152..9f6ba58 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003,2004 The DragonFly Project.  All rights reserved.
+ * Copyright (c) 2003-2010 The DragonFly Project.  All rights reserved.
  *
  * This code is derived from software contributed to The DragonFly Project
  * by Matthew Dillon <dillon@backplane.com>
@@ -57,6 +57,8 @@
 #include <sys/spinlock2.h>
 #include <sys/mplock2.h>
 
+#include <sys/dsched.h>
+
 #include <vm/vm.h>
 #include <vm/vm_param.h>
 #include <vm/vm_kern.h>
 #define KTR_CTXSW KTR_ALL
 #endif
 KTR_INFO_MASTER(ctxsw);
-KTR_INFO(KTR_CTXSW, ctxsw, sw, 0, "sw  %p > %p", 2 * sizeof(struct thread *));
-KTR_INFO(KTR_CTXSW, ctxsw, pre, 1, "pre %p > %p", 2 * sizeof(struct thread *));
-KTR_INFO(KTR_CTXSW, ctxsw, newtd, 2, "new_td %p %s", sizeof (struct thread *) +
-        sizeof(char *));
-KTR_INFO(KTR_CTXSW, ctxsw, deadtd, 3, "dead_td %p", sizeof (struct thread *));
+KTR_INFO(KTR_CTXSW, ctxsw, sw, 0, "#cpu[%d].td = %p",
+        sizeof(int) + sizeof(struct thread *));
+KTR_INFO(KTR_CTXSW, ctxsw, pre, 1, "#cpu[%d].td = %p",
+        sizeof(int) + sizeof(struct thread *));
+KTR_INFO(KTR_CTXSW, ctxsw, newtd, 2, "#threads[%p].name = %s",
+        sizeof (struct thread *) + sizeof(char *));
+KTR_INFO(KTR_CTXSW, ctxsw, deadtd, 3, "#threads[%p].name = <dead>", sizeof (struct thread *));
 
 static MALLOC_DEFINE(M_THREAD, "thread", "lwkt threads");
 
@@ -352,6 +356,7 @@ lwkt_init_thread(thread_t td, void *stack, int stksize, int flags,
     td->td_flags = flags;
     td->td_gd = gd;
     td->td_pri = TDPRI_KERN_DAEMON + TDPRI_CRIT;
+    td->td_toks_stop = &td->td_toks_base;
 #ifdef SMP
     if ((flags & TDF_MPSAFE) == 0)
        td->td_mpcount = 1;
@@ -380,6 +385,8 @@ lwkt_init_thread(thread_t td, void *stack, int stksize, int flags,
     TAILQ_INSERT_TAIL(&gd->gd_tdallq, td, td_allq);
     crit_exit_gd(mygd);
 #endif
+
+    dsched_new_thread(td);
 }
 
 void
@@ -492,7 +499,7 @@ lwkt_switch(void)
                td->td_flags |= TDF_PANICWARN;
                kprintf("Warning: thread switch from interrupt or IPI, "
                        "thread %p (%s)\n", td, td->td_comm);
-               print_backtrace();
+               print_backtrace(-1);
            }
            lwkt_switch();
            gd->gd_intr_nesting_level = savegdnest;
@@ -514,7 +521,7 @@ lwkt_switch(void)
            td->td_release(td);
 
     crit_enter_gd(gd);
-    if (td->td_toks)
+    if (TD_TOKS_HELD(td))
            lwkt_relalltokens(td);
 
     /*
@@ -629,7 +636,7 @@ again:
             * cause the core MP lock to be released. 
             */
            if ((ntd->td_mpcount && mpheld == 0 && !cpu_try_mplock()) ||
-               (ntd->td_toks && lwkt_getalltokens(ntd) == 0)
+               (TD_TOKS_HELD(ntd) && lwkt_getalltokens(ntd) == 0)
            ) {
                u_int32_t rqmask = gd->gd_runqmask;
 
@@ -647,7 +654,7 @@ again:
                         * failure, but the variable is only needed for
                         * the loop.
                         */
-                       if (ntd->td_toks && !lwkt_getalltokens(ntd)) {
+                       if (TD_TOKS_HELD(ntd) && !lwkt_getalltokens(ntd)) {
                            /* spinning due to token contention */
 #ifdef INVARIANTS
                            ++token_contention_count;
@@ -766,7 +773,7 @@ using_idle_thread:
        KKASSERT(tos_ok);
     }
 #endif
-       KTR_LOG(ctxsw_sw, td, ntd);
+       KTR_LOG(ctxsw_sw, gd->gd_cpuid, ntd);
        td->td_switch(ntd);
     }
     /* NOTE: current cpu may have changed after switch */
@@ -866,7 +873,7 @@ lwkt_preempt(thread_t ntd, int critpri)
        need_lwkt_resched();
        return;
     }
-    if (ntd->td_toks) {
+    if (TD_TOKS_HELD(ntd)) {
        ++preempt_miss;
        need_lwkt_resched();
        return;
@@ -908,7 +915,7 @@ lwkt_preempt(thread_t ntd, int critpri)
     ++preempt_hit;
     ntd->td_preempted = td;
     td->td_flags |= TDF_PREEMPT_LOCK;
-    KTR_LOG(ctxsw_pre, td, ntd);
+    KTR_LOG(ctxsw_pre, gd->gd_cpuid, ntd);
     td->td_switch(ntd);
 
     KKASSERT(ntd->td_preempted && (td->td_flags & TDF_PREEMPT_DONE));
@@ -1472,6 +1479,7 @@ lwkt_exit(void)
     if (td->td_flags & TDF_TSLEEPQ)
        tsleep_remove(td);
     biosched_done(td);
+    dsched_exit_thread(td);
     lwkt_deschedule_self(td);
     lwkt_remove_tdallq(td);
     if (td->td_flags & TDF_ALLOCATED_THREAD)