Semaphore blocking optracer
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 10 Dec 2014 06:52:34 +0000 (22:52 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 10 Dec 2014 06:55:09 +0000 (22:55 -0800)
Generates an oprof backtrace whenever a semaphore is downed and will
likely block.  There's a slight chance it won't block and a trace will
still be taken.

To enable tracing, you need to:

$ echo opstart > /prof/kpctl

It is not necessary (or maybe even desirable) to run the optimer sampler
at the same time.

Kconfig
kern/src/kthread.c

diff --git a/Kconfig b/Kconfig
index 9d9dc6f..346c03a 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -162,6 +162,14 @@ config SEM_SPINWAIT_NR_LOOPS
        help
                How many times to poll a busy semaphore before going to sleep.
 
+config SEM_TRACE_BLOCKERS
+       bool "Semaphore Blocker Tracing"
+       default n
+       help
+               Drops a TRACEME whenever a semaphore would block (barring slight
+               races).  To access the trace data, you'll need to use the opcontrols
+               and process the data with op2.
+
 config RESET_STACKS
        bool "Reset Stacks"
        default y
index 8150f8a..50d5372 100644 (file)
@@ -301,6 +301,9 @@ void sem_down(struct semaphore *sem)
        if (sem_trydown(sem))
                goto block_return_path;
 #endif
+#ifdef CONFIG_SEM_TRACE_BLOCKERS
+       TRACEME();
+#endif
        /* We're probably going to sleep, so get ready.  We'll check again later. */
        kthread = pcpui->cur_kthread;
        /* We need to have a spare slot for restart, so we also use it when