Since the BOs used by VC4 have DMA Reservation Objects attached to
them, waiting for seqnos to check BO availability is unnecessary.
Instead, `drm_gem_dma_resv_wait()` can be used.

Signed-off-by: Maíra Canal <[email protected]>
---
 drivers/gpu/drm/vc4/vc4_gem.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
index 1021f45cb53c..de7be9942c13 100644
--- a/drivers/gpu/drm/vc4/vc4_gem.c
+++ b/drivers/gpu/drm/vc4/vc4_gem.c
@@ -1020,8 +1020,10 @@ vc4_wait_bo_ioctl(struct drm_device *dev, void *data,
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        int ret;
        struct drm_vc4_wait_bo *args = data;
-       struct drm_gem_object *gem_obj;
-       struct vc4_bo *bo;
+       unsigned long timeout_jiffies =
+               usecs_to_jiffies(div_u64(args->timeout_ns, 1000));
+       ktime_t start = ktime_get();
+       u64 delta_ns;
 
        if (WARN_ON_ONCE(vc4->gen > VC4_GEN_4))
                return -ENODEV;
@@ -1029,17 +1031,18 @@ vc4_wait_bo_ioctl(struct drm_device *dev, void *data,
        if (args->pad != 0)
                return -EINVAL;
 
-       gem_obj = drm_gem_object_lookup(file_priv, args->handle);
-       if (!gem_obj) {
-               DRM_DEBUG("Failed to look up GEM BO %d\n", args->handle);
-               return -EINVAL;
-       }
-       bo = to_vc4_bo(gem_obj);
+       ret = drm_gem_dma_resv_wait(file_priv, args->handle,
+                                   true, timeout_jiffies);
 
-       ret = vc4_wait_for_seqno_ioctl_helper(dev, bo->seqno,
-                                             &args->timeout_ns);
+       /* Decrement the user's timeout, in case we got interrupted
+        * such that the ioctl will be restarted.
+        */
+       delta_ns = ktime_to_ns(ktime_sub(ktime_get(), start));
+       if (delta_ns < args->timeout_ns)
+               args->timeout_ns -= delta_ns;
+       else
+               args->timeout_ns = 0;
 
-       drm_gem_object_put(gem_obj);
        return ret;
 }
 
-- 
2.47.1

Reply via email to