From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Lv Zheng <lv.zheng@intel.com>
Cc: "Rafael J . Wysocki" <rafael.j.wysocki@intel.com>,
Len Brown <len.brown@intel.com>, Lv Zheng <zetalog@gmail.com>,
linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org
Subject: Re: [PATCH v2 2/2] ACPI: Fix memory mapping leaks in current sysfs dumpable ACPI tables support.
Date: Fri, 28 Apr 2017 00:32:05 +0200 [thread overview]
Message-ID: <4277647.WvhH6F4tss@aspire.rjw.lan> (raw)
In-Reply-To: <73632c930a4c3a960ca6a9b935e3a2a8a0222cc5.1493281247.git.lv.zheng@intel.com>
On Thursday, April 27, 2017 04:22:50 PM Lv Zheng wrote:
> This patch adds balanced acpi_get_table()/acpi_put_table() support for
> sysfs table dumping code so that no need to call
> acpi_get_validated_table().
>
> Since ACPICA does not use all of the tables, this can help to reduce some
> usless memory mappings by utilizing the new table handling APIs.
>
> The original sysfs dumpable ACPI table implementation forces tables to be
> mapped after a read operation and never unmaps them again whatever there
> are no users in the kernel interested in these tables. With new balanced
> table handling APIs, tables are unmapped after the read operation.
>
> Signed-off-by: Lv Zheng <lv.zheng@intel.com>
> ---
> drivers/acpi/sysfs.c | 51 ++++++++++++++++++++++++++++++++++++---------------
> 1 file changed, 36 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c
> index 1b5ee1e..c3bb6ce 100644
> --- a/drivers/acpi/sysfs.c
> +++ b/drivers/acpi/sysfs.c
> @@ -333,21 +333,34 @@ static ssize_t acpi_table_show(struct file *filp, struct kobject *kobj,
> container_of(bin_attr, struct acpi_table_attr, attr);
> struct acpi_table_header *table_header = NULL;
> acpi_status status;
> + ssize_t len;
>
> status = acpi_get_table(table_attr->name, table_attr->instance,
> &table_header);
> if (ACPI_FAILURE(status))
> return -ENODEV;
> + len = memory_read_from_buffer(buf, count, &offset,
> + table_header, table_header->length);
> + acpi_put_table(table_header);
> + return len;
> +}
The above seems to be taken verbatim from the Dan's patch.
If that's the case, please do the below as a separate patch on top of the Dan's
one.
> +
> +static bool acpi_table_has_multiple_instances(char *signature)
> +{
> + acpi_status status;
> + struct acpi_table_header *header;
>
> - return memory_read_from_buffer(buf, count, &offset,
> - table_header, table_header->length);
> + status = acpi_get_table(signature, 2, &header);
> + if (ACPI_FAILURE(status))
> + return false;
> + acpi_put_table(header);
> + return true;
> }
>
> static int acpi_table_attr_init(struct kobject *tables_obj,
> struct acpi_table_attr *table_attr,
> struct acpi_table_header *table_header)
> {
> - struct acpi_table_header *header = NULL;
> struct acpi_table_attr *attr = NULL;
> char instance_str[ACPI_INST_SIZE];
>
> @@ -368,9 +381,9 @@ static int acpi_table_attr_init(struct kobject *tables_obj,
>
> ACPI_MOVE_NAME(table_attr->filename, table_header->signature);
> table_attr->filename[ACPI_NAME_SIZE] = '\0';
> - if (table_attr->instance > 1 || (table_attr->instance == 1 &&
> - !acpi_get_table
> - (table_header->signature, 2, &header))) {
> + if (table_attr->instance > 1 ||
> + (table_attr->instance == 1 &&
> + acpi_table_has_multiple_instances(table_header->signature))) {
> snprintf(instance_str, sizeof(instance_str), "%u",
> table_attr->instance);
> strcat(table_attr->filename, instance_str);
> @@ -419,11 +432,11 @@ acpi_status acpi_sysfs_table_handler(u32 event, void *table, void *context)
>
> static int acpi_tables_sysfs_init(void)
> {
> - struct acpi_table_attr *table_attr;
> + struct acpi_table_attr *table_attr = NULL;
> struct acpi_table_header *table_header = NULL;
> int table_index;
> acpi_status status;
> - int ret;
> + int ret = 0;
>
> tables_kobj = kobject_create_and_add("tables", acpi_kobj);
> if (!tables_kobj)
> @@ -435,24 +448,32 @@ static int acpi_tables_sysfs_init(void)
>
> for (table_index = 0;; table_index++) {
> status = acpi_get_table_by_index(table_index, &table_header);
> -
> if (status == AE_BAD_PARAMETER)
> break;
> -
> if (ACPI_FAILURE(status))
> - continue;
> + goto next_table;
>
> table_attr = kzalloc(sizeof(*table_attr), GFP_KERNEL);
> - if (!table_attr)
> - return -ENOMEM;
> + if (!table_attr) {
> + ret = -ENOMEM;
> + goto next_table;
> + }
>
> ret = acpi_table_attr_init(tables_kobj,
> table_attr, table_header);
> + if (ret)
> + goto next_table;
> + list_add_tail(&table_attr->node, &acpi_table_attr_list);
> +
> +next_table:
> + acpi_put_table(table_header);
> if (ret) {
> - kfree(table_attr);
> + if (table_attr) {
> + kfree(table_attr);
> + table_attr = NULL;
> + }
> return ret;
> }
> - list_add_tail(&table_attr->node, &acpi_table_attr_list);
> }
>
> kobject_uevent(tables_kobj, KOBJ_ADD);
>
Thanks,
Rafael
next prev parent reply other threads:[~2017-04-27 22:38 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-27 8:22 [PATCH v2 1/2] ACPICA: Tables: Fix regression introduced by a too early mechanism enabling Lv Zheng
2017-04-27 8:22 ` [PATCH v2 2/2] ACPI: Fix memory mapping leaks in current sysfs dumpable ACPI tables support Lv Zheng
2017-04-27 22:32 ` Rafael J. Wysocki [this message]
2017-04-27 22:30 ` [PATCH v2 1/2] ACPICA: Tables: Fix regression introduced by a too early mechanism enabling Rafael J. Wysocki
2017-04-28 1:24 ` Zheng, Lv
2017-04-28 3:57 ` Zheng, Lv
2017-04-28 5:27 ` [PATCH v2 1/4] " Lv Zheng
2017-04-28 5:28 ` [PATCH v3 " Lv Zheng
2017-04-28 5:30 ` [PATCH v3 2/4] ACPICA: Tables: Add mechanism to allow to balance late stage acpi_get_table() independently Lv Zheng
2017-04-28 20:56 ` Rafael J. Wysocki
2017-05-04 7:18 ` Zheng, Lv
2017-05-04 15:45 ` Dan Williams
2017-05-05 0:53 ` Zheng, Lv
2017-05-05 20:43 ` Rafael J. Wysocki
2017-05-09 1:58 ` Zheng, Lv
2017-04-28 5:30 ` [PATCH v3 3/4] ACPI: sysfs: Fix acpi_get_table() leak Lv Zheng
2017-04-28 5:30 ` [PATCH v3 4/4] ACPI: Fix memory mapping leaks in current sysfs dumpable ACPI tables support Lv Zheng
2017-05-09 5:57 ` [PATCH v4 1/4] ACPICA: Tables: Fix regression introduced by a too early mechanism enabling Lv Zheng
2017-05-09 5:57 ` [PATCH v4 2/4] ACPICA: Tables: Add mechanism to allow to balance late stage acpi_get_table() independently Lv Zheng
2017-05-12 21:03 ` Rafael J. Wysocki
2017-05-12 21:41 ` Rafael J. Wysocki
2017-05-15 6:32 ` Zheng, Lv
2017-05-09 5:57 ` [PATCH v4 3/4] ACPI: sysfs: Fix acpi_get_table() leak Lv Zheng
2017-05-09 5:57 ` [PATCH v4 4/4] ACPI: Fix memory mapping leaks in current sysfs dumpable ACPI tables support Lv Zheng
2017-06-12 13:12 ` Rafael J. Wysocki
2017-06-07 4:54 ` [PATCH v5] ACPICA: Tables: Add mechanism to allow to balance late stage acpi_get_table() independently Lv Zheng
2017-06-07 6:41 ` Dan Williams
2017-06-07 21:14 ` Rafael J. Wysocki
2017-06-07 21:24 ` Dan Williams
2017-06-08 2:24 ` Zheng, Lv
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4277647.WvhH6F4tss@aspire.rjw.lan \
--to=rjw@rjwysocki.net \
--cc=len.brown@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lv.zheng@intel.com \
--cc=rafael.j.wysocki@intel.com \
--cc=zetalog@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).