This removes the implicit flags check from drm_syncobj_find_fence. The
check is moved to the only caller drm_syncobj_transfer_ioctl.

Signed-off-by: Julian Orth <[email protected]>
---
 drivers/gpu/drm/drm_syncobj.c | 62 ++++++++++++++++++++++++-------------------
 1 file changed, 35 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 3e8fb7e0cace..a746e787882d 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -955,29 +955,23 @@ drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, 
void *data,
                                        &args->handle);
 }
 
-static int drm_syncobj_transfer_to_timeline(struct drm_file *file_private,
-                                           struct drm_syncobj_transfer *args)
+static int drm_syncobj_transfer_to_timeline(struct drm_syncobj *src, u64 
src_point,
+                                           struct drm_syncobj *dst, u64 
dst_point,
+                                           u32 flags)
 {
-       struct drm_syncobj *timeline_syncobj = NULL;
        struct dma_fence *fence, *tmp;
        struct dma_fence_chain *chain;
        int ret;
 
-       timeline_syncobj = drm_syncobj_find(file_private, args->dst_handle);
-       if (!timeline_syncobj) {
-               return -ENOENT;
-       }
-       ret = drm_syncobj_find_fence(file_private, args->src_handle,
-                                    args->src_point, args->flags,
-                                    &tmp);
+       ret = drm_syncobj_fence_lookup(src, src_point, flags, &tmp);
        if (ret)
-               goto err_put_timeline;
+               goto out;
 
        fence = dma_fence_unwrap_merge(tmp);
        dma_fence_put(tmp);
        if (!fence) {
                ret = -ENOMEM;
-               goto err_put_timeline;
+               goto out;
        }
 
        chain = dma_fence_chain_alloc();
@@ -986,34 +980,27 @@ static int drm_syncobj_transfer_to_timeline(struct 
drm_file *file_private,
                goto err_free_fence;
        }
 
-       drm_syncobj_add_point(timeline_syncobj, chain, fence, args->dst_point);
+       drm_syncobj_add_point(dst, chain, fence, dst_point);
 err_free_fence:
        dma_fence_put(fence);
-err_put_timeline:
-       drm_syncobj_put(timeline_syncobj);
+out:
 
        return ret;
 }
 
 static int
-drm_syncobj_transfer_to_binary(struct drm_file *file_private,
-                              struct drm_syncobj_transfer *args)
+drm_syncobj_transfer_to_binary(struct drm_syncobj *src, u64 src_point,
+                              struct drm_syncobj *dst, u32 flags)
 {
-       struct drm_syncobj *binary_syncobj = NULL;
        struct dma_fence *fence;
        int ret;
 
-       binary_syncobj = drm_syncobj_find(file_private, args->dst_handle);
-       if (!binary_syncobj)
-               return -ENOENT;
-       ret = drm_syncobj_find_fence(file_private, args->src_handle,
-                                    args->src_point, args->flags, &fence);
+       ret = drm_syncobj_fence_lookup(src, src_point, flags, &fence);
        if (ret)
                goto err;
-       drm_syncobj_replace_fence(binary_syncobj, fence);
+       drm_syncobj_replace_fence(dst, fence);
        dma_fence_put(fence);
 err:
-       drm_syncobj_put(binary_syncobj);
 
        return ret;
 }
@@ -1022,18 +1009,39 @@ drm_syncobj_transfer_ioctl(struct drm_device *dev, void 
*data,
                           struct drm_file *file_private)
 {
        struct drm_syncobj_transfer *args = data;
+       struct drm_syncobj *src, *dst;
        int ret;
 
        if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ_TIMELINE))
                return -EOPNOTSUPP;
 
+       if (args->flags & ~DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT)
+               return -EINVAL;
+
        if (args->pad)
                return -EINVAL;
 
+       src = drm_syncobj_find(file_private, args->src_handle);
+       if (!src)
+               return -ENOENT;
+
+       dst = drm_syncobj_find(file_private, args->dst_handle);
+       if (!dst) {
+               ret = -ENOENT;
+               goto err_dst;
+       }
+
        if (args->dst_point)
-               ret = drm_syncobj_transfer_to_timeline(file_private, args);
+               ret = drm_syncobj_transfer_to_timeline(src, args->src_point,
+                                                      dst, args->dst_point,
+                                                      args->flags);
        else
-               ret = drm_syncobj_transfer_to_binary(file_private, args);
+               ret = drm_syncobj_transfer_to_binary(src, args->src_point,
+                                                    dst, args->flags);
+
+       drm_syncobj_put(dst);
+err_dst:
+       drm_syncobj_put(src);
 
        return ret;
 }

-- 
2.54.0

Reply via email to