summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMerlin Scholz <merlin@scholz.ruhr>2023-03-22 14:13:18 +0100
committerMerlin Scholz <merlin@scholz.ruhr>2023-07-10 00:50:30 +0200
commit6513e5133d7abe0d198fb630bea96a759ea20bf4 (patch)
treee05828b8d168c0fc8db2ed41f84c305fcc92e0bc
parentc41c4dd2b0c453e81e1d95f969e0a98528bad3dc (diff)
Add IRQ tracing
-rw-r--r--sys/arch/i386/i386/i386_trap.S6
-rw-r--r--sys/lockdoc/log.c52
-rw-r--r--sys/lockdoc/test.c2
-rw-r--r--sys/sys/lockdoc.h6
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 239bbbf4e77..58185cd5ae1 100644
--- a/sys/arch/i386/i386/i386_trap.S
+++ b/sys/arch/i386/i386/i386_trap.S
@@ -409,7 +409,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
.Lalltraps_checkusr:
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