diff options
| -rw-r--r-- | sys/arch/i386/i386/i386_trap.S | 6 | ||||
| -rw-r--r-- | sys/lockdoc/log.c | 52 | ||||
| -rw-r--r-- | sys/lockdoc/test.c | 2 | ||||
| -rw-r--r-- | sys/sys/lockdoc.h | 6 |
4 files changed, 36 insertions, 30 deletions
diff --git a/sys/arch/i386/i386/i386_trap.S b/sys/arch/i386/i386/i386_trap.S index 70e8f118ef6..22bf694f7dc 100644 --- a/sys/arch/i386/i386/i386_trap.S +++ b/sys/arch/i386/i386/i386_trap.S @@ -408,7 +408,13 @@ calltrap: addl $1,CPUVAR(NTRAP) /* statistical info */ adcl $0,CPUVAR(NTRAP)+4 pushl %esp +#ifdef LOCKDOC + call _C_LABEL(trace_irqs_off) +#endif call _C_LABEL(trap) +#ifdef LOCKDOC + call _C_LABEL(trace_irqs_on) +#endif addl $4,%esp _C_LABEL(trapreturn): .globl trapreturn testb $CHK_UPL,TF_CS(%esp) diff --git a/sys/lockdoc/log.c b/sys/lockdoc/log.c index 3b5b3e6ade6..db86defac17 100644 --- a/sys/lockdoc/log.c +++ b/sys/lockdoc/log.c @@ -7,64 +7,69 @@ struct log_action la_buffer; +#define LOCK_TYPE "kmutex_t" + inline void __mutex_enter(kmutex_t * lock, const char* file, int line, const char* func) { _mutex_enter(lock); - lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_TYPE, LOCK_NONE); } inline void __mutex_exit(kmutex_t * lock, const char* file, int line, const char* func) { _mutex_exit(lock); - lockdoc_log_lock(V_WRITE, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(V_WRITE, lock, file, line, func, LOCK_TYPE, LOCK_NONE); } inline void __mutex_spin_enter(kmutex_t * lock, const char* file, int line, const char* func) { _mutex_spin_enter(lock); - lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_TYPE, LOCK_NONE); } inline void __mutex_spin_exit(kmutex_t * lock, const char* file, int line, const char* func) { _mutex_spin_exit(lock); - lockdoc_log_lock(V_WRITE, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(V_WRITE, lock, file, line, func, LOCK_TYPE, LOCK_NONE); } inline int __mutex_tryenter(kmutex_t * lock, const char* file, int line, const char* func) { int enter = _mutex_tryenter(lock); if(enter != 0) { - lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_TYPE, LOCK_NONE); } return enter; } +#undef LOCK_TYPE +#define LOCK_TYPE "krwlock_t" + inline int __rw_tryupgrade(krwlock_t * lock, const char* file, int line, const char* func) { int upgrade = _rw_tryupgrade(lock); if(upgrade != 0) { - lockdoc_log_lock(V_READ, lock, file, line, func, LOCK_NONE); - lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(V_READ, lock, file, line, func, LOCK_TYPE, LOCK_NONE); + lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_TYPE, LOCK_NONE); } return upgrade; } inline void __rw_downgrade(krwlock_t * lock, const char* file, int line, const char* func) { _rw_downgrade(lock); - lockdoc_log_lock(V_WRITE, lock, file, line, func, LOCK_NONE); - lockdoc_log_lock(P_READ, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(V_WRITE, lock, file, line, func, LOCK_TYPE, LOCK_NONE); + lockdoc_log_lock(P_READ, lock, file, line, func, LOCK_TYPE, LOCK_NONE); } inline void __rw_enter(krwlock_t * lock, const krw_t type, const char* file, int line, const char* func) { _rw_enter(lock, type); if(type == RW_READER) - lockdoc_log_lock(P_READ, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(P_READ, lock, file, line, func, LOCK_TYPE, LOCK_NONE); else - lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_TYPE, LOCK_NONE); } inline int __rw_tryenter(krwlock_t * lock, const krw_t type, const char* file, int line, const char* func) { int enter = _rw_tryenter(lock, type); if(enter != 0) { if(type == RW_READER) - lockdoc_log_lock(P_READ, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(P_READ, lock, file, line, func, LOCK_TYPE, LOCK_NONE); else - lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_TYPE, LOCK_NONE); } return enter; } @@ -72,10 +77,11 @@ inline int __rw_tryenter(krwlock_t * lock, const krw_t type, const char* file, i inline void __rw_exit(krwlock_t * lock, const char* file, int line, const char* func) { _rw_exit(lock); if((lock->rw_owner & 0x04UL) != 0) - lockdoc_log_lock(V_WRITE, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(V_WRITE, lock, file, line, func, LOCK_TYPE, LOCK_NONE); else - lockdoc_log_lock(V_READ, lock, file, line, func, LOCK_NONE); + lockdoc_log_lock(V_READ, lock, file, line, func, LOCK_TYPE, LOCK_NONE); } +#undef LOCK_TYPE /* * Yet to be implemented: Check https://man.netbsd.org/locking.9 (esp. IRQ, CVlock and BKL, check issue tracker) @@ -152,11 +158,7 @@ void trace_irqs_on(struct trapframe *frame) { u_long cur_eflags; cur_eflags = x86_read_flags(); if ((frame->tf_eflags & (1 << 9)) && !(cur_eflags & (1 << 9))) { -#ifdef DEBUG_TRAPS - lockdoc_log_lock(V_WRITE, (struct lock_object*)PSEUDOLOCK_ADDR_HARDIRQ, __FILE__, __LINE__, "dummy", frame->tf_trapno); -#else - lockdoc_log_lock(V_WRITE, (struct lock_object*)PSEUDOLOCK_ADDR_HARDIRQ, __FILE__, __LINE__, "dummy", LOCK_NONE); -#endif + lockdoc_log_lock(V_WRITE, (struct lock_object*)PSEUDOLOCK_ADDR_HARDIRQ, __FILE__, __LINE__, "dummy", "dummy", LOCK_NONE); } } @@ -164,11 +166,7 @@ void trace_irqs_off(struct trapframe *frame) { u_long cur_eflags; cur_eflags = x86_read_flags(); if ((frame->tf_eflags & (1 << 9)) && !(cur_eflags & (1 << 9))) { -#ifdef DEBUG_TRAPS - lockdoc_log_lock(P_WRITE, (struct lock_object*)PSEUDOLOCK_ADDR_HARDIRQ, __FILE__, __LINE__, "dummy", frame->tf_trapno); -#else - lockdoc_log_lock(P_WRITE, (struct lock_object*)PSEUDOLOCK_ADDR_HARDIRQ, __FILE__, __LINE__, "dummy", LOCK_NONE); -#endif + lockdoc_log_lock(P_WRITE, (struct lock_object*)PSEUDOLOCK_ADDR_HARDIRQ, __FILE__, __LINE__, "dummy", "dummy", frame->tf_trapno); } } @@ -177,7 +175,7 @@ void __x86_disable_intr(const char *file, int line, const char *func){ eflags = x86_read_flags(); if (eflags & (1 << 9)){ // Check if interrupts were enabled in the first place - lockdoc_log_lock(P_WRITE, (void*)PSEUDOLOCK_ADDR_HARDIRQ, file, line, "dummy", LOCK_NONE); + lockdoc_log_lock(P_WRITE, (void*)PSEUDOLOCK_ADDR_HARDIRQ, file, line, "dummy", "dummy", LOCK_NONE); } lockdoc_x86_disable_intr(); } @@ -196,7 +194,7 @@ void __x86_enable_intr(const char *file, int line, const char *func){ eflags = x86_read_flags(); if (!(eflags & (1 << 9))){ // Check if interrupts were disabled in the first place - lockdoc_log_lock(V_WRITE, (void*)PSEUDOLOCK_ADDR_HARDIRQ, file, line, "dummy", LOCK_NONE); + lockdoc_log_lock(V_WRITE, (void*)PSEUDOLOCK_ADDR_HARDIRQ, file, line, "dummy", "dummy", LOCK_NONE); } lockdoc_x86_enable_intr(); } diff --git a/sys/lockdoc/test.c b/sys/lockdoc/test.c index 48c4595c9c5..c4450cd10b2 100644 --- a/sys/lockdoc/test.c +++ b/sys/lockdoc/test.c @@ -390,6 +390,8 @@ static void control_thread_work(void *data) { START_AND_WAIT_THREAD(dirty_fewlocks_thread_work); START_AND_WAIT_THREAD(dirty_alllocks_thread_work); START_AND_WAIT_THREAD(dirty_order_thread_work); + + lockdoc_log_memory(0, "lockdoc_ring_buffer", ring_buffer, sizeof(*ring_buffer)); free(ring_buffer, M_LOCKDOC); diff --git a/sys/sys/lockdoc.h b/sys/sys/lockdoc.h index 932afb96fec..65919b58a00 100644 --- a/sys/sys/lockdoc.h +++ b/sys/sys/lockdoc.h @@ -94,7 +94,7 @@ static inline void lockdoc_log_memory(int alloc, const char *datatype, const voi * - Pass an enum that is statically set in the macro, different in each function (similar to Linux) * */ -static inline void lockdoc_log_lock(int lock_op, const volatile void* ptr, const char *file, int line, const char* func, int irq_sync) { +static inline void lockdoc_log_lock(int lock_op, const volatile void* ptr, const char *file, int line, const char* func, const char* lock_type, int irq_sync) { u_long eflags; eflags = x86_read_psl(); lockdoc_x86_disable_intr(); @@ -117,8 +117,8 @@ static inline void lockdoc_log_lock(int lock_op, const volatile void* ptr, const // size only relevant for memory access - // TODO type (See fuction-level TODO) - strncpy(la_buffer.type, "dummy", LOG_CHAR_BUFFER_LEN); + // type + strncpy(la_buffer.type, lock_type, LOG_CHAR_BUFFER_LEN); la_buffer.type[LOG_CHAR_BUFFER_LEN - 1] = '\0'; // TODO lock_member |
