mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 06:40:11 +01:00
Linux: Change minimum priority threads from SCHED_IDLE to nice 19 SCHED_BATCH.
SCHED_IDLE on linux can lead to extraordinarily long periods of no scheduling leading to starvation of minimum priority threads for such an extended period that it can eventually lead to GUI stalls. Switch to renicing the threads to the lowest priority and use the SCHED_BATCH scheduling policy which is a hint to the scheduler that this is latency insensitive thread instead. This change has been confirmed to address unexpected GUI related stalls in mesa applications across a range of different linux kernels. Signed-off-by: Con Kolivas <kernel@kolivas.org> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4912>
This commit is contained in:
parent
f66bf5ba44
commit
78d267e6da
1 changed files with 18 additions and 3 deletions
|
|
@ -33,6 +33,13 @@
|
|||
#include "util/u_thread.h"
|
||||
#include "u_process.h"
|
||||
|
||||
#if defined(__linux__)
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/syscall.h>
|
||||
#endif
|
||||
|
||||
|
||||
/* Define 256MB */
|
||||
#define S_256MB (256 * 1024 * 1024)
|
||||
|
||||
|
|
@ -258,6 +265,13 @@ util_queue_thread_func(void *input)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(__linux__)
|
||||
if (queue->flags & UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY) {
|
||||
/* The nice() function can only set a maximum of 19. */
|
||||
setpriority(PRIO_PROCESS, syscall(SYS_gettid), 19);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (strlen(queue->name) > 0) {
|
||||
char name[16];
|
||||
snprintf(name, sizeof(name), "%s%i", queue->name, thread_index);
|
||||
|
|
@ -331,16 +345,17 @@ util_queue_create_thread(struct util_queue *queue, unsigned index)
|
|||
}
|
||||
|
||||
if (queue->flags & UTIL_QUEUE_INIT_USE_MINIMUM_PRIORITY) {
|
||||
#if defined(__linux__) && defined(SCHED_IDLE)
|
||||
#if defined(__linux__) && defined(SCHED_BATCH)
|
||||
struct sched_param sched_param = {0};
|
||||
|
||||
/* The nice() function can only set a maximum of 19.
|
||||
* SCHED_IDLE is the same as nice = 20.
|
||||
* SCHED_BATCH gives the scheduler a hint that this is a latency
|
||||
* insensitive thread.
|
||||
*
|
||||
* Note that Linux only allows decreasing the priority. The original
|
||||
* priority can't be restored.
|
||||
*/
|
||||
pthread_setschedparam(queue->threads[index], SCHED_IDLE, &sched_param);
|
||||
pthread_setschedparam(queue->threads[index], SCHED_BATCH, &sched_param);
|
||||
#endif
|
||||
}
|
||||
return true;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue