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 ju.orth@gmail.com --- 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; }