From: Marek Olšák Date: Wed, 31 May 2017 20:04:29 +0000 (+0200) Subject: util/u_queue: add an option to set the minimum thread priority X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=89b6c93ae3135a44b1aa2ce9285502a3898920bc;p=mesa.git util/u_queue: add an option to set the minimum thread priority Reviewed-by: Nicolai Hähnle --- diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c index 929e186683f..3038fc66830 100644 --- a/src/gallium/auxiliary/util/u_threaded_context.c +++ b/src/gallium/auxiliary/util/u_threaded_context.c @@ -2203,7 +2203,7 @@ threaded_context_create(struct pipe_context *pipe, * from the queue before being executed, so keep one tc_batch slot for that * execution. Also, keep one unused slot for an unflushed batch. */ - if (!util_queue_init(&tc->queue, "gallium_drv", TC_MAX_BATCHES - 2, 1)) + if (!util_queue_init(&tc->queue, "gallium_drv", TC_MAX_BATCHES - 2, 1, 0)) goto fail; for (unsigned i = 0; i < TC_MAX_BATCHES; i++) { diff --git a/src/gallium/drivers/freedreno/freedreno_batch.c b/src/gallium/drivers/freedreno/freedreno_batch.c index 9871447497e..7c7a45be84d 100644 --- a/src/gallium/drivers/freedreno/freedreno_batch.c +++ b/src/gallium/drivers/freedreno/freedreno_batch.c @@ -276,7 +276,7 @@ batch_flush(struct fd_batch *batch) fd_batch_reference(&tmp, batch); if (!util_queue_is_initialized(&batch->ctx->flush_queue)) - util_queue_init(&batch->ctx->flush_queue, "flush_queue", 16, 1); + util_queue_init(&batch->ctx->flush_queue, "flush_queue", 16, 1, 0); util_queue_add_job(&batch->ctx->flush_queue, batch, &batch->flush_fence, diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 0c2f6b37dba..47426b41da6 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -890,7 +890,7 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws) num_compiler_threads = MIN2(num_cpus, ARRAY_SIZE(sscreen->tm)); if (!util_queue_init(&sscreen->shader_compiler_queue, "si_shader", - 32, num_compiler_threads)) { + 32, num_compiler_threads, 0)) { si_destroy_shader_cache(sscreen); FREE(sscreen); return NULL; diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c index c8bd60efdce..43f2ed2fbf4 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c @@ -305,7 +305,7 @@ amdgpu_winsys_create(int fd, radeon_screen_create_t screen_create) (void) mtx_init(&ws->global_bo_list_lock, mtx_plain); (void) mtx_init(&ws->bo_fence_lock, mtx_plain); - if (!util_queue_init(&ws->cs_queue, "amdgpu_cs", 8, 1)) { + if (!util_queue_init(&ws->cs_queue, "amdgpu_cs", 8, 1, 0)) { amdgpu_winsys_destroy(&ws->base); mtx_unlock(&dev_tab_mutex); return NULL; diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c index a485615ae4f..9bbffa514a4 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c @@ -821,7 +821,7 @@ radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create) ws->info.gart_page_size = sysconf(_SC_PAGESIZE); if (ws->num_cpus > 1 && debug_get_option_thread()) - util_queue_init(&ws->cs_queue, "radeon_cs", 8, 1); + util_queue_init(&ws->cs_queue, "radeon_cs", 8, 1, 0); /* Create the screen at the end. The winsys must be initialized * completely. diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index 138d7ec174f..b2229874e01 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -342,7 +342,7 @@ disk_cache_create(const char *gpu_name, const char *timestamp, * really care about getting things to disk quickly just that it's not * blocking other tasks. */ - util_queue_init(&cache->cache_queue, "disk_cache", 32, 1); + util_queue_init(&cache->cache_queue, "disk_cache", 32, 1, 0); /* Create driver id keys */ size_t ts_size = strlen(timestamp) + 1; diff --git a/src/util/u_queue.c b/src/util/u_queue.c index 01c3a96d5f3..94fe2202a2c 100644 --- a/src/util/u_queue.c +++ b/src/util/u_queue.c @@ -147,6 +147,21 @@ util_queue_thread_func(void *input) u_thread_setname(name); } + if (queue->flags & UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY) { +#if defined(__linux__) + struct sched_param sched_param = {0}; + + /* The nice() function can only set a maximum of 19. + * SCHED_IDLE is the same as nice = 20. + * + * Note that Linux only allows decreasing the priority. The original + * priority can't be restored. + */ + pthread_setschedparam(queue->threads[thread_index], SCHED_IDLE, + &sched_param); +#endif + } + while (1) { struct util_queue_job job; @@ -197,13 +212,15 @@ bool util_queue_init(struct util_queue *queue, const char *name, unsigned max_jobs, - unsigned num_threads) + unsigned num_threads, + unsigned flags) { unsigned i; memset(queue, 0, sizeof(*queue)); queue->name = name; queue->num_threads = num_threads; + queue->flags = flags; queue->max_jobs = max_jobs; queue->jobs = (struct util_queue_job*) diff --git a/src/util/u_queue.h b/src/util/u_queue.h index 9876865c651..916802c96d1 100644 --- a/src/util/u_queue.h +++ b/src/util/u_queue.h @@ -42,6 +42,8 @@ extern "C" { #endif +#define UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY (1 << 0) + /* Job completion fence. * Put this into your job structure. */ @@ -69,6 +71,7 @@ struct util_queue { thrd_t *threads; int num_queued; unsigned num_threads; + unsigned flags; int kill_threads; int max_jobs; int write_idx, read_idx; /* ring buffer pointers */ @@ -81,7 +84,8 @@ struct util_queue { bool util_queue_init(struct util_queue *queue, const char *name, unsigned max_jobs, - unsigned num_threads); + unsigned num_threads, + unsigned flags); void util_queue_destroy(struct util_queue *queue); void util_queue_fence_init(struct util_queue_fence *fence); void util_queue_fence_destroy(struct util_queue_fence *fence);