.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);
 
                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;
 }
               spinlock_t *lock, u64 context, unsigned seqno)
 {
        BUG_ON(!lock);
-       BUG_ON(!ops || !ops->wait ||
-              !ops->get_driver_name || !ops->get_timeline_name);
+       BUG_ON(!ops || !ops->get_driver_name || !ops->get_timeline_name);
 
        kref_init(&fence->refcount);
        fence->ops = ops;
 
        .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,
 
        /**
         * @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
         * 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);