On 26/05/18(Sat) 17:49, Scott Cheloha wrote: > Index: sys/kern/kern_synch.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_synch.c,v > retrieving revision 1.144 > diff -u -p -r1.144 kern_synch.c > --- sys/kern/kern_synch.c 24 Apr 2018 16:28:42 -0000 1.144 > +++ sys/kern/kern_synch.c 26 May 2018 22:42:21 -0000 > @@ -236,31 +236,32 @@ msleep(const volatile void *ident, struc > * entered the sleep queue we drop the it. After sleeping we re-lock. > */ > int > -rwsleep(const volatile void *ident, struct rwlock *wl, int priority, > +rwsleep(const volatile void *ident, struct rwlock *rwl, int priority, > const char *wmesg, int timo) > { > struct sleep_state sls; > - int error, error1; > + int error, error1, status; > WITNESS_SAVE_DECL(lock_fl); > > KASSERT((priority & ~(PRIMASK | PCATCH | PNORELOCK)) == 0); > - rw_assert_wrlock(wl); > + rw_assert_anylock(rwl); > + status = rw_status(rwl); > > sleep_setup(&sls, ident, priority, wmesg); > sleep_setup_timeout(&sls, timo); > sleep_setup_signal(&sls, priority); > > - WITNESS_SAVE(&wl->rwl_lock_obj, lock_fl); > + WITNESS_SAVE(&rwl->rwl_lock_obj, lock_fl); > > - rw_exit_write(wl); > + rw_exit(rwl); > > sleep_finish(&sls, 1); > error1 = sleep_finish_timeout(&sls); > error = sleep_finish_signal(&sls); > > if ((priority & PNORELOCK) == 0) { > - rw_enter_write(wl); > - WITNESS_RESTORE(&wl->rwl_lock_obj, lock_fl); > + rw_enter(rwl, status); > + WITNESS_RESTORE(&rwl->rwl_lock_obj, lock_fl); > } > > /* Signal errors are higher priority than timeouts. */
The rwsleep() and corresponding man page changes are ok with me and can already be committed.