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

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
...@@ -421,6 +421,7 @@ int drm_ioctl(struct inode *inode, struct file *filp, ...@@ -421,6 +421,7 @@ int drm_ioctl(struct inode *inode, struct file *filp,
drm_ioctl_t *func; drm_ioctl_t *func;
unsigned int nr = DRM_IOCTL_NR(cmd); unsigned int nr = DRM_IOCTL_NR(cmd);
int retcode = -EINVAL; int retcode = -EINVAL;
char stack_kdata[128];
char *kdata = NULL; char *kdata = NULL;
atomic_inc(&dev->ioctl_count); atomic_inc(&dev->ioctl_count);
...@@ -459,12 +460,16 @@ int drm_ioctl(struct inode *inode, struct file *filp, ...@@ -459,12 +460,16 @@ int drm_ioctl(struct inode *inode, struct file *filp,
retcode = -EACCES; retcode = -EACCES;
} else { } else {
if (cmd & (IOC_IN | IOC_OUT)) { if (cmd & (IOC_IN | IOC_OUT)) {
if (_IOC_SIZE(cmd) <= sizeof(stack_kdata)) {
kdata = stack_kdata;
} else {
kdata = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL); kdata = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
if (!kdata) { if (!kdata) {
retcode = -ENOMEM; retcode = -ENOMEM;
goto err_i1; goto err_i1;
} }
} }
}
if (cmd & IOC_IN) { if (cmd & IOC_IN) {
if (copy_from_user(kdata, (void __user *)arg, if (copy_from_user(kdata, (void __user *)arg,
...@@ -483,7 +488,7 @@ int drm_ioctl(struct inode *inode, struct file *filp, ...@@ -483,7 +488,7 @@ int drm_ioctl(struct inode *inode, struct file *filp,
} }
err_i1: err_i1:
if (kdata) if (kdata != stack_kdata)
kfree(kdata); kfree(kdata);
atomic_dec(&dev->ioctl_count); atomic_dec(&dev->ioctl_count);
if (retcode) if (retcode)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment