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