[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC v1 05/12] atomic: introduce cmpxchg_bool
From: |
Alex Bennée |
Subject: |
Re: [Qemu-devel] [RFC v1 05/12] atomic: introduce cmpxchg_bool |
Date: |
Fri, 15 Apr 2016 18:06:04 +0100 |
User-agent: |
mu4e 0.9.17; emacs 25.0.92.6 |
Richard Henderson <address@hidden> writes:
> On 04/15/2016 07:23 AM, Alex Bennée wrote:
>> +#define atomic_bool_cmpxchg(ptr, old, new) \
>> + ({ \
>> + typeof(*ptr) _old = (old), _new = (new); \
>> + bool r; \
>> + r = __atomic_compare_exchange(ptr, &_old, &_new, false, \
>> + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \
>> + r; \
>> + })
>
> How are you thinking this will be used? If a loop like
>
> do {
> old = atomic_read (ptr);
> new = f(old);
> } while (!atomic_bool_cmpxchg(ptr, old, new));
>
> then it's usually helpful to use a weak compare_exchange (s/false/true/
> above).
> This will produce one loop for ll/sc architectures instead of two.
I used it to make Fred's STREX code a little neater:
if (len == 1 << size) {
oldval = (uint8_t)env->exclusive_val;
result = atomic_bool_cmpxchg(p, oldval, (uint8_t)newval);
}
address_space_unmap(cs->as, p, len, true, result ? len : 0);
Instead of:
if (len == 1 << size) {
oldval = (uint8_t)env->exclusive_val;
result = (atomic_cmpxchg(p, oldval, (uint8_t)newval) == oldval);
}
address_space_unmap(cs->as, p, len, true, result ? len : 0);
But now I'm wondering if there is a race in there. I'll have to look
closer.
>
>
> r~
--
Alex Bennée
- [Qemu-devel] [RFC v1 00/12] Enable MTTCG for 32 bit arm on x86, Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 02/12] tcg/i386: Make direct jump patching thread-safe, Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 01/12] include: move CPU-related definitions out of qemu-common.h, Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 00/12] Enable MTTCG for 32 bit arm on x86, Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 03/12] qemu-thread: add simple test-and-set spinlock, Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 04/12] atomic: introduce atomic_dec_fetch., Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 05/12] atomic: introduce cmpxchg_bool, Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 07/12] cpus: introduce async_safe_run_on_cpu., Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 11/12] arm: atomically check the exclusive value in a STREX, Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 10/12] arm: use tlb_flush_page_all for tlbimva[a], Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 06/12] cpus: pass CPUState to run_on_cpu helpers, Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 09/12] translate-all: introduces tb_flush_safe., Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 08/12] cputlb: introduce tlb_flush_* async work., Alex Bennée, 2016/04/15
- [Qemu-devel] [RFC v1 12/12] cpus: default MTTCG to on for 32 bit ARM on x86, Alex Bennée, 2016/04/15
- Re: [Qemu-devel] [RFC v1 00/12] Enable MTTCG for 32 bit arm on x86, Alex Bennée, 2016/04/15