[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 04/10] qemu-thread: optimize QemuLockCnt with fu
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 04/10] qemu-thread: optimize QemuLockCnt with futexes on Linux |
Date: |
Thu, 12 Jan 2017 16:40:36 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 |
On 12/01/2017 14:34, Fam Zheng wrote:
>> + */
>> + while ((*val & QEMU_LOCKCNT_STATE_MASK) != QEMU_LOCKCNT_STATE_FREE) {
>> + if ((*val & QEMU_LOCKCNT_STATE_MASK) == QEMU_LOCKCNT_STATE_LOCKED) {
>> + int expected = *val;
>> + int new = expected - QEMU_LOCKCNT_STATE_LOCKED +
>> QEMU_LOCKCNT_STATE_WAITING;
>> +
>> + trace_lockcnt_futex_wait_prepare(lockcnt, expected, new);
> ... the holder thread releases the lock at this point. In this case a second
> call to this function in qemu_lockcnt_dec_and_lock does pass
> QEMU_LOCKCNT_STATE_LOCKED in new_if_free, because 'waited' is left false
> there.
> The code is okay, but the comment above is too strict.
Right.
>> +bool qemu_lockcnt_dec_and_lock(QemuLockCnt *lockcnt)
>> +{
>> + int val = atomic_read(&lockcnt->count);
>> + int locked_state = QEMU_LOCKCNT_STATE_LOCKED;
>> + bool waited = false;
>> +
>> + for (;;) {
>> + if (val >= 2 * QEMU_LOCKCNT_COUNT_STEP) {
>> + int expected = val;
>> + int new = val - QEMU_LOCKCNT_COUNT_STEP;
>> + val = atomic_cmpxchg(&lockcnt->count, val, new);
>> + if (val == expected) {
>> + break;
>> + }
> If (val != expected && val >= 2 * QEMU_LOCKCNT_COUNT_STEP), should this
> atomic_cmpxchg be retried before trying qemu_lockcnt_cmpxchg_or_wait?
>
Yeah, the below can be moved entirely in an "else".
Paolo
- [Qemu-devel] [PATCH 02/10] qemu-thread: introduce QemuLockCnt, (continued)
- [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
- [Qemu-devel] [PATCH 08/10] aio-win32: remove walking_handlers, protecting AioHandler list with list_lock, Paolo Bonzini, 2017/01/04
- Re: [Qemu-devel] [PATCH v3 00/10] aio_context_acquire/release pushdown, part 1, Paolo Bonzini, 2017/01/10