Track pc/fp per kthread for semaphore debugging
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 2 Sep 2016 16:22:04 +0000 (12:22 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 6 Sep 2016 13:26:23 +0000 (09:26 -0400)
If you have a bunch of kthreads sleeping on the same semaphore, previously
you could only see the last one to down the sem.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/riscv/setjmp.h
kern/arch/x86/setjmp.h
kern/include/kthread.h
kern/src/kthread.c

index 690a639..75bcf80 100644 (file)
@@ -9,3 +9,13 @@ struct jmpbuf {
 static inline void __ros_clobber_callee_regs(void)
 {
 }
+
+static inline uintptr_t jmpbuf_get_pc(struct jmpbuf *jb)
+{
+       return jb->retaddr;
+}
+
+static inline uintptr_t jmpbuf_get_fp(struct jmpbuf *jb)
+{
+       return jb->fp;
+}
index cb799c3..64397e0 100644 (file)
@@ -16,6 +16,16 @@ static inline void __ros_clobber_callee_regs(void)
        asm volatile ("" : : : "rbx", "r12", "r13", "r14", "r15");
 }
 
+static inline uintptr_t jmpbuf_get_pc(struct jmpbuf *jb)
+{
+       return jb->retaddr;
+}
+
+static inline uintptr_t jmpbuf_get_fp(struct jmpbuf *jb)
+{
+       return jb->rbp;
+}
+
 #else
 
 struct jmpbuf {
@@ -28,4 +38,15 @@ static inline __ros_clobber_callee_regs(void)
 {
        asm volatile ("" : : : "ebx", "esi", "edi");
 }
+
+static inline uintptr_t jmpbuf_get_pc(struct jmpbuf *jb)
+{
+       return jb->retaddr;
+}
+
+static inline uintptr_t jmpbuf_get_fp(struct jmpbuf *jb)
+{
+       return jb->ebp;
+}
+
 #endif
index 70c4b6f..c3a456f 100644 (file)
@@ -57,9 +57,6 @@ struct semaphore {
 #ifdef CONFIG_SEMAPHORE_DEBUG
        TAILQ_ENTRY(semaphore)          link;
        bool                                            is_on_list;     /* would like better sys/queue.h */
-       uintptr_t                                       bt_pc;          /* program counter of last down */
-       uintptr_t                                       bt_fp;          /* frame pointer of last down */
-       uint32_t                                        calling_core;
 #endif
 };
 
index 468890b..76febba 100644 (file)
@@ -260,9 +260,6 @@ static void sem_init_common(struct semaphore *sem, int signals)
        sem->nr_signals = signals;
 #ifdef CONFIG_SEMAPHORE_DEBUG
        sem->is_on_list = FALSE;
-       sem->bt_pc = 0;
-       sem->bt_fp = 0;
-       sem->calling_core = 0;
 #endif
 }
 
@@ -545,9 +542,6 @@ static void debug_unlock_semlist(void)
  * waited */
 static void debug_downed_sem(struct semaphore *sem)
 {
-       sem->bt_pc = read_pc();
-       sem->bt_fp = read_bp();
-       sem->calling_core = core_id();
        if (TAILQ_EMPTY(&sem->waiters) || sem->is_on_list)
                return;
        TAILQ_INSERT_HEAD(&sems_with_waiters, sem, link);
@@ -593,16 +587,13 @@ void print_sem_info(struct semaphore *sem)
        struct kthread *kth_i;
        /* Always safe to irqsave */
        spin_lock_irqsave(&sem->lock);
-       printk("Semaphore %p has %d signals (neg = waiters)", sem, sem->nr_signals);
-#ifdef CONFIG_SEMAPHORE_DEBUG
-       printk(", recently downed on core %d with pc/frame %p %p\n",
-              sem->calling_core, sem->bt_pc, sem->bt_fp);
-#else
-       printk("\n");
-#endif /* CONFIG_SEMAPHORE_DEBUG */
+       printk("Semaphore %p has %d signals (neg = waiters)\n", sem,
+              sem->nr_signals);
        TAILQ_FOREACH(kth_i, &sem->waiters, link)
-               printk("\tKthread %p (%s), proc %d (%p), sysc %p\n", kth_i, kth_i->name,
-                      kth_i->proc ? kth_i->proc->pid : 0, kth_i->proc, kth_i->sysc);
+               printk("\tKthread %p (%s), proc %d, sysc %p, pc/frame %p %p\n",
+                      kth_i, kth_i->name, kth_i->proc ? kth_i->proc->pid : 0,
+                      kth_i->sysc, jmpbuf_get_pc(&kth_i->context),
+                      jmpbuf_get_fp(&kth_i->context));
        printk("\n");
        spin_unlock_irqsave(&sem->lock);
 }