Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1651770 > unrolled thread
| Started by | Darren Hart <dvhart@infradead.org> |
|---|---|
| First post | 2017-05-27 07:40 +0200 |
| Last post | 2017-06-06 18:10 +0200 |
| Articles | 4 — 3 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH 09/16] platform/x86: wmi: Instantiate all devices before adding them Darren Hart <dvhart@infradead.org> - 2017-05-27 07:40 +0200
Re: [PATCH 09/16] platform/x86: wmi: Instantiate all devices before adding them Michał Kępień <kernel@kempniu.pl> - 2017-06-01 22:50 +0200
Re: [PATCH 09/16] platform/x86: wmi: Instantiate all devices before adding them Darren Hart <dvhart@infradead.org> - 2017-06-06 05:10 +0200
Re: [PATCH 09/16] platform/x86: wmi: Instantiate all devices before adding them Andy Lutomirski <luto@amacapital.net> - 2017-06-06 18:10 +0200
| From | Darren Hart <dvhart@infradead.org> |
|---|---|
| Date | 2017-05-27 07:40 +0200 |
| Subject | [PATCH 09/16] platform/x86: wmi: Instantiate all devices before adding them |
| Message-ID | <tLCCe-7vw-21@gated-at.bofh.it> |
From: Andy Lutomirski <luto@kernel.org>
At some point, we will want sub-drivers to get references to other
devices on the same WMI bus. This change is needed to avoid races.
This ends up simplifying the setup code and fixing some leaks, too.
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Mario Limonciello <mario_limonciello@dell.com>
Cc: Pali Rohár <pali.rohar@gmail.com>
Cc: Rafael Wysocki <rjw@rjwysocki.net>
Cc: linux-kernel@vger.kernel.org
Cc: platform-driver-x86@vger.kernel.org
Cc: linux-acpi@vger.kernel.org
Signed-off-by: Darren Hart (VMware) <dvhart@infradead.org>
---
drivers/platform/x86/wmi.c | 49 +++++++++++++++++++++++++++++-----------------
1 file changed, 31 insertions(+), 18 deletions(-)
diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c
index 651693a..bfc0a3f 100644
--- a/drivers/platform/x86/wmi.c
+++ b/drivers/platform/x86/wmi.c
@@ -796,7 +796,7 @@ static struct device_type wmi_type_data = {
.release = wmi_dev_release,
};
-static int wmi_create_device(struct device *wmi_bus_dev,
+static void wmi_create_device(struct device *wmi_bus_dev,
const struct guid_block *gblock,
struct wmi_block *wblock,
struct acpi_device *device)
@@ -852,7 +852,7 @@ static int wmi_create_device(struct device *wmi_bus_dev,
}
- return device_register(&wblock->dev.dev);
+ device_initialize(&wblock->dev.dev);
}
static void wmi_free_devices(struct acpi_device *device)
@@ -863,10 +863,14 @@ static void wmi_free_devices(struct acpi_device *device)
list_for_each_entry_safe(wblock, next, &wmi_block_list, list) {
if (wblock->acpi_device == device) {
list_del(&wblock->list);
- if (wblock->dev.dev.bus)
- device_unregister(&wblock->dev.dev);
- else
+ if (wblock->dev.dev.bus) {
+ /* Device was initialized. */
+ device_del(&wblock->dev.dev);
+ put_device(&wblock->dev.dev);
+ } else {
+ /* device_initialize was not called. */
kfree(wblock);
+ }
}
}
}
@@ -901,9 +905,9 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device)
struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL};
union acpi_object *obj;
const struct guid_block *gblock;
- struct wmi_block *wblock;
+ struct wmi_block *wblock, *next;
acpi_status status;
- int retval;
+ int retval = 0;
u32 i, total;
status = acpi_evaluate_object(device->handle, "_WDG", NULL, &out);
@@ -936,19 +940,15 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device)
continue;
wblock = kzalloc(sizeof(struct wmi_block), GFP_KERNEL);
- if (!wblock)
- return -ENOMEM;
+ if (!wblock) {
+ retval = -ENOMEM;
+ break;
+ }
wblock->acpi_device = device;
wblock->gblock = gblock[i];
- retval = wmi_create_device(wmi_bus_dev, &gblock[i],
- wblock, device);
- if (retval) {
- put_device(&wblock->dev.dev);
- wmi_free_devices(device);
- goto out_free_pointer;
- }
+ wmi_create_device(wmi_bus_dev, &gblock[i], wblock, device);
list_add_tail(&wblock->list, &wmi_block_list);
@@ -958,11 +958,24 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device)
}
}
- retval = 0;
-
out_free_pointer:
kfree(out.pointer);
+ /*
+ * Now that all of the devices are created, add them to the
+ * device tree and probe subdrivers.
+ */
+ list_for_each_entry_safe(wblock, next, &wmi_block_list, list) {
+ if (wblock->acpi_device == device) {
+ if (device_add(&wblock->dev.dev) != 0) {
+ dev_err(wmi_bus_dev,
+ "failed to register %pULL\n",
+ wblock->gblock.guid);
+ list_del(&wblock->list);
+ }
+ }
+ }
+
return retval;
}
--
2.9.4
[toc] | [next] | [standalone]
| From | Michał Kępień <kernel@kempniu.pl> |
|---|---|
| Date | 2017-06-01 22:50 +0200 |
| Subject | Re: [PATCH 09/16] platform/x86: wmi: Instantiate all devices before adding them |
| Message-ID | <tNFcB-7FC-21@gated-at.bofh.it> |
| In reply to | #1651770 |
I know I have probably started sounding like a broken record by now, but I still have not seen any response (apart from the typos getting fixed) to my comments on this patch which I posted in January 2016 [1]. None of the issues I found back then are really critical, but I did point out a potential memory leak (granted, an unlikely one), so it might be a good idea to at least take a second look before merging. [1] https://www.spinics.net/lists/platform-driver-x86/msg08201.html -- Best regards, Michał Kępień
[toc] | [prev] | [next] | [standalone]
| From | Darren Hart <dvhart@infradead.org> |
|---|---|
| Date | 2017-06-06 05:10 +0200 |
| Subject | Re: [PATCH 09/16] platform/x86: wmi: Instantiate all devices before adding them |
| Message-ID | <tPd2y-3dl-11@gated-at.bofh.it> |
| In reply to | #1655750 |
On Thu, Jun 01, 2017 at 10:43:39PM +0200, Michał Kępień wrote:
> I know I have probably started sounding like a broken record by now, but
> I still have not seen any response (apart from the typos getting fixed)
> to my comments on this patch which I posted in January 2016 [1].
>
> None of the issues I found back then are really critical, but I did
> point out a potential memory leak (granted, an unlikely one), so it
> might be a good idea to at least take a second look before merging.
>
> [1] https://www.spinics.net/lists/platform-driver-x86/msg08201.html
Thanks for being persistent, some good points in there. I'd like to just squash
these into this patch (9/16), but I'll include them here for an ack from you and
Andy L. that this is what you meant, and consistent with his
intent/understanding:
From 2512da1593574a66eb48d7105885e959b38db410 Mon Sep 17 00:00:00 2001
Message-Id: <2512da1593574a66eb48d7105885e959b38db410.1496717988.git.dvhart@infradead.org>
From: "Darren Hart (VMware)" <dvhart@infradead.org>
Date: Mon, 5 Jun 2017 19:54:03 -0700
Subject: [PATCH] =?UTF-8?q?platform/x86:=20wmi:=20Apply=20fixes=20per=20Mi?=
=?UTF-8?q?cha=C5=82=20K=C4=99pie=C5=84=20(squash)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Per:
https://www.spinics.net/lists/platform-driver-x86/msg08201.html
Eliminate the kfree of a wblock with a null bus now that we ignore
duplicate GUIDs in parse_wdg.
Move the out_free_pointer: label and kfree to the end of the function,
clearly marking it as a return path.
Rework the device_add loop at the end of parse_wdg to avoid leaking the
wblock, and symmetrically call wmi_method_enable() if (debug_event).
Signed-off-by: Darren Hart (VMware) <dvhart@infradead.org>
---
drivers/platform/x86/wmi.c | 34 +++++++++++++++-------------------
1 file changed, 15 insertions(+), 19 deletions(-)
diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c
index bfc0a3f..fbce876 100644
--- a/drivers/platform/x86/wmi.c
+++ b/drivers/platform/x86/wmi.c
@@ -863,14 +863,7 @@ static void wmi_free_devices(struct acpi_device *device)
list_for_each_entry_safe(wblock, next, &wmi_block_list, list) {
if (wblock->acpi_device == device) {
list_del(&wblock->list);
- if (wblock->dev.dev.bus) {
- /* Device was initialized. */
- device_del(&wblock->dev.dev);
- put_device(&wblock->dev.dev);
- } else {
- /* device_initialize was not called. */
- kfree(wblock);
- }
+ device_unregister(&wblock->dev.dev);
}
}
}
@@ -903,9 +896,9 @@ static bool guid_already_parsed(struct acpi_device *device,
static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device)
{
struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL};
- union acpi_object *obj;
const struct guid_block *gblock;
struct wmi_block *wblock, *next;
+ union acpi_object *obj;
acpi_status status;
int retval = 0;
u32 i, total;
@@ -958,24 +951,27 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device)
}
}
-out_free_pointer:
- kfree(out.pointer);
-
/*
* Now that all of the devices are created, add them to the
* device tree and probe subdrivers.
*/
list_for_each_entry_safe(wblock, next, &wmi_block_list, list) {
- if (wblock->acpi_device == device) {
- if (device_add(&wblock->dev.dev) != 0) {
- dev_err(wmi_bus_dev,
- "failed to register %pULL\n",
- wblock->gblock.guid);
- list_del(&wblock->list);
- }
+ if (wblock->acpi_device != device)
+ continue;
+
+ retval = device_add(&wblock->dev.dev);
+ if (retval) {
+ dev_err(wmi_bus_dev, "failed to register %pULL\n",
+ wblock->gblock.guid);
+ if (debug_event)
+ wmi_method_enable(wblock, 0);
+ list_del(&wblock->list);
+ put_device(&wblock->dev.dev);
}
}
+out_free_pointer:
+ kfree(out.pointer);
return retval;
}
--
2.9.4
--
Darren Hart
VMware Open Source Technology Center
[toc] | [prev] | [next] | [standalone]
| From | Andy Lutomirski <luto@amacapital.net> |
|---|---|
| Date | 2017-06-06 18:10 +0200 |
| Subject | Re: [PATCH 09/16] platform/x86: wmi: Instantiate all devices before adding them |
| Message-ID | <tPpdp-2Df-49@gated-at.bofh.it> |
| In reply to | #1658326 |
On Mon, Jun 5, 2017 at 8:03 PM, Darren Hart <dvhart@infradead.org> wrote: > On Thu, Jun 01, 2017 at 10:43:39PM +0200, Michał Kępień wrote: >> I know I have probably started sounding like a broken record by now, but >> I still have not seen any response (apart from the typos getting fixed) >> to my comments on this patch which I posted in January 2016 [1]. >> >> None of the issues I found back then are really critical, but I did >> point out a potential memory leak (granted, an unlikely one), so it >> might be a good idea to at least take a second look before merging. >> >> [1] https://www.spinics.net/lists/platform-driver-x86/msg08201.html > > Thanks for being persistent, some good points in there. I'd like to just squash > these into this patch (9/16), but I'll include them here for an ack from you and > Andy L. that this is what you meant, and consistent with his > intent/understanding: > Looks good to me.
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web