Currently, if an error is raised we always call the cleanup locally
[and skip the main work callback]. However, some future users may need
to take a mutex to cleanup and so we cannot immediately execute the
cleanup as we may still be in interrupt context.

With the execute-immediate flag, for most cases this should result in
immediate cleanup of an error.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_sw_fence_work.c | 25 +++++++++++------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_sw_fence_work.c 
b/drivers/gpu/drm/i915/i915_sw_fence_work.c
index a3a81bb8f2c3..29f63ebc24e8 100644
--- a/drivers/gpu/drm/i915/i915_sw_fence_work.c
+++ b/drivers/gpu/drm/i915/i915_sw_fence_work.c
@@ -16,11 +16,14 @@ static void fence_complete(struct dma_fence_work *f)
 static void fence_work(struct work_struct *work)
 {
        struct dma_fence_work *f = container_of(work, typeof(*f), work);
-       int err;
 
-       err = f->ops->work(f);
-       if (err)
-               dma_fence_set_error(&f->dma, err);
+       if (!f->dma.error) {
+               int err;
+
+               err = f->ops->work(f);
+               if (err)
+                       dma_fence_set_error(&f->dma, err);
+       }
 
        fence_complete(f);
        dma_fence_put(&f->dma);
@@ -36,15 +39,11 @@ fence_notify(struct i915_sw_fence *fence, enum 
i915_sw_fence_notify state)
                if (fence->error)
                        dma_fence_set_error(&f->dma, fence->error);
 
-               if (!f->dma.error) {
-                       dma_fence_get(&f->dma);
-                       if (test_bit(DMA_FENCE_WORK_IMM, &f->dma.flags))
-                               fence_work(&f->work);
-                       else
-                               queue_work(system_unbound_wq, &f->work);
-               } else {
-                       fence_complete(f);
-               }
+               dma_fence_get(&f->dma);
+               if (test_bit(DMA_FENCE_WORK_IMM, &f->dma.flags))
+                       fence_work(&f->work);
+               else
+                       queue_work(system_unbound_wq, &f->work);
                break;
 
        case FENCE_FREE:
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to