[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v6 4/6] coroutine-lock: Reimplement CoRwlock to fix downgrade
From: |
Stefan Hajnoczi |
Subject: |
Re: [PATCH v6 4/6] coroutine-lock: Reimplement CoRwlock to fix downgrade bug |
Date: |
Tue, 30 Mar 2021 17:55:01 +0100 |
On Thu, Mar 25, 2021 at 12:29:39PM +0100, Paolo Bonzini wrote:
> An invariant of the current rwlock is that if multiple coroutines hold a
> reader lock, all must be runnable. The unlock implementation relies on
> this, choosing to wake a single coroutine when the final read lock
> holder exits the critical section, assuming that it will wake a
> coroutine attempting to acquire a write lock.
>
> The downgrade implementation violates this assumption by creating a
> read lock owning coroutine that is exclusively runnable - any other
> coroutines that are waiting to acquire a read lock are *not* made
> runnable when the write lock holder converts its ownership to read
> only.
>
> More in general, the old implementation had lots of other fairness bugs.
> The root cause of the bugs was that CoQueue would wake up readers even
> if there were pending writers, and would wake up writers even if there
> were readers. In that case, the coroutine would go back to sleep *at
> the end* of the CoQueue, losing its place at the head of the line.
>
> To fix this, keep the queue of waiters explicitly in the CoRwlock
> instead of using CoQueue, and store for each whether it is a
> potential reader or a writer. This way, downgrade can look at the
> first queued coroutines and wake it only if it is a reader, causing
> all other readers in line to be released in turn.
>
> Reported-by: David Edmondson <david.edmondson@oracle.com>
> Reviewed-by: David Edmondson <david.edmondson@oracle.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> v3->v4: clean up the code and fix upgrade logic. Fix upgrade comment too.
>
> include/qemu/coroutine.h | 17 +++--
> util/qemu-coroutine-lock.c | 148 ++++++++++++++++++++++++-------------
> 2 files changed, 106 insertions(+), 59 deletions(-)
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
signature.asc
Description: PGP signature
- [PATCH v6 0/6] coroutine rwlock downgrade fix, minor VDI changes, Paolo Bonzini, 2021/03/25
- [PATCH v6 1/6] block/vdi: When writing new bmap entry fails, don't leak the buffer, Paolo Bonzini, 2021/03/25
- [PATCH v6 2/6] block/vdi: Don't assume that blocks are larger than VdiHeader, Paolo Bonzini, 2021/03/25
- [PATCH v6 3/6] coroutine-lock: Store the coroutine in the CoWaitRecord only once, Paolo Bonzini, 2021/03/25
- [PATCH v6 4/6] coroutine-lock: Reimplement CoRwlock to fix downgrade bug, Paolo Bonzini, 2021/03/25
- Re: [PATCH v6 4/6] coroutine-lock: Reimplement CoRwlock to fix downgrade bug,
Stefan Hajnoczi <=
- [PATCH v6 6/6] test-coroutine: Add rwlock downgrade test, Paolo Bonzini, 2021/03/25
- [PATCH v6 5/6] test-coroutine: Add rwlock upgrade test, Paolo Bonzini, 2021/03/25
- Re: [PATCH v6 0/6] coroutine rwlock downgrade fix, minor VDI changes, Stefan Hajnoczi, 2021/03/30