qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, sbruno@freebsd.org, peter.maydell@linaro.org
Subject: Re: [Qemu-devel] [PATCH v1 2/2] include/qemu/atomic: add compile time asserts
Date: Fri, 01 Apr 2016 16:03:01 +0100	[thread overview]
Message-ID: <87pou9fk2i.fsf@linaro.org> (raw)
In-Reply-To: <1458577386-9984-3-git-send-email-alex.bennee@linaro.org>


Alex Bennée <alex.bennee@linaro.org> 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 <alex.bennee@linaro.org>

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	other threads:[~2016-04-01 15:03 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-21 16:23 [Qemu-devel] [PATCH v1 0/2] Fix for FreeBSD compile on i386 Alex Bennée
2016-03-21 16:23 ` [Qemu-devel] [PATCH v1 1/2] cpus: don't use atomic_read for vm_clock_warp_start Alex Bennée
2016-03-21 16:26   ` Paolo Bonzini
2016-03-21 17:45     ` Alex Bennée
2016-03-21 16:23 ` [Qemu-devel] [PATCH v1 2/2] include/qemu/atomic: add compile time asserts Alex Bennée
2016-04-01 15:03   ` Alex Bennée [this message]
2016-04-04  8:33     ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87pou9fk2i.fsf@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=sbruno@freebsd.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).