Add a diagnostic to print info about a core
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 1 Oct 2015 15:00:09 +0000 (11:00 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 8 Oct 2015 14:29:57 +0000 (10:29 -0400)
This popped up as a "would be nice to have" feature while tracking down
a bug.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/monitor.h
kern/src/monitor.c

index c8f5c34..5c62a67 100644 (file)
@@ -41,5 +41,6 @@ int mon_px(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_kpfret(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_ks(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_gfp(int argc, char **argv, struct hw_trapframe *hw_tf);
+int mon_coreinfo(int argc, char **argv, struct hw_trapframe *hw_tf);
 
 #endif // !ROS_KERN_MONITOR_H
index 9082849..7ad02fb 100644 (file)
@@ -69,6 +69,7 @@ static command_t commands[] = {
        { "kpfret", "Attempt to idle after a kernel fault", mon_kpfret},
        { "ks", "Kernel scheduler hacks", mon_ks},
        { "gfp", "Get free pages", mon_gfp },
+       { "coreinfo", "Print diagnostics for a core", mon_coreinfo},
 };
 #define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))
 
@@ -1224,3 +1225,31 @@ int mon_gfp(int argc, char **argv, struct hw_trapframe *hw_tf)
        spin_unlock_irqsave(&colored_page_free_list_lock);
        return 0;
 }
+
+/* Prints info about a core.  Optional first arg == coreid. */
+int mon_coreinfo(int argc, char **argv, struct hw_trapframe *hw_tf)
+{
+       struct per_cpu_info *pcpui;
+       struct kthread *kth;
+       int coreid = core_id();
+
+       if (argc >= 2)
+               coreid = strtol(argv[1], 0, 0);
+       pcpui = &per_cpu_info[coreid];
+       printk("Core %d:\n\tcur_proc %d\n\towning proc %d, owning vc %d\n",
+              coreid, pcpui->cur_proc ? pcpui->cur_proc->pid : 0,
+              pcpui->owning_proc ? pcpui->owning_proc->pid : 0,
+              pcpui->owning_vcoreid != 0xdeadbeef ? pcpui->owning_vcoreid : 0);
+       kth = pcpui->cur_kthread;
+       if (kth) {
+               /* kth->proc is only used when the kthread is sleeping.  when it's
+                * running, we care about cur_proc.  if we're here, proc should be 0
+                * unless the kth is concurrently sleeping (we called this remotely) */
+               printk("\tkthread %p (%s), sysc %p (%d)\n", kth, kth->name,
+                      kth->sysc, kth->sysc ? kth->sysc->num : -1);
+       } else {
+               /* Can happen during early boot */
+               printk("\tNo kthread!\n");
+       }
+       return 0;
+}