From 74a8b2c6e2d6f17fcd9977de298eff20a46b0af7 Mon Sep 17 00:00:00 2001 From: Matthew Brost Date: Wed, 25 Jan 2023 10:36:05 -0800 Subject: [PATCH] drm/xe: Propagate error from bind operations to async fence If an bind operation fails we need to report it via the async fence. Signed-off-by: Matthew Brost Signed-off-by: Rodrigo Vivi Reviewed-by: Niranjana Vishwanathapura --- drivers/gpu/drm/xe/xe_vm.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c index 4fc8e24f93ce2..8ba548e49add4 100644 --- a/drivers/gpu/drm/xe/xe_vm.c +++ b/drivers/gpu/drm/xe/xe_vm.c @@ -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); -- 2.30.2