Module: Mesa Branch: master Commit: 9a80b7fd8f282d4b448f826ff88c8770c079fb72 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9a80b7fd8f282d4b448f826ff88c8770c079fb72
Author: Nathan Kidd <[email protected]> Date: Fri Nov 15 02:35:11 2019 +0100 llvmpipe: Check thread creation errors In the case of glibc, pthread_t is internally a pointer. If lp_rast_destroy() passes a 0-value pthread_t to pthread_join(), the latter will SEGV dereferencing it. pthread_create() can fail if either the user's ulimit -u or Linux kernel's /proc/sys/kernel/threads-max is reached. Choosing to continue, rather than fail, on theory that it is better to run with the one main thread, than not run at all. Keeping as many threads as we got, since lack of threads severely degrades llvmpipe performance. Signed-off-by: Nathan Kidd <[email protected]> Reviewed-by: Roland Scheidegger <[email protected]> --- src/gallium/drivers/llvmpipe/lp_rast.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c index d50e92b2b61..ef783ea6fb1 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast.c +++ b/src/gallium/drivers/llvmpipe/lp_rast.c @@ -867,6 +867,10 @@ create_rast_threads(struct lp_rasterizer *rast) pipe_semaphore_init(&rast->tasks[i].work_done, 0); rast->threads[i] = u_thread_create(thread_function, (void *) &rast->tasks[i]); + if (!rast->threads[i]) { + rast->num_threads = i; /* previous thread is max */ + break; + } } } _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
