Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Marek Olšák committed Oct 7, 2018
1 parent 066aa44 commit d877451
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/gallium/drivers/radeonsi/si_pipe.c
Expand Up @@ -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;
Expand All @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion src/util/disk_cache.c
Expand Up @@ -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;

Expand Down
14 changes: 14 additions & 0 deletions src/util/u_queue.c
Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions src/util/u_queue.h
Expand Up @@ -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
Expand Down

0 comments on commit d877451

Please sign in to comment.