Skip to content

egl,dri: fix glthread deadlock when EGL multi thread shared context

Qiang Yu requested to merge yuq825/mesa:topic/fix-glthread-deadlock into main

This fixes dEQP EGL tests when glthread is enabled:

    dEQP-EGL.functional.sharing.gles2.multithread.random.images.copyteximage2d.*
    dEQP-EGL.functional.sharing.gles2.multithread.random.images.texsubimage2d.*
    dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.teximage2d.*
    dEQP-EGL.functional.sharing.gles2.multithread.random_egl_server_sync.images.texsubimage2d.*
    dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.images.copyteximage2d.*
    dEQP-EGL.functional.sharing.gles2.multithread.random_egl_sync.images.texsubimage2d.*

Deadlock happens when:

Thread A: call EGL context functions which will involve _mesa_glthread_finish(), like eglMakeCurrent() and eglDestroyContext(). It will hold the EGLDisplay.Mutex and wait on glthread job queue empty (util_queue_fence_wait(&last->fence)). glthread job thread executes batch holding gl_context.Shared.TexMutex (glthread_unmarshal_batch()).

Thread B: call EGLImage import functions like EGLImageTargetTexture2DOES() which will hold gl_context.Shared.TexMutex (egl_image_target_texture()) then validate EGLImage and hold EGLDisplay.Mutex (dri2_lookup_egl_image()).

This fixes the deadlock by moving the EGLImage validation out of gl_context.Shared.TexMutex lock area.

Send out this for feedback if this is the right direction or there is other better method.

CC: @mareko

Edited by Marek Olšák

Merge request reports