kernel - add DEBUG_LOCKS_LATENCY option
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 8 Dec 2011 02:42:01 +0000 (18:42 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 8 Dec 2011 02:42:01 +0000 (18:42 -0800)
* This is for debugging only, default disabled.  If optioned this adds
  a sysctl to add a forced latency loop (count to N) in front of any
  spinlock or gettoken.

sys/conf/options
sys/kern/kern_spinlock.c
sys/kern/lwkt_token.c

index f161292..ca1eb98 100644 (file)
@@ -469,6 +469,7 @@ ENABLE_ALART                opt_intpm.h
 BLKDEV_IOSIZE          opt_global.h
 DEBUG                  opt_global.h
 DEBUG_LOCKS            opt_global.h
+DEBUG_LOCKS_LATENCY    opt_global.h
 DEBUG_CRIT_SECTIONS    opt_global.h
 DIAGNOSTIC             opt_global.h
 INVARIANTS             opt_global.h
index d836833..38b2220 100644 (file)
@@ -94,6 +94,16 @@ SYSCTL_QUAD(_debug, OID_AUTO, spinlocks_contested2, CTLFLAG_RD,
     &spinlocks_contested2, 0,
     "Serious spinlock contention count");
 
+#ifdef DEBUG_LOCKS_LATENCY
+
+static long spinlocks_add_latency;
+SYSCTL_LONG(_debug, OID_AUTO, spinlocks_add_latency, CTLFLAG_RW,
+    &spinlocks_add_latency, 0,
+    "Add spinlock latency");
+
+#endif
+
+
 /*
  * We need a fairly large pool to avoid contention on large SMP systems,
  * particularly multi-chip systems.
@@ -167,6 +177,12 @@ spin_lock_contested(struct spinlock *spin)
        struct indefinite_info info = { 0, 0 };
        int i;
 
+#ifdef DEBUG_LOCKS_LATENCY
+       long j;
+       for (j = spinlocks_add_latency; j > 0; --j)
+               cpu_ccfence();
+#endif
+
        i = 0;
        ++spin->countb;
 
index 90c6e8b..3149450 100644 (file)
@@ -163,6 +163,16 @@ SYSCTL_LONG(_lwkt, OID_AUTO, tty_collisions, CTLFLAG_RW,
 SYSCTL_LONG(_lwkt, OID_AUTO, vnode_collisions, CTLFLAG_RW,
     &vnode_token.t_collisions, 0, "Collision counter of vnode_token");
 
+#ifdef DEBUG_LOCKS_LATENCY
+
+static long tokens_add_latency;
+SYSCTL_LONG(_debug, OID_AUTO, tokens_add_latency, CTLFLAG_RW,
+           &tokens_add_latency, 0,
+           "Add spinlock latency");
+
+#endif
+
+
 static int _lwkt_getalltokens_sorted(thread_t td);
 
 #ifdef SMP
@@ -344,15 +354,27 @@ _lwkt_trytokref_spin(lwkt_tokref_t ref, thread_t td, long mode)
 {
        int spin;
 
-       if (_lwkt_trytokref(ref, td, mode))
+       if (_lwkt_trytokref(ref, td, mode)) {
+#ifdef DEBUG_LOCKS_LATENCY
+               long j;
+               for (j = tokens_add_latency; j > 0; --j)
+                       cpu_ccfence();
+#endif
                return TRUE;
+       }
        for (spin = lwkt_token_spin; spin > 0; --spin) {
                if (lwkt_token_delay)
                        tsc_delay(lwkt_token_delay);
                else
                        cpu_pause();
-               if (_lwkt_trytokref(ref, td, mode))
+               if (_lwkt_trytokref(ref, td, mode)) {
+#ifdef DEBUG_LOCKS_LATENCY
+                       long j;
+                       for (j = tokens_add_latency; j > 0; --j)
+                               cpu_ccfence();
+#endif
                        return TRUE;
+               }
        }
        return FALSE;
 }