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); }