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;
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);
}
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);