]> www.infradead.org Git - users/hch/configfs.git/commitdiff
nouveau: rip out busy fence waits
authorDave Airlie <airlied@redhat.com>
Wed, 17 Apr 2024 05:40:32 +0000 (15:40 +1000)
committerDanilo Krummrich <dakr@redhat.com>
Mon, 17 Jun 2024 15:05:29 +0000 (17:05 +0200)
I'm pretty sure this optimisation is actually not a great idea,
and is racy with other things waiting for fences.

Just nuke it, there should be no need to do fence waits in a
busy CPU loop.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Ben Skeggs <bskeggs@nvidia.com>
Signed-off-by: Danilo Krummrich <dakr@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240417054032.3145721-1-airlied@gmail.com
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_chan.c
drivers/gpu/drm/nouveau/nouveau_dmem.c
drivers/gpu/drm/nouveau/nouveau_fence.c
drivers/gpu/drm/nouveau/nouveau_fence.h
drivers/gpu/drm/nouveau/nouveau_gem.c

index 70fb003a66669a1638b22514e7d385494a5d73cc..0712d0b15170260bf53e63831b9638ccab8bd6db 100644 (file)
@@ -898,7 +898,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict,
         * Without this the operation can timeout and we'll fallback to a
         * software copy, which might take several minutes to finish.
         */
-       nouveau_fence_wait(fence, false, false);
+       nouveau_fence_wait(fence, false);
        ret = ttm_bo_move_accel_cleanup(bo, &fence->base, evict, false,
                                        new_reg);
        nouveau_fence_unref(&fence);
index 7c97b288680760819971a7823221da5e7179c7ab..66fca95c10c761ea597bbb742fc97b2bcd577511 100644 (file)
@@ -72,7 +72,7 @@ nouveau_channel_idle(struct nouveau_channel *chan)
 
                ret = nouveau_fence_new(&fence, chan);
                if (!ret) {
-                       ret = nouveau_fence_wait(fence, false, false);
+                       ret = nouveau_fence_wait(fence, false);
                        nouveau_fence_unref(&fence);
                }
 
index 6fb65b01d778049f9166681e26a7fdf85891e475..6719353e2e13f997cdf9732fc6054b75f49f97ea 100644 (file)
@@ -128,7 +128,7 @@ static void nouveau_dmem_page_free(struct page *page)
 static void nouveau_dmem_fence_done(struct nouveau_fence **fence)
 {
        if (fence) {
-               nouveau_fence_wait(*fence, true, false);
+               nouveau_fence_wait(*fence, false);
                nouveau_fence_unref(fence);
        } else {
                /*
index 93f08f9479d89bfda87fbeef246c9dd702f047a1..ba469767a20fd9d203c7e2eac56250c80d1de1e8 100644 (file)
@@ -311,39 +311,11 @@ nouveau_fence_wait_legacy(struct dma_fence *f, bool intr, long wait)
        return timeout - t;
 }
 
-static int
-nouveau_fence_wait_busy(struct nouveau_fence *fence, bool intr)
-{
-       int ret = 0;
-
-       while (!nouveau_fence_done(fence)) {
-               if (time_after_eq(jiffies, fence->timeout)) {
-                       ret = -EBUSY;
-                       break;
-               }
-
-               __set_current_state(intr ?
-                                   TASK_INTERRUPTIBLE :
-                                   TASK_UNINTERRUPTIBLE);
-
-               if (intr && signal_pending(current)) {
-                       ret = -ERESTARTSYS;
-                       break;
-               }
-       }
-
-       __set_current_state(TASK_RUNNING);
-       return ret;
-}
-
 int
-nouveau_fence_wait(struct nouveau_fence *fence, bool lazy, bool intr)
+nouveau_fence_wait(struct nouveau_fence *fence, bool intr)
 {
        long ret;
 
-       if (!lazy)
-               return nouveau_fence_wait_busy(fence, intr);
-
        ret = dma_fence_wait_timeout(&fence->base, intr, 15 * HZ);
        if (ret < 0)
                return ret;
index 8bc065acfe35870f62bd0f2e37df47a35eb8ae38..1b63197b744a207030b4e0b9235c72cfbbc93866 100644 (file)
@@ -23,7 +23,7 @@ void nouveau_fence_unref(struct nouveau_fence **);
 
 int  nouveau_fence_emit(struct nouveau_fence *);
 bool nouveau_fence_done(struct nouveau_fence *);
-int  nouveau_fence_wait(struct nouveau_fence *, bool lazy, bool intr);
+int  nouveau_fence_wait(struct nouveau_fence *, bool intr);
 int  nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool exclusive, bool intr);
 
 struct nouveau_fence_chan {
index 5a887d67dc0e8c71cf1987acb68f48f4bbf05d70..2e535caa7d6ea2ecc2582755fb1c271f99b94346 100644 (file)
@@ -928,7 +928,7 @@ revalidate:
        }
 
        if (sync) {
-               if (!(ret = nouveau_fence_wait(fence, false, false))) {
+               if (!(ret = nouveau_fence_wait(fence, false))) {
                        if ((ret = dma_fence_get_status(&fence->base)) == 1)
                                ret = 0;
                }