qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v1 2/2] include/qemu/atomic: add compile time as


From: Alex Bennée
Subject: Re: [Qemu-devel] [PATCH v1 2/2] include/qemu/atomic: add compile time asserts
Date: Fri, 01 Apr 2016 16:03:01 +0100
User-agent: mu4e 0.9.17; emacs 25.0.92.2

Alex Bennée <address@hidden> writes:

> To be safely portable no atomic access should be trying to do more than
> the natural word width of the host. The most common abuse is trying to
> atomically access 64 bit values on a 32 bit host.
>
> This patch adds some QEMU_BUILD_BUG_ON to the __atomic instrinsic paths
> to create a build failure if (sizeof(*ptr) > sizeof(void *)).
>
> Signed-off-by: Alex Bennée <address@hidden>

Ping Paolo. Is this worth including in a re-spin?

> ---
>  include/qemu/atomic.h | 58 
> ++++++++++++++++++++++++++++++---------------------
>  1 file changed, 34 insertions(+), 24 deletions(-)
>
> diff --git a/include/qemu/atomic.h b/include/qemu/atomic.h
> index 8f1d8d9..5bc4d6c 100644
> --- a/include/qemu/atomic.h
> +++ b/include/qemu/atomic.h
> @@ -42,30 +42,34 @@
>   * loads/stores past the atomic operation load/store. However there is
>   * no explicit memory barrier for the processor.
>   */
> -#define atomic_read(ptr)                          \
> -    ({                                            \
> -    typeof(*ptr) _val;                            \
> -     __atomic_load(ptr, &_val, __ATOMIC_RELAXED); \
> -    _val;                                         \
> +#define atomic_read(ptr)                              \
> +    ({                                                \
> +    QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *)); \
> +    typeof(*ptr) _val;                                \
> +     __atomic_load(ptr, &_val, __ATOMIC_RELAXED);     \
> +    _val;                                             \
>      })
>
> -#define atomic_set(ptr, i)  do {                  \
> -    typeof(*ptr) _val = (i);                      \
> -    __atomic_store(ptr, &_val, __ATOMIC_RELAXED); \
> +#define atomic_set(ptr, i)  do {                      \
> +    QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *)); \
> +    typeof(*ptr) _val = (i);                          \
> +    __atomic_store(ptr, &_val, __ATOMIC_RELAXED);     \
>  } while(0)
>
>  /* Atomic RCU operations imply weak memory barriers */
>
> -#define atomic_rcu_read(ptr)                      \
> -    ({                                            \
> -    typeof(*ptr) _val;                            \
> -     __atomic_load(ptr, &_val, __ATOMIC_CONSUME); \
> -    _val;                                         \
> +#define atomic_rcu_read(ptr)                          \
> +    ({                                                \
> +    QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *)); \
> +    typeof(*ptr) _val;                                \
> +    __atomic_load(ptr, &_val, __ATOMIC_CONSUME);      \
> +    _val;                                             \
>      })
>
> -#define atomic_rcu_set(ptr, i)  do {                    \
> -    typeof(*ptr) _val = (i);                            \
> -    __atomic_store(ptr, &_val, __ATOMIC_RELEASE);       \
> +#define atomic_rcu_set(ptr, i) do {                   \
> +    QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *)); \
> +    typeof(*ptr) _val = (i);                          \
> +    __atomic_store(ptr, &_val, __ATOMIC_RELEASE);     \
>  } while(0)
>
>  /* atomic_mb_read/set semantics map Java volatile variables. They are
> @@ -79,6 +83,7 @@
>  #if defined(_ARCH_PPC)
>  #define atomic_mb_read(ptr)                             \
>      ({                                                  \
> +    QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *));   \
>      typeof(*ptr) _val;                                  \
>       __atomic_load(ptr, &_val, __ATOMIC_RELAXED);       \
>       smp_rmb();                                         \
> @@ -86,22 +91,25 @@
>      })
>
>  #define atomic_mb_set(ptr, i)  do {                     \
> +    QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *));   \
>      typeof(*ptr) _val = (i);                            \
>      smp_wmb();                                          \
>      __atomic_store(ptr, &_val, __ATOMIC_RELAXED);       \
>      smp_mb();                                           \
>  } while(0)
>  #else
> -#define atomic_mb_read(ptr)                       \
> -    ({                                            \
> -    typeof(*ptr) _val;                            \
> -     __atomic_load(ptr, &_val, __ATOMIC_SEQ_CST); \
> -    _val;                                         \
> +#define atomic_mb_read(ptr)                             \
> +    ({                                                  \
> +    QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *));   \
> +    typeof(*ptr) _val;                                  \
> +    __atomic_load(ptr, &_val, __ATOMIC_SEQ_CST);        \
> +    _val;                                               \
>      })
>
> -#define atomic_mb_set(ptr, i)  do {               \
> -    typeof(*ptr) _val = (i);                      \
> -    __atomic_store(ptr, &_val, __ATOMIC_SEQ_CST); \
> +#define atomic_mb_set(ptr, i)  do {                     \
> +    QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *));   \
> +    typeof(*ptr) _val = (i);                            \
> +    __atomic_store(ptr, &_val, __ATOMIC_SEQ_CST);       \
>  } while(0)
>  #endif
>
> @@ -109,6 +117,7 @@
>  /* All the remaining operations are fully sequentially consistent */
>
>  #define atomic_xchg(ptr, i)    ({                           \
> +    QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *));       \
>      typeof(*ptr) _new = (i), _old;                          \
>      __atomic_exchange(ptr, &_new, &_old, __ATOMIC_SEQ_CST); \
>      _old;                                                   \
> @@ -117,6 +126,7 @@
>  /* Returns the eventual value, failed or not */
>  #define atomic_cmpxchg(ptr, old, new)                                   \
>      ({                                                                  \
> +    QEMU_BUILD_BUG_ON(sizeof(*ptr) > sizeof(void *));                   \
>      typeof(*ptr) _old = (old), _new = (new);                            \
>      __atomic_compare_exchange(ptr, &_old, &_new, false,                 \
>                                __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);      \


--
Alex Bennée



reply via email to

[Prev in Thread] Current Thread [Next in Thread]