On 14/12/17(Thu) 12:03, Peter Hessler wrote: > This is the normal arm64 "pmap bug" panic.
Thanks Peter, the diff below should fix the two problems present in your trace: > ddb> show panic > uvm_fault failed: ffffff80002619b4 I love that arm64 is doing the right thing and call panic(9) for UVM faults. > ddb> bo re > panic: mtx 0xffffff8000928138: locking against myself This happens when faulting/panic'ing with a mutex held. The diff below contains the same trick I added for rwlock, close the eyes and try harder. Note that the mutex part of the diff below is only for ARM64, I'll generalize it if we reach a consensus. > ddb> # holding down enter, repeats last command 'bo re' > panic: netlock: lock not held > Stopped at panic+0x154: db_enter() at panic+0x150 > panic() at if_downall+0x74 > if_downall() at boot+0x68 This is new to me. My previous fix for rwlock() did not include a check for the slow path of rw_exit_write(9)! Diff below should fix that. Index: kern/kern_rwlock.c =================================================================== RCS file: /cvs/src/sys/kern/kern_rwlock.c,v retrieving revision 1.32 diff -u -p -r1.32 kern_rwlock.c --- kern/kern_rwlock.c 24 Oct 2017 08:53:15 -0000 1.32 +++ kern/kern_rwlock.c 14 Dec 2017 11:16:29 -0000 @@ -287,6 +287,10 @@ _rw_exit(struct rwlock *rwl LOCK_FL_VARS int wrlock = owner & RWLOCK_WRLOCK; unsigned long set; + /* Avoid deadlocks after panic */ + if (panicstr) + return; + if (wrlock) rw_assert_wrlock(rwl); else Index: arch/arm64/arm64/arm64_mutex.c =================================================================== RCS file: /cvs/src/sys/arch/arm64/arm64/arm64_mutex.c,v retrieving revision 1.2 diff -u -p -r1.2 arm64_mutex.c --- arch/arm64/arm64/arm64_mutex.c 30 Apr 2017 16:45:45 -0000 1.2 +++ arch/arm64/arm64/arm64_mutex.c 14 Dec 2017 11:13:57 -0000 @@ -57,6 +57,10 @@ mtx_enter(struct mutex *mtx) int ticks = __mp_lock_spinout; #endif + /* Avoid deadlocks after panic */ + if (panicstr) + return; + while (mtx_enter_try(mtx) == 0) { #ifdef MP_LOCKDEBUG if (--ticks == 0) { @@ -73,7 +77,7 @@ mtx_enter_try(struct mutex *mtx) { struct cpu_info *owner, *ci = curcpu(); int s; - + if (mtx->mtx_wantipl != IPL_NONE) s = splraise(mtx->mtx_wantipl); @@ -102,6 +106,10 @@ void mtx_leave(struct mutex *mtx) { int s; + + /* Avoid deadlocks after panic */ + if (panicstr) + return; MUTEX_ASSERT_LOCKED(mtx);