On Mon, Feb 15, 2021 at 11:37:45AM +0100, Martin Pieuchot wrote: > Diagnostic function rw_enter_diag() should be called before > WITNESS_CHECKORDER() to have proper locking/debugging information. > > In the case of 'locking against myself' it is currently impossible > to know where the lock has been previously acquired. Diff below fixes > that, ok?
Based on this description alone, it is not clear to me what exactly gets solved. Doesn't the code reach rw_enter_diag() inside the loop when trying to recurse on the rwlock? Does this change have implications with (panicstr || db_active)? > Index: kern/kern_rwlock.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_rwlock.c,v > retrieving revision 1.47 > diff -u -p -r1.47 kern_rwlock.c > --- kern/kern_rwlock.c 8 Feb 2021 08:18:45 -0000 1.47 > +++ kern/kern_rwlock.c 15 Feb 2021 10:32:57 -0000 > @@ -237,7 +237,11 @@ rw_enter(struct rwlock *rwl, int flags) > int error, prio; > #ifdef WITNESS > int lop_flags; > +#endif > + > + rw_enter_diag(rwl, flags); > > +#ifdef WITNESS > lop_flags = LOP_NEWORDER; > if (flags & RW_WRITE) > lop_flags |= LOP_EXCLUSIVE; > @@ -270,8 +274,6 @@ retry: > continue; > } > #endif > - > - rw_enter_diag(rwl, flags); > > if (flags & RW_NOSLEEP) > return (EBUSY); >