summaryrefslogtreecommitdiff
path: root/sys/lockdoc/log.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/lockdoc/log.c')
-rw-r--r--sys/lockdoc/log.c83
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();
}