On Sun, May 08, 2022 at 09:19:23PM +0200, Alexander Bluhm wrote:
> I will run my tests with the diff below.
With the third chunk reboot hangs during reordering libraries in
vmmaplk. So this needs more thought.
> Index: kern/kern_rwlock.c
> ===================================================================
> RCS file: /data/mirror/openbsd/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 8 May 2022 18:55:52 -0000
> @@ -81,7 +81,7 @@ static const struct rwlock_op {
> },
> { /* RW_READ */
> RWLOCK_READ_INCR,
> - RWLOCK_WRLOCK,
> + RWLOCK_WRLOCK | RWLOCK_WRWANT,
> RWLOCK_WAIT,
> 0,
> PLOCK
> @@ -103,7 +103,7 @@ rw_enter_read(struct rwlock *rwl)
> {
> unsigned long owner = rwl->rwl_owner;
>
> - if (__predict_false((owner & RWLOCK_WRLOCK) ||
> + if (__predict_false((owner & (RWLOCK_WRLOCK | RWLOCK_WRWANT)) ||
> rw_cas(&rwl->rwl_owner, owner, owner + RWLOCK_READ_INCR)))
> rw_enter(rwl, RW_READ);
> else {
> @@ -343,8 +343,7 @@ rw_do_exit(struct rwlock *rwl, unsigned
> if (wrlock)
> set = 0;
> else
> - set = (owner - RWLOCK_READ_INCR) &
> - ~(RWLOCK_WAIT|RWLOCK_WRWANT);
> + set = (owner - RWLOCK_READ_INCR) & ~RWLOCK_WAIT;
> } while (__predict_false(rw_cas(&rwl->rwl_owner, owner, set)));
>
> if (owner & RWLOCK_WAIT)