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