]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] DRIVER: request_firmware() vmalloc patch
authorManuel Estrada Sainz <ranty@debian.org>
Thu, 19 Jun 2003 02:45:51 +0000 (19:45 -0700)
committerGreg Kroah-Hartman <greg@kroah.com>
Thu, 19 Jun 2003 02:45:51 +0000 (19:45 -0700)
 Kay Sievers tried with his ~500kB firmware image and kmalloc was not
 capable of getting that much memory. He suggested using vmalloc which
 sound reasonable.

drivers/base/firmware_class.c

index 705c4c00b69c6b9d987a2f905e90121d9a46da61..b186dba8d2d8e6e8266602a369f2e21a33a6e1ae 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/timer.h>
+#include <linux/vmalloc.h>
 #include <asm/hardirq.h>
 
 #include <linux/firmware.h>
@@ -159,7 +160,7 @@ fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size)
        if (min_size <= fw_priv->alloc_size)
                return 0;
 
-       new_data = kmalloc(fw_priv->alloc_size + PAGE_SIZE, GFP_KERNEL);
+       new_data = vmalloc(fw_priv->alloc_size + PAGE_SIZE);
        if (!new_data) {
                printk(KERN_ERR "%s: unable to alloc buffer\n", __FUNCTION__);
                /* Make sure that we don't keep incomplete data */
@@ -169,7 +170,7 @@ fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size)
        fw_priv->alloc_size += PAGE_SIZE;
        if (fw_priv->fw->data) {
                memcpy(new_data, fw_priv->fw->data, fw_priv->fw->size);
-               kfree(fw_priv->fw->data);
+               vfree(fw_priv->fw->data);
        }
        fw_priv->fw->data = new_data;
        BUG_ON(min_size > fw_priv->alloc_size);
@@ -367,7 +368,7 @@ request_firmware(const struct firmware **firmware, const char *name,
                *firmware = fw_priv->fw;
        } else {
                retval = -ENOENT;
-               kfree(fw_priv->fw->data);
+               vfree(fw_priv->fw->data);
                kfree(fw_priv->fw);
        }
        kfree(fw_priv);
@@ -382,7 +383,7 @@ void
 release_firmware(const struct firmware *fw)
 {
        if (fw) {
-               kfree(fw->data);
+               vfree(fw->data);
                kfree(fw);
        }
 }