util/u_queue: track job size and limit the size of queue growth
authorTimothy Arceri <tarceri@itsqueeze.com>
Tue, 3 Sep 2019 03:05:08 +0000 (13:05 +1000)
committerTimothy Arceri <tarceri@itsqueeze.com>
Thu, 19 Sep 2019 05:03:27 +0000 (15:03 +1000)
commit896885025f37484cc693f480ee797e83e3a6f9ee
tree708b2933294371f2eda952e48fba1bd0b37a54ed
parenta2ee29c3daad8fcfe98204f9d8927b0b1a637713
util/u_queue: track job size and limit the size of queue growth

When both UTIL_QUEUE_INIT_RESIZE_IF_FULL and
UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY are set, we can get into a
situation where the queue never executes and grows to a huge size
due to all other threads being busy.

This is the case with the shader cache when attempting to compile a
huge number of shaders up front. If all threads are busy compiling
shaders the cache queues memory use can climb into the many GBs
very fast.

The use of these two flags with the shader cache is intended to
allow shaders compiled at runtime to be compiled as fast as possible.
To avoid huge memory use but still allow the queue to perform
optimally in the run time compilation case, we now add the ability
to track memory consumed by the jobs in the queue and limit it to
a hardcoded 256MB which should be more than enough.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/auxiliary/util/u_threaded_context.c
src/gallium/drivers/freedreno/freedreno_batch.c
src/gallium/drivers/radeonsi/si_state_shaders.c
src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
src/gallium/winsys/radeon/drm/radeon_drm_cs.c
src/mesa/main/glthread.c
src/util/disk_cache.c
src/util/u_queue.c
src/util/u_queue.h