Alarm debugging tools
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 6 May 2011 01:42:26 +0000 (18:42 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:02 +0000 (17:36 -0700)
Can see which waiters are running on all cores via the monitor.  I'll
probably add a lot more to this, but it's quite useful already!

kern/include/alarm.h
kern/include/monitor.h
kern/src/alarm.c
kern/src/monitor.c

index 1e0ce54..dcf1f02 100644 (file)
@@ -85,4 +85,8 @@ void trigger_tchain(struct timer_chain *tchain);
 /* How to set a specific alarm: the per-cpu timer interrupt */
 void set_pcpu_alarm_interrupt(uint64_t time, struct timer_chain *tchain);
 
+/* Debugging */
+void print_chain(struct timer_chain *tchain);
+void print_pcpu_chains(void);
+
 #endif /* ROS_KERN_ALARM_H */
index 71032ab..6f285b1 100644 (file)
@@ -31,5 +31,6 @@ int mon_trace(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_monitor(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_fs(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_bb(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
+int mon_alarm(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 
 #endif // !ROS_KERN_MONITOR_H
index 41a99de..4eaaecf 100644 (file)
@@ -256,6 +256,8 @@ void set_pcpu_alarm_interrupt(uint64_t time, struct timer_chain *tchain)
 }
 
 /* Debug helpers */
+
+/* Disable irqs before calling this, or otherwise protect yourself. */
 void print_chain(struct timer_chain *tchain)
 {
        struct alarm_waiter *i;
@@ -267,3 +269,18 @@ void print_chain(struct timer_chain *tchain)
                printk("\tWaiter %08p, time: %llu\n", i, i->wake_up_time);
        }
 }
+
+/* Prints all chains, rather verbosely */
+void print_pcpu_chains(void)
+{
+       struct timer_chain *pcpu_chain;
+       int8_t irq_state = 0;
+       printk("PCPU Chains:  It is now %llu\n", read_tsc());
+
+       disable_irqsave(&irq_state);
+       for (int i = 0; i < num_cpus; i++) {
+               pcpu_chain = &per_cpu_info[i].tchain;
+               print_chain(pcpu_chain);
+       }
+       enable_irqsave(&irq_state);
+}
index 1dc1c9a..7e985b7 100644 (file)
@@ -61,6 +61,7 @@ static command_t (RO commands)[] = {
        { "monitor", "Run the monitor on another core", mon_monitor},
        { "fs", "Filesystem Diagnostics", mon_fs},
        { "bb", "Try to run busybox (ash)", mon_bb},
+       { "alarm", "Alarm Diagnostics", mon_alarm},
 };
 #define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))
 
@@ -865,3 +866,19 @@ int mon_bb(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
        char *l_argv[3] = {"", "busybox", "ash"};
        return mon_bin_run(3, l_argv, tf);
 }
+
+int mon_alarm(int argc, char **argv, struct trapframe *tf)
+{
+       if (argc < 2) {
+               printk("Usage: alarm OPTION\n");
+               printk("\tpcpu: print full alarm tchains from every core\n");
+               return 1;
+       }
+       if (!strcmp(argv[1], "pcpu")) {
+               print_pcpu_chains();
+       } else {
+               printk("Bad option\n");
+               return 1;
+       }
+       return 0;
+}