Mesa (master): util/u_queue: add UTIL_QUEUE_INIT_SET_FULL_THREAD_AFFINITY
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sun Oct 7 02:06:43 UTC 2018
Module: Mesa
Branch: master
Commit: d877451b48a59ab0f9a4210fc736f51da5851c9a
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d877451b48a59ab0f9a4210fc736f51da5851c9a
Author: Marek Olšák <marek.olsak at amd.com>
Date: Mon Oct 1 15:51:06 2018 -0400
util/u_queue: add UTIL_QUEUE_INIT_SET_FULL_THREAD_AFFINITY
Initial version discussed with Rob Clark under a different patch name.
This approach leaves his driver unaffected.
---
src/gallium/drivers/radeonsi/si_pipe.c | 4 +++-
src/util/disk_cache.c | 3 ++-
src/util/u_queue.c | 14 ++++++++++++++
src/util/u_queue.h | 1 +
4 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index 69f649faed..6c05440b0d 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -890,7 +890,8 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws,
if (!util_queue_init(&sscreen->shader_compiler_queue, "sh",
64, num_comp_hi_threads,
- UTIL_QUEUE_INIT_RESIZE_IF_FULL)) {
+ UTIL_QUEUE_INIT_RESIZE_IF_FULL |
+ UTIL_QUEUE_INIT_SET_FULL_THREAD_AFFINITY)) {
si_destroy_shader_cache(sscreen);
FREE(sscreen);
return NULL;
@@ -900,6 +901,7 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws,
"shlo",
64, num_comp_lo_threads,
UTIL_QUEUE_INIT_RESIZE_IF_FULL |
+ UTIL_QUEUE_INIT_SET_FULL_THREAD_AFFINITY |
UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY)) {
si_destroy_shader_cache(sscreen);
FREE(sscreen);
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index 368ec41792..0aa2646a9b 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -378,7 +378,8 @@ disk_cache_create(const char *gpu_name, const char *driver_id,
*/
util_queue_init(&cache->cache_queue, "disk$", 32, 1,
UTIL_QUEUE_INIT_RESIZE_IF_FULL |
- UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY);
+ UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY |
+ UTIL_QUEUE_INIT_SET_FULL_THREAD_AFFINITY);
cache->path_init_failed = false;
diff --git a/src/util/u_queue.c b/src/util/u_queue.c
index 22d2cdd0fa..3812c824b6 100644
--- a/src/util/u_queue.c
+++ b/src/util/u_queue.c
@@ -239,6 +239,20 @@ util_queue_thread_func(void *input)
free(input);
+#ifdef HAVE_PTHREAD_SETAFFINITY
+ if (queue->flags & UTIL_QUEUE_INIT_SET_FULL_THREAD_AFFINITY) {
+ /* Don't inherit the thread affinity from the parent thread.
+ * Set the full mask.
+ */
+ cpu_set_t cpuset;
+ CPU_ZERO(&cpuset);
+ for (unsigned i = 0; i < CPU_SETSIZE; i++)
+ CPU_SET(i, &cpuset);
+
+ pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset);
+ }
+#endif
+
if (strlen(queue->name) > 0) {
char name[16];
util_snprintf(name, sizeof(name), "%s%i", queue->name, thread_index);
diff --git a/src/util/u_queue.h b/src/util/u_queue.h
index 714d9243f0..4e63a76aab 100644
--- a/src/util/u_queue.h
+++ b/src/util/u_queue.h
@@ -48,6 +48,7 @@ extern "C" {
#define UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY (1 << 0)
#define UTIL_QUEUE_INIT_RESIZE_IF_FULL (1 << 1)
+#define UTIL_QUEUE_INIT_SET_FULL_THREAD_AFFINITY (1 << 2)
#if defined(__GNUC__) && defined(HAVE_LINUX_FUTEX_H)
#define UTIL_QUEUE_FENCE_FUTEX
More information about the mesa-commit
mailing list