HID: hiddev: Use vzalloc to allocate hiddev_list
authorHavard Skinnemoen <hskinnemoen@google.com>
Thu, 26 Apr 2012 18:16:00 +0000 (11:16 -0700)
committerJiri Kosina <jkosina@suse.cz>
Fri, 27 Apr 2012 14:03:40 +0000 (16:03 +0200)
Everytime a HID device is opened, a new hiddev_list is allocated with
kzalloc. This requires 64KB of physically contiguous memory, which could
easily push a heavily loaded system over the edge.

Allocating the same amount of memory with vmalloc shouldn't be nearly as
demanding, so let's do that instead. The memory isn't used for DMA and
doesn't look particularly performance sensitive, so this should be safe.

Signed-off-by: Havard Skinnemoen <hskinnemoen@google.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/usbhid/hiddev.c

index b1ec0e2aeb57b0b26a66e17b067192cfc30689c1..14599e25679181cc00223675a7d4170cdff70174 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/hid.h>
 #include <linux/hiddev.h>
 #include <linux/compat.h>
+#include <linux/vmalloc.h>
 #include "usbhid.h"
 
 #ifdef CONFIG_USB_DYNAMIC_MINORS
@@ -250,13 +251,13 @@ static int hiddev_release(struct inode * inode, struct file * file)
                } else {
                        mutex_unlock(&list->hiddev->existancelock);
                        kfree(list->hiddev);
-                       kfree(list);
+                       vfree(list);
                        return 0;
                }
        }
 
        mutex_unlock(&list->hiddev->existancelock);
-       kfree(list);
+       vfree(list);
 
        return 0;
 }
@@ -278,7 +279,7 @@ static int hiddev_open(struct inode *inode, struct file *file)
        hid = usb_get_intfdata(intf);
        hiddev = hid->hiddev;
 
-       if (!(list = kzalloc(sizeof(struct hiddev_list), GFP_KERNEL)))
+       if (!(list = vzalloc(sizeof(struct hiddev_list))))
                return -ENOMEM;
        mutex_init(&list->thread_lock);
        list->hiddev = hiddev;
@@ -322,7 +323,7 @@ bail_unlock:
        mutex_unlock(&hiddev->existancelock);
 bail:
        file->private_data = NULL;
-       kfree(list);
+       vfree(list);
        return res;
 }