Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff9b4c4a authored by Deepak Kumar's avatar Deepak Kumar
Browse files

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: default avatarDeepak Kumar <dkumar@codeaurora.org>
parent be60e6e7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;

+2 −25
Original line number Diff line number Diff line
@@ -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;