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

Reply via email to