Mesa (master): llvmpipe: Check thread creation errors

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Nov 15 01:43:40 UTC 2019


Module: Mesa
Branch: master
Commit: 9a80b7fd8f282d4b448f826ff88c8770c079fb72
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9a80b7fd8f282d4b448f826ff88c8770c079fb72

Author: Nathan Kidd <nkidd at opentext.com>
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 <nkidd at opentext.com>
Reviewed-by: Roland Scheidegger <sroland at vmware.com>

---

 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;
+      }
    }
 }
 




More information about the mesa-commit mailing list