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

Commit 955a23eb authored by Eric Anholt's avatar Eric Anholt Committed by Dave Airlie
Browse files

drm: Use a little stash on the stack to avoid kmalloc in most DRM ioctls.



The kmalloc was taking up about 1.5% of the CPU on an ioctl-heavy workload
(x11perf -aa10text on 965).  Initial results look like they have a
corresponding improvement in performance for aa10text, but more numbers might
not hurt.

Thanks to ajax for pointing out this performance regression I'd introduced
back in 2007.

[airlied: well I introduced it sneakily inside Eric's patch]

Signed-off-by: default avatarEric Anholt <eric@anholt.net>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent af7ae351
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -421,6 +421,7 @@ int drm_ioctl(struct inode *inode, struct file *filp,
	drm_ioctl_t *func;
	unsigned int nr = DRM_IOCTL_NR(cmd);
	int retcode = -EINVAL;
	char stack_kdata[128];
	char *kdata = NULL;

	atomic_inc(&dev->ioctl_count);
@@ -459,12 +460,16 @@ int drm_ioctl(struct inode *inode, struct file *filp,
		retcode = -EACCES;
	} else {
		if (cmd & (IOC_IN | IOC_OUT)) {
			if (_IOC_SIZE(cmd) <= sizeof(stack_kdata)) {
				kdata = stack_kdata;
			} else {
				kdata = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
				if (!kdata) {
					retcode = -ENOMEM;
					goto err_i1;
				}
			}
		}

		if (cmd & IOC_IN) {
			if (copy_from_user(kdata, (void __user *)arg,
@@ -483,7 +488,7 @@ int drm_ioctl(struct inode *inode, struct file *filp,
	}

      err_i1:
	if (kdata)
	if (kdata != stack_kdata)
		kfree(kdata);
	atomic_dec(&dev->ioctl_count);
	if (retcode)