Mesa (main): util/queue: fix a data race detected by TSAN when finishing the queue

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Nov 19 08:48:57 UTC 2021


Module: Mesa
Branch: main
Commit: 04c90f292e1b6011f6c26eda957a61888d3a57da
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=04c90f292e1b6011f6c26eda957a61888d3a57da

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Thu Nov 18 16:58:42 2021 +0100

util/queue: fix a data race detected by TSAN when finishing the queue

Thread sanitizer complains if it detects that the pthread_barrier
is destroyed when a thread might still blocked on the barrier.

Fix this by destroying the barrier only if pthread_barrier_wait
returns PTHREAD_BARRIER_SERIAL_THREAD which is the value for success.

In practice this shouldn't fix anything serious given that this code
is only called when the disk cache is destroyed.

Original patch from Timothy Arceri.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/4342
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13861>

---

 src/util/u_queue.c  | 5 ++---
 src/util/u_thread.h | 8 +++++---
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/util/u_queue.c b/src/util/u_queue.c
index f0eb7895594..d35b8f2f29b 100644
--- a/src/util/u_queue.c
+++ b/src/util/u_queue.c
@@ -527,7 +527,8 @@ static void
 util_queue_finish_execute(void *data, void *gdata, int num_thread)
 {
    util_barrier *barrier = data;
-   util_barrier_wait(barrier);
+   if (util_barrier_wait(barrier))
+      util_barrier_destroy(barrier);
 }
 
 void
@@ -705,8 +706,6 @@ util_queue_finish(struct util_queue *queue)
    }
    simple_mtx_unlock(&queue->finish_lock);
 
-   util_barrier_destroy(&barrier);
-
    free(fences);
 }
 
diff --git a/src/util/u_thread.h b/src/util/u_thread.h
index 013e8be6a6e..0fb474f32ba 100644
--- a/src/util/u_thread.h
+++ b/src/util/u_thread.h
@@ -296,9 +296,9 @@ static inline void util_barrier_destroy(util_barrier *barrier)
    pthread_barrier_destroy(barrier);
 }
 
-static inline void util_barrier_wait(util_barrier *barrier)
+static inline bool util_barrier_wait(util_barrier *barrier)
 {
-   pthread_barrier_wait(barrier);
+   return pthread_barrier_wait(barrier) == PTHREAD_BARRIER_SERIAL_THREAD;
 }
 
 
@@ -328,7 +328,7 @@ static inline void util_barrier_destroy(util_barrier *barrier)
    cnd_destroy(&barrier->condvar);
 }
 
-static inline void util_barrier_wait(util_barrier *barrier)
+static inline bool util_barrier_wait(util_barrier *barrier)
 {
    mtx_lock(&barrier->mutex);
 
@@ -348,6 +348,8 @@ static inline void util_barrier_wait(util_barrier *barrier)
    }
 
    mtx_unlock(&barrier->mutex);
+
+   return true;
 }
 
 #endif



More information about the mesa-commit mailing list