From nobody Tue Dec 16 23:47:12 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B1BD1C25B42 for ; Fri, 20 Oct 2023 21:10:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231279AbjJTVKa (ORCPT ); Fri, 20 Oct 2023 17:10:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38336 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229603AbjJTVKX (ORCPT ); Fri, 20 Oct 2023 17:10:23 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C3787D65; Fri, 20 Oct 2023 14:10:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1697836210; x=1698441010; i=w_armin@gmx.de; bh=uRnwDf6Of0uAPcllrrMhpGXZv2PanoNd1waM9WBipU8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To: References; b=l0h0XWVyHecDfmmCe1/+9xVV/wYB2X7OngQFh1C034ncZlU6QrnuVP/jk6TPlMIl ZehJh4p0lu8TNL+00DNcqonvOIsFwDauq8fLKkGyoHE5KXTLVMjC+8Cwtdgplfr3K tjw84y+O84Iil1Bj4UHYfSCtdoQLe5jwHHZbRb5SLVu+5E4yoS2k2rGAP+iRbXd3K Li7CkSCt0L2JDFcGX5cGoMSVQjLlaUyAaHt3wXBwRIluoxJYcIJbjAyaO/9q205oD uk7LRqka7SU2SgfQheUyiSxiHX3IFNKoODUCbMfi/eCK9pVhfSYmfrbIgUM+Man1J 5knDwNEGZIzu7ZOF/w== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1N3KTo-1rb9fs2Lly-010OUt; Fri, 20 Oct 2023 23:10:10 +0200 From: Armin Wolf To: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, markgross@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/5] platform/x86: wmi: Decouple probe deferring from wmi_block_list Date: Fri, 20 Oct 2023 23:10:01 +0200 Message-Id: <20231020211005.38216-2-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231020211005.38216-1-W_Armin@gmx.de> References: <20231020211005.38216-1-W_Armin@gmx.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:6dQMVSVphIRvnujeRXnlY4Qr5ASviy1sLJIfGWzzFdXw7JSRk9V 8pKbyk2iRglL6V4WT65igsqB8K5Dg2RXvW23LNZGa4om4JUqEswiTvbKrTZHEPi/9o5S+HV swtKEaJEoySLrWEjzmnZuVgEB/D3sazAU76kNP6gnWkF6/qDI0vWiBEouEVSY9vGvT6UA/t wrtMSMu4Qo4aRHfLGHeAw== UI-OutboundReport: notjunk:1;M01:P0:wyNBUrTn46c=;IzbI2lINEjrNfl4vkSy6TdZbmji vFMO9f17uSgWBQpFD+w0citaQ4cBQOuIbL+9lNB1/swnJzY+tKmXJMA0h9STBaEig1X2pMNVs wEHzuQy6qESDUVBq+UXTWR4NAEBS1gIEe3owKQsWGrn0AmOXyn59vZ6HXQLucilIPSPYV8K3K vGT7ibo76NhDn8WEHkmDz5r3o8vXfKlXNlBYHhCS5Xmfe1SWXoSHDmNbd+YwiHGTLCJn8Nnlj QNSl8ezU+oq0In7Q8nZkAH/nlRsXwSlgw61CfzRyYUDuyVA/UZ9vfzK3BbXI3iTlHcQtBCsWR 3ltaRQN3XUAxGc6SbOD5SvYVUk0dHGR0BwWIXuFn8aHtN/2pu1T5L7D5C3goGBHyhuY6nmUNe 4qVhmGpi4Z9dlPX48wDa0EbZO4J5QoO8RuHy0tXdQ4II3JhIJPPO3zNhzbqBXRYW83jU/vCW7 WTIrHwm7iW/Up5s6ogN7tLE5wPF6VzGpkarKxDqOepuKG/aM+Kf+y8E+ueX+5/f7MjKxS4A6L Lfud6UG4n3I0cS97di5r12XraRH/Y0P9RygQkrRXxr2wFekPOUoIZq9Lf5pQGoEYrAaOVOFf6 p9vMYId2LHdyx1j7VWZI5TF6R7po4tSsv222qFpsFDeSg4Z3qLLGYC1sy15Em4v4T/F6PFPtZ 0AUG+2j1K8prKdGavVFCV6t4YopNGn7DStrC4nZUbnvcQaUWUtgvJwp5MDDn5riLNUIJdDhfQ XBKjG1Nfu8QywlUXGduuINbKGoKI4khABB7WEhDSvIL4DarsVrGHC8IdS8jCRgxHpM9scb9PG vZ4PvWmFxCr20m8bDMPj8Xb953hMc0DWeiYJtsbhqUSy8z391/pHLbGRzNTzhmKuf2UG2vid+ NR2BR5e/NKu+IWcU6ZIG6hJ4mLGmJ6siXCKT3o1vWn2v0f8XNi26hvQUcK1Qvtuseip9DO9WD JNA7r8YtUDrGeJAO1AYOPjhF3Ug= Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Many aggregate WMI drivers do not use -EPROBE_DEFER when they cannot find a WMI device during probe, instead they require all WMI devices associated with an platform device to become available at once. This is currently achieved by adding those WMI devices to the wmi_block_list before they are registered, which is then used by the deprecated GUID-based functions to search for WMI devices. Replace this approach with a device link which defers probing of the WMI device until the associated platform device has finished probing (and has registered all WMI devices). New aggregate WMI drivers should not rely on this behaviour. Signed-off-by: Armin Wolf --- drivers/platform/x86/wmi.c | 39 +++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index a78ddd83cda0..1dbef16acdeb 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c @@ -1221,6 +1221,26 @@ static int wmi_create_device(struct device *wmi_bus_= dev, return 0; } +static int wmi_add_device(struct platform_device *pdev, struct wmi_device = *wdev) +{ + struct device_link *link; + + /* + * Many aggregate WMI drivers do not use -EPROBE_DEFER when they + * are unable to find a WMI device during probe, instead they require + * all WMI devices associated with an platform device to become available + * at once. This device link thus prevents WMI drivers from probing until + * the associated platform device has finished probing (and has registered + * all discovered WMI devices). + */ + + link =3D device_link_add(&wdev->dev, &pdev->dev, DL_FLAG_AUTOREMOVE_SUPPL= IER); + if (!link) + return -EINVAL; + + return device_add(&wdev->dev); +} + static void wmi_free_devices(struct acpi_device *device) { struct wmi_block *wblock, *next; @@ -1263,11 +1283,12 @@ static bool guid_already_parsed_for_legacy(struct a= cpi_device *device, const gui /* * Parse the _WDG method for the GUID data blocks */ -static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *devic= e) +static int parse_wdg(struct device *wmi_bus_dev, struct platform_device *p= dev) { + struct acpi_device *device =3D ACPI_COMPANION(&pdev->dev); struct acpi_buffer out =3D {ACPI_ALLOCATE_BUFFER, NULL}; const struct guid_block *gblock; - struct wmi_block *wblock, *next; + struct wmi_block *wblock; union acpi_object *obj; acpi_status status; int retval =3D 0; @@ -1317,22 +1338,14 @@ static int parse_wdg(struct device *wmi_bus_dev, st= ruct acpi_device *device) wblock->handler =3D wmi_notify_debug; wmi_method_enable(wblock, true); } - } - /* - * 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 !=3D device) - continue; - - retval =3D device_add(&wblock->dev.dev); + retval =3D wmi_add_device(pdev, &wblock->dev); if (retval) { dev_err(wmi_bus_dev, "failed to register %pUL\n", &wblock->gblock.guid); if (debug_event) wmi_method_enable(wblock, false); + list_del(&wblock->list); put_device(&wblock->dev.dev); } @@ -1487,7 +1500,7 @@ static int acpi_wmi_probe(struct platform_device *dev= ice) } dev_set_drvdata(&device->dev, wmi_bus_dev); - error =3D parse_wdg(wmi_bus_dev, acpi_device); + error =3D parse_wdg(wmi_bus_dev, device); if (error) { pr_err("Failed to parse WDG method\n"); goto err_remove_busdev; -- 2.39.2 From nobody Tue Dec 16 23:47:12 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 00FA3C0032E for ; Fri, 20 Oct 2023 21:10:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231948AbjJTVKh (ORCPT ); Fri, 20 Oct 2023 17:10:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38408 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230212AbjJTVK0 (ORCPT ); Fri, 20 Oct 2023 17:10:26 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 132BFD60; Fri, 20 Oct 2023 14:10:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1697836211; x=1698441011; i=w_armin@gmx.de; bh=5+KayTNVHXGBHiTso+VMux4gCfCpCNVmo/W6eOPMdjY=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To: References; b=PVeR2YEU4YQ2DzZ5aj45SHhXxFIvxxBf2FjI6WmYG4KRWIFIo1gavGSEwqr2M0Q/ CDCrFXoU9PWeQUdIARqKi06jM/iEF1l+QJcsY6z3mjuH0ni61tfWTGIpORPAXrHI1 qjeM+yDO/nD5Wt8CtRvV896yuxGOc7L20DfBv71Bu6E0asnTihkLVCSJcUIE/uP5Y dm3k5LF9tXVtMXyqmbsWM5njsbGJ4dXwtXeezRZwoqRxJjDLzVU6nhEHpIkLUZYTP 1LFbHSZR6Ns/mLKlGbYE1JG3cO3Tjq36xORlll5swJnDCe/VQLZ2rysR2Wrr43Xns Pj7dICCwDjGNhxabmA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MacSe-1rUeM52uiI-00c5sO; Fri, 20 Oct 2023 23:10:11 +0200 From: Armin Wolf To: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, markgross@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/5] platform/x86: wmi: Fix refcounting of WMI devices in legacy functions Date: Fri, 20 Oct 2023 23:10:02 +0200 Message-Id: <20231020211005.38216-3-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231020211005.38216-1-W_Armin@gmx.de> References: <20231020211005.38216-1-W_Armin@gmx.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:6t9SJmwYpBTxg5P1YT0TNeoGsgs7G90fLTolst6l4r4oJ86DkOc oonmB62FL0dpPcefsz2CageY6GpCnUudplq3pd4vtnMfmzoCydPZELsekH2Y0fLg+mn0L6T 8T0y67Eo+BmxsGjzNKxdfSujh0oiTsd6AsMssuONyQ3tscZnmtnAYREoX5EuHYgynKRB8PS vqV0ENaWzLQ7NaK4vtg2w== UI-OutboundReport: notjunk:1;M01:P0:7aSV8AgSRcc=;yT4C6ANUKCKF5/5krY2EANKw5up IE+5iuvTy2iLkJKl1DpyLlnUjHMf5G7mssO+oLslwJfrRUs4BLX36I2I7WKVYi3qburUj9kjr bdymva/CyuQboOpqjH/qQmFH2i/iEG2rnWBNvt/gdn4DJaaNKUXQhM0PED3IeNOCazUA0nGhJ VpPj1vtpy65BVlwjAlRhmzuP8HO7J95A9BoeU4Z7qjO9lcMCAHJpQufbSm4Qh8229YFtCOYZP qgyUzTeDg+FlSjzesmijy/ZvyHAICIHvvIyKH2APRiac9gtmF1rU+kpMKnZ3WIznroZ1LOOqh 8WyKbCF/7qfTVudvXKEl5ke/Hf91UwPy8u4dM/wpgANIjBLZUkeiFPEVW7mWv+sDEefZe97Ej TReMmho/ZkwGiVnLwF1/bdnHHi62ZY4gPH4/pCbmQzeVsJD96goEVS8yfCcFERbyLklc4KRwD lg4z2lIpygVBett4NrjY2dn+yv+K64sifj4shz6Hr84SxgfUhPCSdgctCR+uca4NTvvVRN72n nwmAD8R4rI46c/gsX7iE+6q+AoWAGD4DkYuPbenNDwAX4sJbIjlbSuJI3KYJSLd7LSB+VOwts Rx9/mBgMlBTuIBmhLJ9pHH9p2iWCY2O4LK4IOw0Jt0CQqBDtjBrreb8r2IcPQv7QByjKfnFDd Xy6sD2ZxBvw91MPsjr6OA5/XlyA5UklcWIXW9kxhgwDO64MVU7ZNfyiDCZgcl/wefsyGr8FaE NkVzDZsgUoJl997uTzGkrHkYSjXkwrUJCIDvZUlMFl6viUizwlax3+4mCZZ4oAbKBGTMVEGgf kzNXkEks1obfpq7qluJ6o4uMYQeyBb6V45ApY38+4KmpxLLUVdr/8NJ2Q7oDWjjldDN56dLPU 4wkORqwHTamKBLuEO5P+LYxLf2Ptop9tQ2UQiHKWWY8gDtzNMQ+MuusU4UIp7/xz/KUaVnm14 Z5a2EifHyDRa8qQOfXk0l2d1fWg= Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Until now, legacy GUID-based functions where using find_guid() when searching for WMI devices, which did no refcounting on the returned WMI device. This meant that the WMI device could disappear at any moment, potentially leading to various errors. Fix this by using bus_find_device() which returns an actual reference to the found WMI device. Signed-off-by: Armin Wolf --- drivers/platform/x86/wmi.c | 167 ++++++++++++++++++++++++------------- 1 file changed, 107 insertions(+), 60 deletions(-) diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index 1dbef16acdeb..e3984801883a 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c @@ -109,33 +109,13 @@ static const char * const allow_duplicates[] =3D { NULL }; +#define dev_to_wblock(__dev) container_of_const(__dev, struct wmi_block, d= ev.dev) +#define dev_to_wdev(__dev) container_of_const(__dev, struct wmi_device, de= v) + /* * GUID parsing functions */ -static acpi_status find_guid(const char *guid_string, struct wmi_block **o= ut) -{ - guid_t guid_input; - struct wmi_block *wblock; - - if (!guid_string) - return AE_BAD_PARAMETER; - - if (guid_parse(guid_string, &guid_input)) - return AE_BAD_PARAMETER; - - list_for_each_entry(wblock, &wmi_block_list, list) { - if (guid_equal(&wblock->gblock.guid, &guid_input)) { - if (out) - *out =3D wblock; - - return AE_OK; - } - } - - return AE_NOT_FOUND; -} - static bool guid_parse_and_compare(const char *string, const guid_t *guid) { guid_t guid_input; @@ -245,6 +225,41 @@ static acpi_status get_event_data(const struct wmi_blo= ck *wblock, struct acpi_bu return acpi_evaluate_object(wblock->acpi_device->handle, "_WED", &input, = out); } +static int wmidev_match_guid(struct device *dev, const void *data) +{ + struct wmi_block *wblock =3D dev_to_wblock(dev); + const guid_t *guid =3D data; + + if (guid_equal(guid, &wblock->gblock.guid)) + return 1; + + return 0; +} + +static struct bus_type wmi_bus_type; + +static struct wmi_device *wmi_find_device_by_guid(const char *guid_string) +{ + struct device *dev; + guid_t guid; + int ret; + + ret =3D guid_parse(guid_string, &guid); + if (ret < 0) + return ERR_PTR(ret); + + dev =3D bus_find_device(&wmi_bus_type, NULL, &guid, wmidev_match_guid); + if (!dev) + return ERR_PTR(-ENODEV); + + return dev_to_wdev(dev); +} + +static void wmi_device_put(struct wmi_device *wdev) +{ + put_device(&wdev->dev); +} + /* * Exported WMI functions */ @@ -279,18 +294,17 @@ EXPORT_SYMBOL_GPL(set_required_buffer_size); */ int wmi_instance_count(const char *guid_string) { - struct wmi_block *wblock; - acpi_status status; + struct wmi_device *wdev; + int ret; - status =3D find_guid(guid_string, &wblock); - if (ACPI_FAILURE(status)) { - if (status =3D=3D AE_BAD_PARAMETER) - return -EINVAL; + wdev =3D wmi_find_device_by_guid(guid_string); + if (IS_ERR(wdev)) + return PTR_ERR(wdev); - return -ENODEV; - } + ret =3D wmidev_instance_count(wdev); + wmi_device_put(wdev); - return wmidev_instance_count(&wblock->dev); + return ret; } EXPORT_SYMBOL_GPL(wmi_instance_count); @@ -325,15 +339,18 @@ EXPORT_SYMBOL_GPL(wmidev_instance_count); acpi_status wmi_evaluate_method(const char *guid_string, u8 instance, u32 = method_id, const struct acpi_buffer *in, struct acpi_buffer *out) { - struct wmi_block *wblock =3D NULL; + struct wmi_device *wdev; acpi_status status; - status =3D find_guid(guid_string, &wblock); - if (ACPI_FAILURE(status)) - return status; + wdev =3D wmi_find_device_by_guid(guid_string); + if (IS_ERR(wdev)) + return AE_ERROR; + + status =3D wmidev_evaluate_method(wdev, instance, method_id, in, out); - return wmidev_evaluate_method(&wblock->dev, instance, method_id, - in, out); + wmi_device_put(wdev); + + return status; } EXPORT_SYMBOL_GPL(wmi_evaluate_method); @@ -472,13 +489,19 @@ acpi_status wmi_query_block(const char *guid_string, = u8 instance, struct acpi_buffer *out) { struct wmi_block *wblock; + struct wmi_device *wdev; acpi_status status; - status =3D find_guid(guid_string, &wblock); - if (ACPI_FAILURE(status)) - return status; + wdev =3D wmi_find_device_by_guid(guid_string); + if (IS_ERR(wdev)) + return AE_ERROR; - return __query_block(wblock, instance, out); + wblock =3D container_of(wdev, struct wmi_block, dev); + status =3D __query_block(wblock, instance, out); + + wmi_device_put(wdev); + + return status; } EXPORT_SYMBOL_GPL(wmi_query_block); @@ -516,8 +539,9 @@ EXPORT_SYMBOL_GPL(wmidev_block_query); acpi_status wmi_set_block(const char *guid_string, u8 instance, const struct acpi_buffer *in) { - struct wmi_block *wblock =3D NULL; + struct wmi_block *wblock; struct guid_block *block; + struct wmi_device *wdev; acpi_handle handle; struct acpi_object_list input; union acpi_object params[2]; @@ -527,19 +551,26 @@ acpi_status wmi_set_block(const char *guid_string, u8= instance, if (!in) return AE_BAD_DATA; - status =3D find_guid(guid_string, &wblock); - if (ACPI_FAILURE(status)) - return status; + wdev =3D wmi_find_device_by_guid(guid_string); + if (IS_ERR(wdev)) + return AE_ERROR; + wblock =3D container_of(wdev, struct wmi_block, dev); block =3D &wblock->gblock; handle =3D wblock->acpi_device->handle; - if (block->instance_count <=3D instance) - return AE_BAD_PARAMETER; + if (block->instance_count <=3D instance) { + status =3D AE_BAD_PARAMETER; + + goto err_wdev_put; + } /* Check GUID is a data block */ - if (block->flags & (ACPI_WMI_EVENT | ACPI_WMI_METHOD)) - return AE_ERROR; + if (block->flags & (ACPI_WMI_EVENT | ACPI_WMI_METHOD)) { + status =3D AE_ERROR; + + goto err_wdev_put; + } input.count =3D 2; input.pointer =3D params; @@ -551,7 +582,12 @@ acpi_status wmi_set_block(const char *guid_string, u8 = instance, get_acpi_method_name(wblock, 'S', method); - return acpi_evaluate_object(handle, method, &input, NULL); + status =3D acpi_evaluate_object(handle, method, &input, NULL); + +err_wdev_put: + wmi_device_put(wdev); + + return status; } EXPORT_SYMBOL_GPL(wmi_set_block); @@ -742,7 +778,15 @@ EXPORT_SYMBOL_GPL(wmi_get_event_data); */ bool wmi_has_guid(const char *guid_string) { - return ACPI_SUCCESS(find_guid(guid_string, NULL)); + struct wmi_device *wdev; + + wdev =3D wmi_find_device_by_guid(guid_string); + if (IS_ERR(wdev)) + return false; + + wmi_device_put(wdev); + + return true; } EXPORT_SYMBOL_GPL(wmi_has_guid); @@ -756,20 +800,23 @@ EXPORT_SYMBOL_GPL(wmi_has_guid); */ char *wmi_get_acpi_device_uid(const char *guid_string) { - struct wmi_block *wblock =3D NULL; - acpi_status status; + struct wmi_block *wblock; + struct wmi_device *wdev; + char *uid; - status =3D find_guid(guid_string, &wblock); - if (ACPI_FAILURE(status)) + wdev =3D wmi_find_device_by_guid(guid_string); + if (IS_ERR(wdev)) return NULL; - return acpi_device_uid(wblock->acpi_device); + wblock =3D container_of(wdev, struct wmi_block, dev); + uid =3D acpi_device_uid(wblock->acpi_device); + + wmi_device_put(wdev); + + return uid; } EXPORT_SYMBOL_GPL(wmi_get_acpi_device_uid); -#define dev_to_wblock(__dev) container_of_const(__dev, struct wmi_block, d= ev.dev) -#define dev_to_wdev(__dev) container_of_const(__dev, struct wmi_device, de= v) - static inline struct wmi_driver *drv_to_wdrv(struct device_driver *drv) { return container_of(drv, struct wmi_driver, driver); -- 2.39.2 From nobody Tue Dec 16 23:47:12 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id ACBBFC001DF for ; Fri, 20 Oct 2023 21:10:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232859AbjJTVKk (ORCPT ); Fri, 20 Oct 2023 17:10:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48930 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230318AbjJTVK1 (ORCPT ); Fri, 20 Oct 2023 17:10:27 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CBA4FD68; Fri, 20 Oct 2023 14:10:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1697836213; x=1698441013; i=w_armin@gmx.de; bh=mQwZ7HovL0XAV0BMMBNTr9Ft336d/JL1LOfzD0c2oJs=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To: References; b=Eh/dJbbsnRvIaOb/QLKYI3GmINne3a2xuiYHq0DnFEeiRyeVXFKSVIH5KFTL36NL YhCkhm4rb9bpQKtdF4VhUw1u4xfoJHS61lIpHA4LhdXdifi4zLhBBrx5GQAEZKZxJ 3i/TNQjYfYrfWgkOZLRIY9vPLNqhxL/zLKnwmui4TwgE8b6gamhjPjSR1NxEz1Az3 QNNpDYZVucwLuOk0RjHFPuhZ0I07uHPsh0ZK3k79EhOKgGFyY3K6hFok0xalXCbc9 Vd9xuzZsanyFIXCXmLSk25A07/CpbaFfgB2JzyXvOpP6wvKSNB46L54z3KHcC9G+O irYXG4blPWRoojIkoA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MCbEf-1qkqCl3eN9-009exu; Fri, 20 Oct 2023 23:10:12 +0200 From: Armin Wolf To: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, markgross@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/5] platform/x86: wmi: Fix probe failure when failing to register WMI devices Date: Fri, 20 Oct 2023 23:10:03 +0200 Message-Id: <20231020211005.38216-4-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231020211005.38216-1-W_Armin@gmx.de> References: <20231020211005.38216-1-W_Armin@gmx.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:K8Pj/GqNVdzXRi5ZvkOjbKr+5ZLjUujG7t6fVgbkc3m717NSP6V Y18A7m5/H1ElSS70TACGg0s4+zszPRBQdNBmlSu0yntNwkakCl+vkswZ37THoqauK53Njnz /M7Bg9mj/7UtKKdoM4//HwY0UWMURUUPyaWGdbuu9iMyUxHJUCO01yvvfvMYKjwQN7loDml 8XDfdskdYda4YvnAV/BaQ== UI-OutboundReport: notjunk:1;M01:P0:drImnaOOQ28=;AA/Bxy6dHJnX38U588CRcqYdFvo /jRkmv+JeN8SLIm4kh3GrVJAbSRyVKOBXH5rZP1EUYIKjo9Ew9rtrrZ8Xq0dTNAClLUAcYPMc 15uDjz66NLlLeba6LnOkydhmnz0NpZoyuR9U65hNEs/Nv+lF6USmavIXk9X90W0T+4e29nKA+ pPwaQKJNnIhibLU/IG6zcIVZzIrGR9Zsa57t3G7o208+UeN/3+InO3gvi5OIsz8NwkI83XKZ6 iWSwyvB67f/MrAZC1Bu6jsk/ZB3O3K3PUWZhWEGruED4U2Cqm/v3U/2WeF1jsKg8mDi1r9eFN PNpt89hteaJMaB4UT5uG17PA3pOkykCp1V3xOBdO9+zNJ1odVYa+0ss3qyXgXkSvwQacWnHmd 0yXKxuh64CCjfwVvXMM1Y0TtNKkw8Bx3q0cY7YGTI10OqHdzvPtswozKz/0IsyQe+++uvTRvt 7iCR0xMLnFTO0THocJShK2apS9uNfCuip/ADLzuzN4ssllLIN2trWFNrQ1ljqvid94AnZHhvg 4QikppiZspfFHJgxfYKNsDgEAOP1xq+pfGx2mZWmax/0W9MOXMu893F/twuDiaOSDTYc9JOK7 slGnwqaaFCiFwxeREF8TFd7GaqwRF/7uY7dI5RM4NaOT04eOf/e3jonbtGY7em0DDREc+9wxs 0IPZHIobq9f255Ipt1tWX70EDB39we3NzzxTvDSpmVXowfwLl+3flcA4xt7W3cWdBQ9B7kaZS iHNtOjI3MAs/Vlhj2OjEQN+ZjcK/R915Fi9OyDaQuobHi/lPv8W03HKqmM2Lt4qUQnLXNHLZ0 t/WujHUiHtTuIaH5Wzv561NSywc8t59TMa6zGv7rho7ZpHVtBec7G3OD+jqq0KmZa9eX5NRuk rRqAAgBikONjg0qlaeM01CRubWhUDPUHjOk9BxoEkKauQ3bVROT4gFT56myYBegwMH5vPM6Ah jqLnp+HT3Zyh7/KvZmcsj469OOA= Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" When a WMI device besides the first one somehow fails to register, retval is returned while still containing a negative error code. This causes the ACPI device failing to probe, leaving behind zombie WMI devices leading to various errors later. Fix this by handling the single error path separately and return 0 after trying to register all WMI devices. Also continue to register WMI devices even if some fail to allocate. Fixes: 6ee50aaa9a20 ("platform/x86: wmi: Instantiate all devices before add= ing them") Signed-off-by: Armin Wolf --- drivers/platform/x86/wmi.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index e3984801883a..ab24ea9ffc9a 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c @@ -1338,8 +1338,8 @@ static int parse_wdg(struct device *wmi_bus_dev, stru= ct platform_device *pdev) struct wmi_block *wblock; union acpi_object *obj; acpi_status status; - int retval =3D 0; u32 i, total; + int retval; status =3D acpi_evaluate_object(device->handle, "_WDG", NULL, &out); if (ACPI_FAILURE(status)) @@ -1350,8 +1350,8 @@ static int parse_wdg(struct device *wmi_bus_dev, stru= ct platform_device *pdev) return -ENXIO; if (obj->type !=3D ACPI_TYPE_BUFFER) { - retval =3D -ENXIO; - goto out_free_pointer; + kfree(obj); + return -ENXIO; } gblock =3D (const struct guid_block *)obj->buffer.pointer; @@ -1366,8 +1366,8 @@ static int parse_wdg(struct device *wmi_bus_dev, stru= ct platform_device *pdev) wblock =3D kzalloc(sizeof(*wblock), GFP_KERNEL); if (!wblock) { - retval =3D -ENOMEM; - break; + dev_err(wmi_bus_dev, "Failed to allocate %pUL\n", &gblock[i].guid); + continue; } wblock->acpi_device =3D device; @@ -1398,9 +1398,9 @@ static int parse_wdg(struct device *wmi_bus_dev, stru= ct platform_device *pdev) } } -out_free_pointer: - kfree(out.pointer); - return retval; + kfree(obj); + + return 0; } /* -- 2.39.2 From nobody Tue Dec 16 23:47:12 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3240AC001DF for ; Fri, 20 Oct 2023 21:10:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232123AbjJTVKd (ORCPT ); Fri, 20 Oct 2023 17:10:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38406 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230021AbjJTVK0 (ORCPT ); Fri, 20 Oct 2023 17:10:26 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0B2C2D65; Fri, 20 Oct 2023 14:10:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1697836214; x=1698441014; i=w_armin@gmx.de; bh=x1THz+UVadBgvASSd3DL2MDkUZ8jlzu8RvUsxEiUFV8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To: References; b=n8QzveMImcNnHcqodKE/XJLMhtQN8Ex15sLt14wVH0IFbseGCi8drMBvhSabVOmV KDjGPqnlwKYcBwjDw6x0YU6Bc5xWJzvMxbWAU+4IyNAXT98pjo8MIx6UBRAJhSZ3O Y6tg1NyXEE5HBvxZKlvU3uBb084WQj7ttmRFvidDCqokNyO23z2nlGbPf9/wZ5HEl jrCie7oM+KJ7O1QUPZaO1Kbppp6PDg/7Ebep3MDXCNg3pjOG/IbLzlZeQgVeNQ9+C sxI1Nw+T7wHFC8fHmrpCVIllkByko0CtzFrvch/lpx5dY9GtUNFwwwDKZTd5Uejcm JfUNgczlZ+prsFp64A== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1N4hzZ-1rcWig404F-011jbW; Fri, 20 Oct 2023 23:10:14 +0200 From: Armin Wolf To: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, markgross@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 4/5] platform/x86: wmi: Fix opening of char device Date: Fri, 20 Oct 2023 23:10:04 +0200 Message-Id: <20231020211005.38216-5-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231020211005.38216-1-W_Armin@gmx.de> References: <20231020211005.38216-1-W_Armin@gmx.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:E8bKXzrd7tJH35+RfczawE7+cx7xJspEAesMdRP4NLE93ueV3LO ySNdVqap2OFF+MpWW02dwhCsMLbd5OB88956XLkUVW8gVmYGBXa7RymkCuS6PcSrrnpwOvN rYXUDkL2qKgrEE4dR6LJ5lhvvtvOZPNRIkkw+6eQRZwMa/lr5YutFVbQ5IDNB6S975yNILe JK3fzaKrNW68LFoKX8ZYQ== UI-OutboundReport: notjunk:1;M01:P0:WMWOP31tJm4=;cDbpF9TxXrOlFEY3HGfLd8VH1h8 Q3hoq44eRaygm3VdWU6MPXWksyExzdrIzTkQpcYdOilRgTn3IfVx/XHO2poPXqW8ajwOg8+Pu qg++H2LKv1z/oDwG969U1vNYHfC4YvYGEgeHmFizdntJLaGgbBuXGTfGjcMzPZORM3fLV29jk ZBRvVFgBXAUerJ6iYSBekSL9EoKXG3gVI3sQ84EbXlvKn1u7AVjWzxLERL1R6UvtVimr8d1fc T5My08CfLq7u2SzW5zI2tqqhNmrr5V3SzGvQaHXVFerWh65CrXsiygCBgTHQpuA9xmHxDCrOh YmqjNHM/GSArbz+QrtVw367UzUZ7ZmXcm6zVyrqtrMvoGnBzoD4qNfG4+oBDIgBra32tM8vIi B50Urts/tvaA5/TMaQAPEYS28ANle1njUu6yOg4K7+1j0oAhlAk1p8kXj9iCw/D0TLXrg2UFt hRXzoLTVNPq9hc4diaGGhyAJLwIkX66UwFWLralmuevPNkZWSVcR0yPrjfutNzC5+AStB9hXd vsVm4j7+9tIW3LGbVguBtGAtn9vPyrrce7jCK+M+MEHkCn4wTeLxQMFr1S4TnOx1Vrdow2pY1 vEJwULYObcj17wfeAS0uFw0BrROVJQdjOmiiI9BWdj+2NyHC3GSPM+PojnxGe1ET/91zvzAam 27SSfaDTsOmRNNMiqMC6V9IkdjHoNv876RsHVwofBMVBSOC0muEzRcVpZqLAKtMdb7E/uox3C KK5gq+VijDtFmzVpZfWnz45/DXH+xfBG+UX+uIvjPxuUO8SoLBz0uesaN6/V96fMVvG/9ZZZX qen6lrkNZuIATBg6E6t8fYLDg4jLgHLJ80yQhwPgUoYPqJmR1V/bj9dVoKERuLU5xXkCPMo5Z VU/oxBdqBg1+qiBjFr6lOSwVRST+qr8/+ErQ7amPc0MkN62mE5rI25QrM+vTO6Zugw5ZRHrgy uZr/q0cfLWBHrl0GnqKmlQcHtTg= Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Since commit fa1f68db6ca7 ("drivers: misc: pass miscdevice pointer via file private data"), the miscdevice stores a pointer to itself inside filp->private_data, which means that private_data will not be NULL when wmi_char_open() is called. This might cause memory corruption should wmi_char_open() be unable to find its driver, something which can happen when the associated WMI device is deleted in wmi_free_devices(). Fix this by using the miscdevice pointer to retrieve the WMI device data associated with a char device using container_of(). This also avoids wmi_char_open() picking a wrong WMI device bound to a driver with the same name as the original driver. Fixes: 44b6b7661132 ("platform/x86: wmi: create userspace interface for dri= vers") Signed-off-by: Armin Wolf --- drivers/platform/x86/wmi.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index ab24ea9ffc9a..6b3b2fe464d2 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c @@ -958,21 +958,13 @@ static int wmi_dev_match(struct device *dev, struct d= evice_driver *driver) } static int wmi_char_open(struct inode *inode, struct file *filp) { - const char *driver_name =3D filp->f_path.dentry->d_iname; - struct wmi_block *wblock; - struct wmi_block *next; - - list_for_each_entry_safe(wblock, next, &wmi_block_list, list) { - if (!wblock->dev.dev.driver) - continue; - if (strcmp(driver_name, wblock->dev.dev.driver->name) =3D=3D 0) { - filp->private_data =3D wblock; - break; - } - } + /* + * The miscdevice already stores a pointer to itself + * inside filp->private_data + */ + struct wmi_block *wblock =3D container_of(filp->private_data, struct wmi_= block, char_dev); - if (!filp->private_data) - return -ENODEV; + filp->private_data =3D wblock; return nonseekable_open(inode, filp); } -- 2.39.2 From nobody Tue Dec 16 23:47:12 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 037A2C0032E for ; Fri, 20 Oct 2023 21:10:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233004AbjJTVKo (ORCPT ); Fri, 20 Oct 2023 17:10:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48956 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230306AbjJTVK1 (ORCPT ); Fri, 20 Oct 2023 17:10:27 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 576F8112; Fri, 20 Oct 2023 14:10:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1697836215; x=1698441015; i=w_armin@gmx.de; bh=kFgVOLW+XKGG9Dulheyn+xrEGtWuwccHJv/X261e87w=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To: References; b=oF08p2AQTIHOWJIgWlit3N2rt74aIraiIs3Uvwq76EKVcbfe68jdrNqqZB/khtPV 1qcBcKKT6UA3XUw33wddSnHcbn5Cp86+amTqBwAHOph/g6PUMEz5uGPLKROm123J3 0nn7Uq6ogQuVNRrAHz6wUwH4Z+BRqvv0IuH7NdrviHGadPPTjUBZ+AR5JFoqJ7EeY L2Ks0l+VMJ01X+D+Xx+4mp8rgZXDJ92/YmqI5OjdZ/jSJISbFJ24oyHKUjGyyGSb+ 22yevMiDwsK9I/IJbFEa8U4ToYtnFXC9zvIuI1XBzuOOJ+pVf2aXjqU+U9pHrfDLt PmXLHwoWtIRen6SDQw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.users.agdsn.de ([141.30.226.129]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MORAa-1r9pkH05gU-00Pz4b; Fri, 20 Oct 2023 23:10:15 +0200 From: Armin Wolf To: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com, markgross@kernel.org Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 5/5] platform/x86: wmi: Decouple WMI device removal from wmi_block_list Date: Fri, 20 Oct 2023 23:10:05 +0200 Message-Id: <20231020211005.38216-6-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231020211005.38216-1-W_Armin@gmx.de> References: <20231020211005.38216-1-W_Armin@gmx.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:upUz/s9hYkGaaetVpAZiTov/Dp6BZHRY9u7NNsKYG7ZsPneSYaN kME8qFo2oFWNV1icG+l8vgEWvmCLw+N9F/U9yhDgCOx9N8ajPePy5lBbyFo/CcfwlczOeS+ 9Y+moiM3hwxCZvXpyqjgC3zf8Bn1M3r5AFSxUWuoTDcj3xGZMRn1OKZeXZWQ2G5gi29w3Bw tReZ3vESZ9jJESGeFeMCg== UI-OutboundReport: notjunk:1;M01:P0:uRYRACoYQNg=;xJ5zlELhxwZnziIgQaehFu6ytf2 HQ0FxqEdXu93Z51O0juNh54QHy1xunaclvigTJ5UgUGlO6I85mafj1t1YebP0Enfi2lZH3/WA ofXjOKaIvfNM6VseXzheZLYXkreZUplT3n951nJDs1UNdZXtifS1F8v/nWGa709+1NfJUqrIp f89xcxz6L8kBB2fw8HhjZRgqbNxBTE+c1KLEsMG4ISxMUP87yHyBhwlQvxqDd+1SieVQVdNtE TJP+gkVTqLYEgFbU5T29i5pvn9lDNEKaiFbIoXWLjUFx7ZF0qb77wuO1Ffvvj0O57oiProqI0 dJUjbxGAAnOJhxUME+Dvu/4bCWrVXscf6zLmNJHkcN+PMUifbow5HFblT92DrwR991tNZNf62 1OHoxdR6yNZNXO9g/7Q4tRfDIUJyc3tjVRvy7X8c/F0vNarIkWtms20XiT5orqrxsTabnyCCi SOXJFnbVChsHaAMIsvUbmW7/7X3V0Pk6dwa2Dg6M04TtLsfEUYA5u293MQNjLAvZvbCS6tZGh dM4h4LP7u0q/DxF8tY9r0Lq4d4iL2vQ9zanJATo5LBm76AAOaLimYCHOSznsLiirbvCaXXbus yVwodVY2fSVAPTuNkkVfz0UadAAyZdqv0h5o/PDoWO2odsgK/h2oAHZPpM64TRlX+8NYDcQho aS9KlBzDtu8u1fx1eYvXQ1rKlxMBQSYM4DrX2TySoQSVkntjt6UMTpqZETJ2JvSCLB3Y8bABQ js/dcukxoHGnrtiebHokoghBFiYC1H4DHwwQmwK5rt6TpyWx5lReUoHUE0AUA+Vo94GmoI0Vo pNo90t1URQO1xS7wfkAEdaW3pdyQsuPB7qnRjpKmyg/MF/Oa3M3YsQKSsrKFskwtvUMkZt098 S2fkks0mwQYsqszg0n9Rj0Zjraask6IR0fha7HlAU0/C7Z5qNClYPkUwW2QLxAhFkcJ5k7nBx 92vDKjSAAYpAwnlJhtJjFjuRMak= Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Use device_for_each_child_reverse() to find and unregister WMI devices belonging to a WMI bus device instead of iterating thru the entire wmi_block_list. Signed-off-by: Armin Wolf --- drivers/platform/x86/wmi.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index 6b3b2fe464d2..5c27b4aa9690 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c @@ -1280,19 +1280,6 @@ static int wmi_add_device(struct platform_device *pd= ev, struct wmi_device *wdev) return device_add(&wdev->dev); } -static void wmi_free_devices(struct acpi_device *device) -{ - struct wmi_block *wblock, *next; - - /* Delete devices for all the GUIDs */ - list_for_each_entry_safe(wblock, next, &wmi_block_list, list) { - if (wblock->acpi_device =3D=3D device) { - list_del(&wblock->list); - device_unregister(&wblock->dev.dev); - } - } -} - static bool guid_already_parsed_for_legacy(struct acpi_device *device, con= st guid_t *guid) { struct wmi_block *wblock; @@ -1487,16 +1474,28 @@ static void acpi_wmi_notify_handler(acpi_handle han= dle, u32 event, event, 0); } +static int wmi_remove_device(struct device *dev, void *data) +{ + struct wmi_block *wblock =3D dev_to_wblock(dev); + + list_del(&wblock->list); + device_unregister(dev); + + return 0; +} + static void acpi_wmi_remove(struct platform_device *device) { struct acpi_device *acpi_device =3D ACPI_COMPANION(&device->dev); + struct device *wmi_bus_device =3D dev_get_drvdata(&device->dev); acpi_remove_notify_handler(acpi_device->handle, ACPI_ALL_NOTIFY, acpi_wmi_notify_handler); acpi_remove_address_space_handler(acpi_device->handle, ACPI_ADR_SPACE_EC, &acpi_wmi_ec_space_handler); - wmi_free_devices(acpi_device); - device_unregister(dev_get_drvdata(&device->dev)); + + device_for_each_child_reverse(wmi_bus_device, NULL, wmi_remove_device); + device_unregister(wmi_bus_device); } static int acpi_wmi_probe(struct platform_device *device) -- 2.39.2