From ff9b4c4a5373138836f1fd21c3975f239ae75493 Mon Sep 17 00:00:00 2001 From: Deepak Kumar Date: Mon, 8 Mar 2021 18:06:36 +0530 Subject: [PATCH] msm: kgsl: Avoid copying aux_command_generic struct twice In kgsl_ioctl_gpu_aux_command, kgsl_gpu_aux_command_generic struct is copied to kernel before calling into kgsl_drawobj_add_timeline and it is copied again inside kgsl_drawobj_add_timeline as part of get_aux_command. Avoid this by directly passing user pointer and size need by kgsl_drawobj_add_timeline to get the timeline command struct. Change-Id: Ic6e4e8a79484c85070f1feda516bbb0c0ace83eb Signed-off-by: Deepak Kumar --- drivers/gpu/msm/kgsl.c | 2 +- drivers/gpu/msm/kgsl_drawobj.c | 27 ++------------------------- 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 565ecd6e25be..cf48604f7848 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -2018,7 +2018,7 @@ long kgsl_ioctl_gpu_aux_command(struct kgsl_device_private *dev_priv, } ret = kgsl_drawobj_add_timeline(dev_priv, timelineobj, - cmdlist, param->cmdsize); + u64_to_user_ptr(generic.priv), generic.size); if (ret) goto err; diff --git a/drivers/gpu/msm/kgsl_drawobj.c b/drivers/gpu/msm/kgsl_drawobj.c index 07036c393a1f..9f7883e9e24d 100644 --- a/drivers/gpu/msm/kgsl_drawobj.c +++ b/drivers/gpu/msm/kgsl_drawobj.c @@ -820,25 +820,6 @@ static int drawobj_init(struct kgsl_device *device, return 0; } -static int get_aux_command(void __user *ptr, u64 generic_size, - int type, void *auxcmd, size_t auxcmd_size) -{ - struct kgsl_gpu_aux_command_generic generic; - u64 size; - - if (copy_struct_from_user(&generic, sizeof(generic), ptr, generic_size)) - return -EFAULT; - - if (generic.type != type) - return -EINVAL; - - size = min_t(u64, auxcmd_size, generic.size); - if (copy_from_user(auxcmd, u64_to_user_ptr(generic.priv), size)) - return -EFAULT; - - return 0; -} - struct kgsl_drawobj_timeline * kgsl_drawobj_timeline_create(struct kgsl_device *device, struct kgsl_context *context) @@ -870,12 +851,8 @@ int kgsl_drawobj_add_timeline(struct kgsl_device_private *dev_priv, struct kgsl_gpu_aux_command_timeline cmd; int i, ret; - memset(&cmd, 0, sizeof(cmd)); - - ret = get_aux_command(src, cmdsize, - KGSL_GPU_AUX_COMMAND_TIMELINE, &cmd, sizeof(cmd)); - if (ret) - return ret; + if (copy_struct_from_user(&cmd, sizeof(cmd), src, cmdsize)) + return -EFAULT; if (!cmd.count) return -EINVAL;