Mesa (master): util: Use explicit relaxed reads for u_queue

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jan 28 18:25:27 UTC 2021


Module: Mesa
Branch: master
Commit: 65ef4a2e02fbb89d02024d0c4afcd2c0fdd75e48
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=65ef4a2e02fbb89d02024d0c4afcd2c0fdd75e48

Author: Witold Baryluk <witold.baryluk at gmail.com>
Date:   Thu Jan 28 17:55:29 2021 +0000

util: Use explicit relaxed reads for u_queue

These are no-op, but make clang thread sanitizer happy.

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8230>

---

 src/util/u_atomic.h | 4 ++++
 src/util/u_queue.c  | 4 ++--
 src/util/u_queue.h  | 4 ++--
 3 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/util/u_atomic.h b/src/util/u_atomic.h
index db56835e9d4..0bd6a4aaa19 100644
--- a/src/util/u_atomic.h
+++ b/src/util/u_atomic.h
@@ -42,6 +42,7 @@
 /* The builtins with explicit memory model are available since GCC 4.7. */
 #define p_atomic_set(_v, _i) __atomic_store_n((_v), (_i), __ATOMIC_RELEASE)
 #define p_atomic_read(_v) __atomic_load_n((_v), __ATOMIC_ACQUIRE)
+#define p_atomic_read_relaxed(_v) __atomic_load_n((_v), __ATOMIC_RELAXED)
 #define p_atomic_dec_zero(v) (__atomic_sub_fetch((v), 1, __ATOMIC_ACQ_REL) == 0)
 #define p_atomic_inc(v) (void) __atomic_add_fetch((v), 1, __ATOMIC_ACQ_REL)
 #define p_atomic_dec(v) (void) __atomic_sub_fetch((v), 1, __ATOMIC_ACQ_REL)
@@ -56,6 +57,7 @@
 
 #define p_atomic_set(_v, _i) (*(_v) = (_i))
 #define p_atomic_read(_v) (*(_v))
+#define p_atomic_read_relaxed(_v) (*(_v))
 #define p_atomic_dec_zero(v) (__sync_sub_and_fetch((v), 1) == 0)
 #define p_atomic_inc(v) (void) __sync_add_and_fetch((v), 1)
 #define p_atomic_dec(v) (void) __sync_sub_and_fetch((v), 1)
@@ -86,6 +88,7 @@
 
 #define p_atomic_set(_v, _i) (*(_v) = (_i))
 #define p_atomic_read(_v) (*(_v))
+#define p_atomic_read_relaxed(_v) (*(_v))
 #define p_atomic_dec_zero(_v) (p_atomic_dec_return(_v) == 0)
 #define p_atomic_inc(_v) ((void) p_atomic_inc_return(_v))
 #define p_atomic_dec(_v) ((void) p_atomic_dec_return(_v))
@@ -123,6 +126,7 @@
 
 #define p_atomic_set(_v, _i) (*(_v) = (_i))
 #define p_atomic_read(_v) (*(_v))
+#define p_atomic_read_relaxed(_v) (*(_v))
 
 #define p_atomic_dec_zero(_v) \
    (p_atomic_dec_return(_v) == 0)
diff --git a/src/util/u_queue.c b/src/util/u_queue.c
index cae4cc316d2..0cf381b18aa 100644
--- a/src/util/u_queue.c
+++ b/src/util/u_queue.c
@@ -112,7 +112,7 @@ static bool
 do_futex_fence_wait(struct util_queue_fence *fence,
                     bool timeout, int64_t abs_timeout)
 {
-   uint32_t v = fence->val;
+   uint32_t v = p_atomic_read_relaxed(&fence->val);
    struct timespec ts;
    ts.tv_sec = abs_timeout / (1000*1000*1000);
    ts.tv_nsec = abs_timeout % (1000*1000*1000);
@@ -130,7 +130,7 @@ do_futex_fence_wait(struct util_queue_fence *fence,
             return false;
       }
 
-      v = fence->val;
+      v = p_atomic_read_relaxed(&fence->val);
    }
 
    return true;
diff --git a/src/util/u_queue.h b/src/util/u_queue.h
index 5943df4fcbb..e254af46b0a 100644
--- a/src/util/u_queue.h
+++ b/src/util/u_queue.h
@@ -78,7 +78,7 @@ util_queue_fence_init(struct util_queue_fence *fence)
 static inline void
 util_queue_fence_destroy(struct util_queue_fence *fence)
 {
-   assert(fence->val == 0);
+   assert(p_atomic_read_relaxed(&fence->val) == 0);
    /* no-op */
 }
 
@@ -113,7 +113,7 @@ util_queue_fence_reset(struct util_queue_fence *fence)
 static inline bool
 util_queue_fence_is_signalled(struct util_queue_fence *fence)
 {
-   return fence->val == 0;
+   return p_atomic_read_relaxed(&fence->val) == 0;
 }
 #endif
 



More information about the mesa-commit mailing list