aboutsummaryrefslogtreecommitdiffstats
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2010-05-03 10:05:56 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2010-05-03 10:05:56 -0700
commitbe6ba97352d5b480ce60fe55a52a207370a523a6 (patch)
tree78f9893e267f37eb0432247dbe13ada45deb71a3
parent83801b53e2add123144953d9039b41d9378bce3b (diff)
downloadpatches-be6ba97352d5b480ce60fe55a52a207370a523a6.tar.gz
firmware patch updates
-rw-r--r--driver-core.current/firmware_class-fix-memory-leak-free-allocated-pages.patch70
-rw-r--r--driver-core/driver-core-reduce-the-level-of-request_firmware-messages.patch2
-rw-r--r--driver-core/firmware-class-export-nowait-to-userspace.patch12
-rw-r--r--driver-core/firmware-loader-do-not-allocate-firmare-id-separately.patch4
-rw-r--r--driver-core/firmware-loader-rely-on-driver-core-to-create-class-attribute.patch4
-rw-r--r--driver-core/firmware-loader-split-out-builtin-firmware-handling.patch10
6 files changed, 34 insertions, 68 deletions
diff --git a/driver-core.current/firmware_class-fix-memory-leak-free-allocated-pages.patch b/driver-core.current/firmware_class-fix-memory-leak-free-allocated-pages.patch
index 07e9b159ec0fe1..af22edb7bea681 100644
--- a/driver-core.current/firmware_class-fix-memory-leak-free-allocated-pages.patch
+++ b/driver-core.current/firmware_class-fix-memory-leak-free-allocated-pages.patch
@@ -1,17 +1,13 @@
-From tomas.winkler@intel.com Thu Apr 29 13:14:48 2010
-From: David Woodhouse <dwmw2@infradead.org>
-Date: Thu, 29 Apr 2010 21:26:17 +0300
+From tomas.winkler@intel.com Mon May 3 10:00:48 2010
+From: David Woodhouse <David.Woodhouse@intel.com>
+Date: Sun, 2 May 2010 11:21:21 +0300
Subject: firmware_class: fix memory leak - free allocated pages
-To: linux-kernel@vger.kernel.org, David Woodhouse <dwmw2@infradead.org>, Kay Sievers <kay.sievers@vrfy.org>, Greg Kroah-Hartman <gregkh@suse.de>
-Cc: David Woodhouse <dwmw2@infradead.org>, Johannes Berg <johannes@sipsolutions.net>, Greg Kroah-Hartman <gregkh@suse.de>, Ming Lei <tom.leiming@gmail.com>, Catalin Marinas <catalin.marinas@arm.com>, Kay Sievers <kay.sievers@vrfy.org>, Tomas Winkler <tomas.winkler@intel.com>
-Message-ID: <1272565577-26587-1-git-send-email-tomas.winkler@intel.com>
-Status: RO
-X-Status: A
-Content-Length: 3937
-Lines: 135
+To: Greg Kroah-Hartman <gregkh@suse.de>, linux-kernel@vger.kernel.org, David Woodhouse <dwmw2@infradead.org>, Kay Sievers <kay.sievers@vrfy.org>
+Cc: David Woodhouse <David.Woodhouse@intel.com>, Johannes Berg <johannes@sipsolutions.net>, Greg Kroah-Hartman <gregkh@suse.de>, Ming Lei <tom.leiming@gmail.com>, Catalin Marinas <catalin.marinas@arm.com>, Tomas Winkler <tomas.winkler@intel.com>
+Message-ID: <1272788481-23066-1-git-send-email-tomas.winkler@intel.com>
-From: David Woodhouse <dwmw2@infradead.org>
+From: David Woodhouse <David.Woodhouse@intel.com>
fix memory leak introduced by the patch 6e03a201bbe:
firmware: speed up request_firmware()
@@ -27,49 +23,46 @@ and not only in fw_dev_release()
The fix doesn't break the firmware load speed.
Cc: Johannes Berg <johannes@sipsolutions.net>
-Cc: Greg Kroah-Hartman <gregkh@suse.de>
Cc: Ming Lei <tom.leiming@gmail.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
-Cc: Kay Sievers <kay.sievers@vrfy.org>
-Signed-off-by: David Woodhouse <dwmw2@infradead.org>
+Singed-off-by: Kay Sievers <kay.sievers@vrfy.org>
+Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
- drivers/base/firmware_class.c | 30 +++++++++++++++++++++++-------
- include/linux/firmware.h | 5 +++--
- 2 files changed, 26 insertions(+), 9 deletions(-)
+ drivers/base/firmware_class.c | 26 ++++++++++++++++++++------
+ include/linux/firmware.h | 1 +
+ 2 files changed, 21 insertions(+), 6 deletions(-)
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
-@@ -130,6 +130,20 @@ static ssize_t firmware_loading_show(str
+@@ -130,6 +130,17 @@ static ssize_t firmware_loading_show(str
return sprintf(buf, "%d\n", loading);
}
-+static void firmware_free_data(struct firmware *fw)
++static void firmware_free_data(const struct firmware *fw)
+{
+ int i;
+ vunmap(fw->data);
-+ fw->data = NULL;
+ if (fw->pages) {
+ for (i = 0; i < PFN_UP(fw->size); i++)
+ __free_page(fw->pages[i]);
+ kfree(fw->pages);
+ }
-+ fw->pages = NULL;
-+ fw->size = 0;
+}
+
/* Some architectures don't have PAGE_KERNEL_RO */
#ifndef PAGE_KERNEL_RO
#define PAGE_KERNEL_RO PAGE_KERNEL
-@@ -162,21 +176,20 @@ static ssize_t firmware_loading_store(st
+@@ -162,21 +173,21 @@ static ssize_t firmware_loading_store(st
mutex_unlock(&fw_lock);
break;
}
- vfree(fw_priv->fw->data);
- fw_priv->fw->data = NULL;
+ firmware_free_data(fw_priv->fw);
++ memset(fw_priv->fw, 0, sizeof(struct firmware));
+ /* If the pages are not owned by 'struct firmware' */
for (i = 0; i < fw_priv->nr_pages; i++)
__free_page(fw_priv->pages[i]);
@@ -88,7 +81,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fw_priv->fw->data = vmap(fw_priv->pages,
fw_priv->nr_pages,
0, PAGE_KERNEL_RO);
-@@ -184,7 +197,10 @@ static ssize_t firmware_loading_store(st
+@@ -184,7 +195,10 @@ static ssize_t firmware_loading_store(st
dev_err(dev, "%s: vmap() failed\n", __func__);
goto err;
}
@@ -100,16 +93,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fw_priv->page_array_size = 0;
fw_priv->nr_pages = 0;
complete(&fw_priv->completion);
-@@ -568,7 +584,7 @@ request_firmware(const struct firmware *
- * @fw: firmware resource to release
- **/
- void
--release_firmware(const struct firmware *fw)
-+release_firmware(struct firmware *fw)
- {
- struct builtin_fw *builtin;
-
-@@ -578,7 +594,7 @@ release_firmware(const struct firmware *
+@@ -578,7 +592,7 @@ release_firmware(const struct firmware *
if (fw->data == builtin->data)
goto free_fw;
}
@@ -128,21 +112,3 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
};
struct device;
-@@ -42,7 +43,7 @@ int request_firmware_nowait(
- const char *name, struct device *device, gfp_t gfp, void *context,
- void (*cont)(const struct firmware *fw, void *context));
-
--void release_firmware(const struct firmware *fw);
-+void release_firmware(struct firmware *fw);
- #else
- static inline int request_firmware(const struct firmware **fw,
- const char *name,
-@@ -58,7 +59,7 @@ static inline int request_firmware_nowai
- return -EINVAL;
- }
-
--static inline void release_firmware(const struct firmware *fw)
-+static inline void release_firmware(struct firmware *fw)
- {
- }
- #endif
diff --git a/driver-core/driver-core-reduce-the-level-of-request_firmware-messages.patch b/driver-core/driver-core-reduce-the-level-of-request_firmware-messages.patch
index 620677a8aa7c71..d4fd3142acbc24 100644
--- a/driver-core/driver-core-reduce-the-level-of-request_firmware-messages.patch
+++ b/driver-core/driver-core-reduce-the-level-of-request_firmware-messages.patch
@@ -24,7 +24,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
-@@ -509,15 +509,14 @@ _request_firmware(const struct firmware
+@@ -507,15 +507,14 @@ _request_firmware(const struct firmware
builtin++) {
if (strcmp(name, builtin->name))
continue;
diff --git a/driver-core/firmware-class-export-nowait-to-userspace.patch b/driver-core/firmware-class-export-nowait-to-userspace.patch
index e3d6b7b59d7188..1f6e095f3613d5 100644
--- a/driver-core/firmware-class-export-nowait-to-userspace.patch
+++ b/driver-core/firmware-class-export-nowait-to-userspace.patch
@@ -47,7 +47,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
return 0;
}
-@@ -443,7 +446,7 @@ error_kfree:
+@@ -441,7 +444,7 @@ error_kfree:
static int fw_setup_device(struct firmware *fw, struct device **dev_p,
const char *fw_name, struct device *device,
@@ -56,7 +56,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
{
struct device *f_dev;
struct firmware_priv *fw_priv;
-@@ -459,6 +462,8 @@ static int fw_setup_device(struct firmwa
+@@ -457,6 +460,8 @@ static int fw_setup_device(struct firmwa
fw_priv = dev_get_drvdata(f_dev);
@@ -65,7 +65,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fw_priv->fw = fw;
sysfs_bin_attr_init(&fw_priv->attr_data);
retval = sysfs_create_bin_file(&f_dev->kobj, &fw_priv->attr_data);
-@@ -486,7 +491,7 @@ out:
+@@ -484,7 +489,7 @@ out:
static int
_request_firmware(const struct firmware **firmware_p, const char *name,
@@ -74,7 +74,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
{
struct device *f_dev;
struct firmware_priv *fw_priv;
-@@ -518,7 +523,8 @@ _request_firmware(const struct firmware
+@@ -516,7 +521,8 @@ _request_firmware(const struct firmware
if (uevent)
dev_dbg(device, "firmware: requesting %s\n", name);
@@ -84,7 +84,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
if (retval)
goto error_kfree_fw;
-@@ -575,7 +581,7 @@ request_firmware(const struct firmware *
+@@ -573,7 +579,7 @@ request_firmware(const struct firmware *
struct device *device)
{
int uevent = 1;
@@ -93,7 +93,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
}
/**
-@@ -621,7 +627,7 @@ request_firmware_work_func(void *arg)
+@@ -619,7 +625,7 @@ request_firmware_work_func(void *arg)
return 0;
}
ret = _request_firmware(&fw, fw_work->name, fw_work->device,
diff --git a/driver-core/firmware-loader-do-not-allocate-firmare-id-separately.patch b/driver-core/firmware-loader-do-not-allocate-firmare-id-separately.patch
index 5154435afaa0d9..03c9529fedcf74 100644
--- a/driver-core/firmware-loader-do-not-allocate-firmare-id-separately.patch
+++ b/driver-core/firmware-loader-do-not-allocate-firmare-id-separately.patch
@@ -46,7 +46,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
kfree(fw_priv);
kfree(dev);
-@@ -439,8 +437,8 @@ static int fw_register_device(struct dev
+@@ -437,8 +435,8 @@ static int fw_register_device(struct dev
struct device *device)
{
int retval;
@@ -57,7 +57,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
struct device *f_dev = kzalloc(sizeof(*f_dev), GFP_KERNEL);
*dev_p = NULL;
-@@ -451,16 +449,9 @@ static int fw_register_device(struct dev
+@@ -449,16 +447,9 @@ static int fw_register_device(struct dev
goto error_kfree;
}
diff --git a/driver-core/firmware-loader-rely-on-driver-core-to-create-class-attribute.patch b/driver-core/firmware-loader-rely-on-driver-core-to-create-class-attribute.patch
index 8cd8b2d39496a9..1164544215fdb9 100644
--- a/driver-core/firmware-loader-rely-on-driver-core-to-create-class-attribute.patch
+++ b/driver-core/firmware-loader-rely-on-driver-core-to-create-class-attribute.patch
@@ -56,7 +56,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
.dev_uevent = firmware_uevent,
.dev_release = fw_dev_release,
};
-@@ -372,21 +390,6 @@ static struct bin_attribute firmware_att
+@@ -370,21 +388,6 @@ static struct bin_attribute firmware_att
.write = firmware_data_write,
};
@@ -78,7 +78,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
static void
firmware_class_timeout(u_long data)
{
-@@ -691,26 +694,12 @@ request_firmware_nowait(
+@@ -689,26 +692,12 @@ request_firmware_nowait(
return 0;
}
diff --git a/driver-core/firmware-loader-split-out-builtin-firmware-handling.patch b/driver-core/firmware-loader-split-out-builtin-firmware-handling.patch
index 49ac5f8bd8a188..1aeef96be539ec 100644
--- a/driver-core/firmware-loader-split-out-builtin-firmware-handling.patch
+++ b/driver-core/firmware-loader-split-out-builtin-firmware-handling.patch
@@ -87,7 +87,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
static void
fw_load_abort(struct firmware_priv *fw_priv)
{
-@@ -499,7 +537,6 @@ _request_firmware(const struct firmware
+@@ -497,7 +535,6 @@ _request_firmware(const struct firmware
struct device *f_dev;
struct firmware_priv *fw_priv;
struct firmware *firmware;
@@ -95,7 +95,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
int retval;
if (!firmware_p)
-@@ -513,13 +550,8 @@ _request_firmware(const struct firmware
+@@ -511,13 +548,8 @@ _request_firmware(const struct firmware
goto out;
}
@@ -110,13 +110,13 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
return 0;
}
-@@ -591,19 +623,11 @@ request_firmware(const struct firmware *
+@@ -589,19 +621,11 @@ request_firmware(const struct firmware *
* release_firmware: - release the resource associated with a firmware image
* @fw: firmware resource to release
**/
-void
--release_firmware(struct firmware *fw)
-+void release_firmware(struct firmware *fw)
+-release_firmware(const struct firmware *fw)
++void release_firmware(const struct firmware *fw)
{
- struct builtin_fw *builtin;
-