Some tweaks to print_func_entry()
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 21 Oct 2013 01:31:15 +0000 (18:31 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 19:12:25 +0000 (11:12 -0800)
We need the tab resetting, since for every kproc that doesn't return, we
tab in at least once.

Turning it off easily is also useful, without spatching over and over.

The Core printf helps a little with concurrency slightly, though
kthreads end up running on core 0, so you'll still need to manually edit
the trace.

kern/src/kdebug.c

index 96c69cf..c9a4f2c 100644 (file)
@@ -8,6 +8,7 @@
 #include <kmalloc.h>
 #include <string.h>
 #include <assert.h>
+#include <smp.h>
 
 struct symtab_entry gbl_symtab[1] __attribute__((weak)) = {{0, 0}};
 
@@ -72,23 +73,48 @@ static bool is_blacklisted(const char *s)
 }
 
 static int tab_depth = 0;
+static bool print = TRUE;
+
+/* Call these via kfunc */
+void reset_print_func_depth(void)
+{
+       tab_depth = 0;
+}
+
+void toggle_print_func(void)
+{
+       print = !print;
+       printk("Func entry/exit printing is now %sabled\n", print ? "en" : "dis");
+}
+
+static spinlock_t lock = SPINLOCK_INITIALIZER_IRQSAVE;
 
 void __print_func_entry(const char *func, const char *file)
 {
+       if (!print)
+               return;
        if (is_blacklisted(func))
                return;
+       spin_lock_irqsave(&lock);
+       printd("Core %2d", core_id());  /* helps with multicore output */
        for (int i = 0; i < tab_depth; i++)
                printk("\t");
        printk("%s() in %s\n", func, file);
+       spin_unlock_irqsave(&lock);
        tab_depth++;
 }
 
 void __print_func_exit(const char *func, const char *file)
 {
+       if (!print)
+               return;
        if (is_blacklisted(func))
                return;
        tab_depth--;
+       spin_lock_irqsave(&lock);
+       printd("Core %2d", core_id());
        for (int i = 0; i < tab_depth; i++)
                printk("\t");
        printk("---- %s()\n", func);
+       spin_unlock_irqsave(&lock);
 }