drm/xe: Propagate error from bind operations to async fence
authorMatthew Brost <matthew.brost@intel.com>
Wed, 25 Jan 2023 18:36:05 +0000 (10:36 -0800)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 19 Dec 2023 23:27:46 +0000 (18:27 -0500)
If an bind operation fails we need to report it via the async fence.

Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
drivers/gpu/drm/xe/xe_vm.c

index 4fc8e24..8ba548e 100644 (file)
@@ -1641,6 +1641,7 @@ err_fences:
 
 struct async_op_fence {
        struct dma_fence fence;
+       struct dma_fence *wait_fence;
        struct dma_fence_cb cb;
        struct xe_vm *vm;
        wait_queue_head_t wq;
@@ -1668,8 +1669,10 @@ static void async_op_fence_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
        struct async_op_fence *afence =
                container_of(cb, struct async_op_fence, cb);
 
+       afence->fence.error = afence->wait_fence->error;
        dma_fence_signal(&afence->fence);
        xe_vm_put(afence->vm);
+       dma_fence_put(afence->wait_fence);
        dma_fence_put(&afence->fence);
 }
 
@@ -1685,13 +1688,17 @@ static void add_async_op_fence_cb(struct xe_vm *vm,
                wake_up_all(&afence->wq);
        }
 
+       afence->wait_fence = dma_fence_get(fence);
        afence->vm = xe_vm_get(vm);
        dma_fence_get(&afence->fence);
        ret = dma_fence_add_callback(fence, &afence->cb, async_op_fence_cb);
-       if (ret == -ENOENT)
+       if (ret == -ENOENT) {
+               afence->fence.error = afence->wait_fence->error;
                dma_fence_signal(&afence->fence);
+       }
        if (ret) {
                xe_vm_put(vm);
+               dma_fence_put(afence->wait_fence);
                dma_fence_put(&afence->fence);
        }
        XE_WARN_ON(ret && ret != -ENOENT);