diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2010-05-03 10:05:56 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-05-03 10:05:56 -0700 |
| commit | be6ba97352d5b480ce60fe55a52a207370a523a6 (patch) | |
| tree | 78f9893e267f37eb0432247dbe13ada45deb71a3 | |
| parent | 83801b53e2add123144953d9039b41d9378bce3b (diff) | |
| download | patches-be6ba97352d5b480ce60fe55a52a207370a523a6.tar.gz | |
firmware patch updates
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; - |
