]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/gpu/drm/nouveau/nouveau_fence.c
drm/nouveau: add more fine-grained locking to channel list + structures
[mv-sheeva.git] / drivers / gpu / drm / nouveau / nouveau_fence.c
index ab1bbfbf266e6a63755264ad461484f3608a10c1..42694b122eefd69ec35897dde5d22590c7177bfd 100644 (file)
@@ -393,8 +393,18 @@ nouveau_fence_sync(struct nouveau_fence *fence,
                return nouveau_fence_wait(fence, NULL, false, false);
        }
 
+       /* try to take wchan's mutex, if we can't take it right away
+        * we have to fallback to software sync to prevent locking
+        * order issues
+        */
+       if (!mutex_trylock(&wchan->mutex)) {
+               free_semaphore(&sema->ref);
+               return nouveau_fence_wait(fence, NULL, false, false);
+       }
+
        /* Make wchan wait until it gets signalled */
        ret = emit_semaphore(wchan, NV_SW_SEMAPHORE_ACQUIRE, sema);
+       mutex_unlock(&wchan->mutex);
        if (ret)
                goto out;