Use the KTR facility to trace token operations.
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 20 Jun 2005 18:00:28 +0000 (18:00 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 20 Jun 2005 18:00:28 +0000 (18:00 +0000)
sys/kern/lwkt_token.c

index c38e816..f1a4ab9 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/lwkt_token.c,v 1.18 2005/06/20 07:58:39 dillon Exp $
+ * $DragonFly: src/sys/kern/lwkt_token.c,v 1.19 2005/06/20 18:00:28 dillon Exp $
  */
 
 #ifdef _KERNEL
@@ -44,6 +44,7 @@
 #include <sys/queue.h>
 #include <sys/thread2.h>
 #include <sys/sysctl.h>
+#include <sys/ktr.h>
 #include <sys/kthread.h>
 #include <machine/cpu.h>
 #include <sys/lock.h>
@@ -102,52 +103,26 @@ static void lwkt_reqtoken_remote(void *data);
 
 static lwkt_token      pool_tokens[LWKT_NUM_POOL_TOKENS];
 
-/*
- * Token debugging code, log token operations and who called them.
- */
-#ifdef DEBUG_TOKENS
-
-static struct toklog {
-    enum tokenum { TOKTRY, TOKGET, TOKREL1, TOKREL2, TOKREMOTE,
-                  TOKREQREMOTE, TOKREQFAIL, TOKDRAIN } type;
-    int toremote;
-    lwkt_tokref_t ref;
-    lwkt_token_t tok;
-    thread_t td;
-    void *caller;
-} toklog[SMP_MAXCPU][2048];
-
-static int tokindex[SMP_MAXCPU];
-
-static void
-logtoken(lwkt_tokref_t ref, void *stackptr, enum tokenum type)
-{
-    struct toklog *log;
-    globaldata_t gd;
-
-    if (panicstr == NULL) {
-       gd = mycpu;
-       crit_enter();
-       log = &toklog[gd->gd_cpuid][tokindex[gd->gd_cpuid]];
-       log->type = type;
-       log->ref = ref;
-       log->tok = ref->tr_tok;
-       if (stackptr)
-           log->caller = ((void **)stackptr)[-1];
-       else
-           log->caller = NULL;
-       log->td = gd->gd_curthread;
-       tokindex[gd->gd_cpuid] = (tokindex[gd->gd_cpuid] + 1) & 2047;
-       crit_exit();
-    }
-}
-
-#else
-
-#define logtoken(ref, stackptr, type)
+#define TOKEN_STRING   "REF=%p TOK=%p TD=%p CALLER=%p"
+#if !defined(KTR_TOKENS)
+#define        KTR_TOKENS      KTR_ALL
+#endif
 
+KTR_INFO_MASTER(tokens);
+KTR_INFO(KTR_TOKENS, tokens, try, 0, TOKEN_STRING, sizeof(void *) * 4);
+KTR_INFO(KTR_TOKENS, tokens, get, 1, TOKEN_STRING, sizeof(void *) * 4);
+KTR_INFO(KTR_TOKENS, tokens, release, 2, TOKEN_STRING, sizeof(void *) * 4);
+#ifdef SMP
+KTR_INFO(KTR_TOKENS, tokens, remote, 3, TOKEN_STRING, sizeof(void *) * 4);
+KTR_INFO(KTR_TOKENS, tokens, reqremote, 4, TOKEN_STRING, sizeof(void *) * 4);
+KTR_INFO(KTR_TOKENS, tokens, reqfail, 5, TOKEN_STRING, sizeof(void *) * 4);
+KTR_INFO(KTR_TOKENS, tokens, drain, 6, TOKEN_STRING, sizeof(void *) * 4);
 #endif
 
+#define logtoken(name, ref, stackptr)                                  \
+       KTR_LOG(tokens_ ## name, ref, ref->tr_tok, curthread,           \
+               ((stackptr) ? (stackptr)[-1] : NULL))
+
 #ifdef _KERNEL
 
 #ifdef INVARIANTS
@@ -199,13 +174,13 @@ lwkt_chktokens(thread_t td)
                refs->tr_reqgd = gd;
                tok->t_reqcpu = gd;     /* MP unsynchronized 'fast' req */
 
-               logtoken(refs, &td, TOKREQREMOTE);
+               logtoken(reqremote, refs, (void **)&td);
 
                if (lwkt_send_ipiq_nowait(dgd, lwkt_reqtoken_remote, refs)) {
                    /* failed */
                    refs->tr_magic = LWKT_TOKREF_MAGIC1;
 
-                   logtoken(refs, &td, TOKREQFAIL);
+                   logtoken(reqfail, refs, (void **)&td);
                    break;
                }
            } else if (magic != LWKT_TOKREF_MAGIC2) {
@@ -431,14 +406,14 @@ void
 lwkt_gettoken(lwkt_tokref_t ref, lwkt_token_t tok)
 {
     lwkt_tokref_init(ref, tok);
-    logtoken(ref, &ref, TOKGET);
+    logtoken(get, ref, (void **)&ref);
     _lwkt_gettokref(ref);
 }
 
 void
 lwkt_gettokref(lwkt_tokref_t ref)
 {
-    logtoken(ref, &ref, TOKGET);
+    logtoken(get, ref, (void **)&ref);
     _lwkt_gettokref(ref);
 }
 
@@ -446,14 +421,14 @@ int
 lwkt_trytoken(lwkt_tokref_t ref, lwkt_token_t tok)
 {
     lwkt_tokref_init(ref, tok);
-    logtoken(ref, &ref, TOKTRY);
+    logtoken(try, ref, (void **)&ref);
     return(_lwkt_trytokref(ref));
 }
 
 int
 lwkt_trytokref(lwkt_tokref_t ref)
 {
-    logtoken(ref, &ref, TOKTRY);
+    logtoken(try, ref, (void **)&ref);
     return(_lwkt_trytokref(ref));
 }
 
@@ -471,7 +446,7 @@ lwkt_reltoken(lwkt_tokref *_ref)
     thread_t td;
     int giveaway;
 
-    logtoken(_ref, &_ref, TOKREL1);
+    logtoken(release, _ref, (void **)&_ref);
     /*
      * Guard check and stack check (if in the same stack page).  We must
      * also wait for any action pending on remote cpus which we do by
@@ -583,7 +558,7 @@ lwkt_reqtoken_remote(void *data)
     globaldata_t gd = mycpu;
     lwkt_token_t tok = ref->tr_tok;
 
-    logtoken(ref, &data, TOKREMOTE);
+    logtoken(remote, ref, (void **)&data);
     /*
      * We do not have to queue the token if we can give it away
      * immediately.  Otherwise we queue it to our globaldata structure.
@@ -619,6 +594,7 @@ lwkt_drain_token_requests(void)
     KKASSERT(gd->gd_curthread->td_pri >= TDPRI_CRIT);
     while ((ref = gd->gd_tokreqbase) != NULL) {
        gd->gd_tokreqbase = ref->tr_gdreqnext;
+       logtoken(drain, ref, NULL);
        KKASSERT(ref->tr_magic == LWKT_TOKREF_MAGIC2);
        if (ref->tr_tok->t_cpu == gd)
            ref->tr_tok->t_cpu = ref->tr_reqgd;