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.