diff options
Diffstat (limited to 'sys/lockdoc')
| -rw-r--r-- | sys/lockdoc/log.c | 83 |
1 files changed, 56 insertions, 27 deletions
diff --git a/sys/lockdoc/log.c b/sys/lockdoc/log.c index 9269baf2e65..3b5b3e6ade6 100644 --- a/sys/lockdoc/log.c +++ b/sys/lockdoc/log.c @@ -7,49 +7,78 @@ struct log_action la_buffer; -inline void __mutex_enter(kmutex_t * lock, const char* file, int line) { - lockdoc_log_lock(P_WRITE, lock, file, line, LOCK_NONE); +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); } -inline void __mutex_exit(kmutex_t * lock, const char* file, int line) { - lockdoc_log_lock(V_WRITE, lock, file, line, 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); } -inline void __mutex_spin_enter(kmutex_t * lock, const char* file, int line) { - lockdoc_log_lock(P_WRITE, lock, file, line, 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); } -inline void __mutex_spin_exit(kmutex_t * lock, const char* file, int line) { - lockdoc_log_lock(V_WRITE, lock, file, line, 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); } -inline void __rw_enter(krwlock_t * lock, const krw_t type, const char* file, int line) { +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); + } + return enter; +} + +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); + } + 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); +} + +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, LOCK_NONE); + lockdoc_log_lock(P_READ, lock, file, line, func, LOCK_NONE); else - lockdoc_log_lock(P_WRITE, lock, file, line, LOCK_NONE); - _rw_enter(lock, type); + lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_NONE); } -inline int __rw_tryenter(krwlock_t * lock, const krw_t type, const char* file, int line) { - // TODO Check against other implementations - return _rw_tryenter(lock, type); +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); + else + lockdoc_log_lock(P_WRITE, lock, file, line, func, LOCK_NONE); + } + return enter; } -inline void __rw_exit(krwlock_t * lock, const char* file, int line) { - if((lock->rw_owner & 0x02UL) > 0) - lockdoc_log_lock(V_WRITE, lock, file, line, LOCK_NONE); - else - lockdoc_log_lock(V_READ, lock, file, line, LOCK_NONE); +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); + else + lockdoc_log_lock(V_READ, lock, file, line, func, LOCK_NONE); } /* - * Yet to be implemented: Check https://man.netbsd.org/locking.9 + * Yet to be implemented: Check https://man.netbsd.org/locking.9 (esp. IRQ, CVlock and BKL, check issue tracker) */ int32_t lockdoc_get_ctx(void) { @@ -124,9 +153,9 @@ void trace_irqs_on(struct trapframe *frame) { 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__, frame->tf_trapno); + 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__, LOCK_NONE); + lockdoc_log_lock(V_WRITE, (struct lock_object*)PSEUDOLOCK_ADDR_HARDIRQ, __FILE__, __LINE__, "dummy", LOCK_NONE); #endif } } @@ -136,9 +165,9 @@ void trace_irqs_off(struct trapframe *frame) { 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__, frame->tf_trapno); + 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__, LOCK_NONE); + lockdoc_log_lock(P_WRITE, (struct lock_object*)PSEUDOLOCK_ADDR_HARDIRQ, __FILE__, __LINE__, "dummy", LOCK_NONE); #endif } } @@ -148,7 +177,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, LOCK_NONE); + lockdoc_log_lock(P_WRITE, (void*)PSEUDOLOCK_ADDR_HARDIRQ, file, line, "dummy", LOCK_NONE); } lockdoc_x86_disable_intr(); } @@ -167,7 +196,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, LOCK_NONE); + lockdoc_log_lock(V_WRITE, (void*)PSEUDOLOCK_ADDR_HARDIRQ, file, line, "dummy", LOCK_NONE); } lockdoc_x86_enable_intr(); } |
