The top frame is always `witness_checkorder', at least on amd64.  Diff
below makes use of stacktrace_save_at() to skip it.

Previous output:

lock order "&map->lock"(rwlock) -> "&amap->am_lock"(rwlock) first seen at:      
#0  witness_checkorder+0x4d7 [/home/os/openbsd/sys/sys/stacktrace.h:0]          
#1  rw_enter_write+0x43 [/home/os/openbsd/sys/kern/kern_rwlock.c:128]           
#2  amap_ref+0x24 [/home/os/openbsd/sys/uvm/uvm_amap.c:1341]                    
#3  uvm_mapent_clone+0x129 [/home/os/openbsd/sys/uvm/uvm_map.c:3826]            
#4  uvm_map_extract+0x324 [/home/os/openbsd/sys/uvm/uvm_map.c:4582]             
#5  sys_kbind+0x2dd [/home/os/openbsd/sys/uvm/uvm_mmap.c:1174]                  
#6  syscall+0x389 [/home/os/openbsd/sys/sys/syscall_mi.h:102]                   
#7  Xsyscall+0x128   

With this diff:

lock order "&map->lock"(rwlock) -> "&amap->am_lock"(rwlock) first seen at:
#0  rw_enter_write+0x43 [/home/os/openbsd/sys/kern/kern_rwlock.c:128]
#1  amap_ref+0x24 [/home/os/openbsd/sys/uvm/uvm_amap.c:1341]
#2  uvm_mapent_clone+0x129 [/home/os/openbsd/sys/uvm/uvm_map.c:3826]
#3  uvm_map_extract+0x324 [/home/os/openbsd/sys/uvm/uvm_map.c:4582]
#4  sys_kbind+0x2dd [/home/os/openbsd/sys/uvm/uvm_mmap.c:1174]
#5  syscall+0x389 [/home/os/openbsd/sys/sys/syscall_mi.h:102]
#6  Xsyscall+0x128

ok?

Index: kern/subr_witness.c
===================================================================
RCS file: /cvs/src/sys/kern/subr_witness.c,v
retrieving revision 1.46
diff -u -p -r1.46 subr_witness.c
--- kern/subr_witness.c 10 Mar 2021 10:21:47 -0000      1.46
+++ kern/subr_witness.c 22 Mar 2021 10:00:15 -0000
@@ -764,7 +764,7 @@ witness_checkorder(struct lock_object *l
 
        if (witness_cold || witness_watch < 1 || panicstr != NULL || db_active)
                return;
-       
+
        if ((lock->lo_flags & LO_INITIALIZED) == 0) {
                if (witness_uninitialized_report > 0) {
                        witness_uninitialized_report--;
@@ -2472,7 +2472,7 @@ witness_lock_order_add(struct witness *p
        data->wlod_key = key;
        w_lohash.wloh_array[hash] = data;
        w_lohash.wloh_count++;
-       stacktrace_save(&data->wlod_stack);
+       stacktrace_save_at(&data->wlod_stack, 1);
        return (1);
 }
 

Reply via email to