[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 02/10] qemu-thread: introduce QemuLockCnt
From: |
Stefan Hajnoczi |
Subject: |
Re: [Qemu-devel] [PATCH 02/10] qemu-thread: introduce QemuLockCnt |
Date: |
Wed, 11 Jan 2017 16:56:02 +0000 |
User-agent: |
Mutt/1.7.1 (2016-10-04) |
On Wed, Jan 04, 2017 at 02:26:17PM +0100, Paolo Bonzini wrote:
> +/* Decrement a counter, and return locked if it is decremented to zero.
> + * It is impossible for the counter to become nonzero while the mutex
> + * is taken.
> + */
> +bool qemu_lockcnt_dec_and_lock(QemuLockCnt *lockcnt)
> +{
> + int val = atomic_read(&lockcnt->count);
I think I've figured out the answer to my question why this isn't an
atomic_mb_read():
The following accesses use atomic_cmpxchg() or atomic_fetch_dec().
There is no adverse effect if we read an outdated value here since the
cmpxchg/fetch_dec are sequentially consistent and explicitly require us
to handle the old value.
> + while (val > 1) {
> + int old = atomic_cmpxchg(&lockcnt->count, val, val - 1);
> + if (old != val) {
> + val = old;
> + continue;
> + }
> +
> + return false;
> + }
> +
> + qemu_lockcnt_lock(lockcnt);
> + if (atomic_fetch_dec(&lockcnt->count) == 1) {
> + return true;
> + }
> +
> + qemu_lockcnt_unlock(lockcnt);
> + return false;
signature.asc
Description: PGP signature
- [Qemu-devel] [PATCH v3 00/10] aio_context_acquire/release pushdown, part 1, Paolo Bonzini, 2017/01/04
- [Qemu-devel] [PATCH 01/10] aio: rename bh_lock to list_lock, Paolo Bonzini, 2017/01/04
- [Qemu-devel] [PATCH 03/10] aio: make ctx->list_lock a QemuLockCnt, subsuming ctx->walking_bh, Paolo Bonzini, 2017/01/04
- [Qemu-devel] [PATCH 05/10] aio-posix: split aio_dispatch_handlers out of aio_dispatch, Paolo Bonzini, 2017/01/04
- [Qemu-devel] [PATCH 02/10] qemu-thread: introduce QemuLockCnt, Paolo Bonzini, 2017/01/04
- [Qemu-devel] [PATCH 04/10] qemu-thread: optimize QemuLockCnt with futexes on Linux, Paolo Bonzini, 2017/01/04
- [Qemu-devel] [PATCH 06/10] aio: tweak walking in dispatch phase, Paolo Bonzini, 2017/01/04
- [Qemu-devel] [PATCH 07/10] aio-posix: remove walking_handlers, protecting AioHandler list with list_lock, Paolo Bonzini, 2017/01/04
- [Qemu-devel] [PATCH 09/10] aio: document locking, Paolo Bonzini, 2017/01/04
- [Qemu-devel] [PATCH 10/10] async: optimize aio_bh_poll, Paolo Bonzini, 2017/01/04