OSDN Git Service

dma-fence: Make ->wait callback optional
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 27 Apr 2018 06:17:12 +0000 (08:17 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 3 May 2018 09:49:18 +0000 (11:49 +0200)
Almost everyone uses dma_fence_default_wait.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: Gustavo Padovan <gustavo@padovan.org>
Cc: linux-media@vger.kernel.org
Cc: linaro-mm-sig@lists.linaro.org
Link: https://patchwork.freedesktop.org/patch/msgid/20180427061724.28497-6-daniel.vetter@ffwll.ch
drivers/dma-buf/dma-fence-array.c
drivers/dma-buf/dma-fence.c
drivers/dma-buf/sw_sync.c
include/linux/dma-fence.h

index dd1edfb..a8c2544 100644 (file)
@@ -104,7 +104,6 @@ const struct dma_fence_ops dma_fence_array_ops = {
        .get_timeline_name = dma_fence_array_get_timeline_name,
        .enable_signaling = dma_fence_array_enable_signaling,
        .signaled = dma_fence_array_signaled,
        .get_timeline_name = dma_fence_array_get_timeline_name,
        .enable_signaling = dma_fence_array_enable_signaling,
        .signaled = dma_fence_array_signaled,
-       .wait = dma_fence_default_wait,
        .release = dma_fence_array_release,
 };
 EXPORT_SYMBOL(dma_fence_array_ops);
        .release = dma_fence_array_release,
 };
 EXPORT_SYMBOL(dma_fence_array_ops);
index 5904937..30fcbe4 100644 (file)
@@ -158,7 +158,10 @@ dma_fence_wait_timeout(struct dma_fence *fence, bool intr, signed long timeout)
                return -EINVAL;
 
        trace_dma_fence_wait_start(fence);
                return -EINVAL;
 
        trace_dma_fence_wait_start(fence);
-       ret = fence->ops->wait(fence, intr, timeout);
+       if (fence->ops->wait)
+               ret = fence->ops->wait(fence, intr, timeout);
+       else
+               ret = dma_fence_default_wait(fence, intr, timeout);
        trace_dma_fence_wait_end(fence);
        return ret;
 }
        trace_dma_fence_wait_end(fence);
        return ret;
 }
index 3d78ca8..53c1d6d 100644 (file)
@@ -188,7 +188,6 @@ static const struct dma_fence_ops timeline_fence_ops = {
        .get_timeline_name = timeline_fence_get_timeline_name,
        .enable_signaling = timeline_fence_enable_signaling,
        .signaled = timeline_fence_signaled,
        .get_timeline_name = timeline_fence_get_timeline_name,
        .enable_signaling = timeline_fence_enable_signaling,
        .signaled = timeline_fence_signaled,
-       .wait = dma_fence_default_wait,
        .release = timeline_fence_release,
        .fence_value_str = timeline_fence_value_str,
        .timeline_value_str = timeline_fence_timeline_value_str,
        .release = timeline_fence_release,
        .fence_value_str = timeline_fence_value_str,
        .timeline_value_str = timeline_fence_timeline_value_str,
index c053d19..02dba8c 100644 (file)
@@ -191,11 +191,14 @@ struct dma_fence_ops {
        /**
         * @wait:
         *
        /**
         * @wait:
         *
-        * Custom wait implementation, or dma_fence_default_wait.
+        * Custom wait implementation, defaults to dma_fence_default_wait() if
+        * not set.
         *
         *
-        * Must not be NULL, set to dma_fence_default_wait for default implementation.
-        * the dma_fence_default_wait implementation should work for any fence, as long
-        * as enable_signaling works correctly.
+        * The dma_fence_default_wait implementation should work for any fence, as long
+        * as @enable_signaling works correctly. This hook allows drivers to
+        * have an optimized version for the case where a process context is
+        * already available, e.g. if @enable_signaling for the general case
+        * needs to set up a worker thread.
         *
         * Must return -ERESTARTSYS if the wait is intr = true and the wait was
         * interrupted, and remaining jiffies if fence has signaled, or 0 if wait
         *
         * Must return -ERESTARTSYS if the wait is intr = true and the wait was
         * interrupted, and remaining jiffies if fence has signaled, or 0 if wait
@@ -203,7 +206,7 @@ struct dma_fence_ops {
         * which should be treated as if the fence is signaled. For example a hardware
         * lockup could be reported like that.
         *
         * which should be treated as if the fence is signaled. For example a hardware
         * lockup could be reported like that.
         *
-        * This callback is mandatory.
+        * This callback is optional.
         */
        signed long (*wait)(struct dma_fence *fence,
                            bool intr, signed long timeout);
         */
        signed long (*wait)(struct dma_fence *fence,
                            bool intr, signed long timeout);