Index | Thread | Search

From:
Vitaliy Makkoveev <mvs@openbsd.org>
Subject:
Re: rwlocks don't need to provide RW_SLEEPFAIL anymore
To:
David Gwynne <david@gwynne.id.au>
Cc:
tech@openbsd.org
Date:
Sat, 17 May 2025 10:55:34 +0300

Download raw body.

Thread
On Sat, May 17, 2025 at 05:45:12PM +1000, David Gwynne wrote:
> nothing uses it. the few things that did use it were too tricky, so i'm
> not keen to leave it around for people to cause confusion with in the
> future.
> 
> ok?
> 

ok mvs

> Index: share/man/man9/rwlock.9
> ===================================================================
> RCS file: /cvs/src/share/man/man9/rwlock.9,v
> diff -u -p -r1.27 rwlock.9
> --- share/man/man9/rwlock.9	29 Jan 2025 15:10:35 -0000	1.27
> +++ share/man/man9/rwlock.9	17 May 2025 07:38:35 -0000
> @@ -149,10 +149,6 @@ When waiting for a lock, allow signals t
>  Do not wait for busy locks, fail with
>  .Dv EBUSY
>  instead.
> -.It Dv RW_SLEEPFAIL
> -Wait for busy locks, but do not obtain them, fail with
> -.Dv EAGAIN
> -instead.
>  .It Dv RW_DUPOK
>  Prevents
>  .Xr witness 4 ,
> Index: sys/sys/rwlock.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/rwlock.h,v
> diff -u -p -r1.32 rwlock.h
> --- sys/sys/rwlock.h	29 Jan 2025 15:10:09 -0000	1.32
> +++ sys/sys/rwlock.h	17 May 2025 07:38:35 -0000
> @@ -114,7 +114,6 @@ struct rwlock {
>  #define RW_OPMASK		0x0007UL
>  
>  #define RW_INTR			0x0010UL /* interruptible sleep */
> -#define RW_SLEEPFAIL		0x0020UL /* fail if we slept for the lock */
>  #define RW_NOSLEEP		0x0040UL /* don't wait for the lock */
>  #define RW_RECURSEFAIL		0x0080UL /* Fail on recursion for RRW locks. */
>  #define RW_DUPOK		0x0100UL /* Permit duplicate lock */
> Index: sys/kern/kern_rwlock.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_rwlock.c,v
> diff -u -p -r1.55 kern_rwlock.c
> --- sys/kern/kern_rwlock.c	29 Jan 2025 15:10:09 -0000	1.55
> +++ sys/kern/kern_rwlock.c	17 May 2025 07:38:35 -0000
> @@ -302,11 +302,6 @@ rw_do_enter_write(struct rwlock *rwl, in
>  			rw_dec(&rwl->rwl_waiters);
>  			return (error);
>  		}
> -		if (ISSET(flags, RW_SLEEPFAIL)) {
> -			rw_dec(&rwl->rwl_waiters);
> -			rw_exited(rwl);
> -			return (EAGAIN);
> -		}
>  
>  		owner = rw_cas(&rwl->rwl_owner, 0, self);
>  	} while (owner != 0);
> @@ -392,11 +387,9 @@ rw_do_enter_read(struct rwlock *rwl, int
>  			db_enter();
>  		}
>  #endif
> -		if (ISSET(flags, RW_INTR) && (error != 0))
> -			goto fail;
> -		if (ISSET(flags, RW_SLEEPFAIL)) {
> -			error = EAGAIN;
> -			goto fail;
> +		if (ISSET(flags, RW_INTR) && (error != 0)) {
> +			rw_dec(&rwl->rwl_readers);
> +			return (error);
>  		}
>  	} while (!rw_read_incr(rwl, 0));
>  	rw_dec(&rwl->rwl_readers);
> @@ -406,9 +399,6 @@ locked:
>  	WITNESS_LOCK(&rwl->rwl_lock_obj, lop_flags);
>  
>  	return (0);
> -fail:
> -	rw_dec(&rwl->rwl_readers);
> -	return (error);
>  }
>  
>  static int
>