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.

Reply via email to