* [PATCH] platform/x86: dell-smbios-wmi: Stop touching WMI device ID
@ 2025-07-12 14:02 Armin Wolf
2025-07-22 13:14 ` Ilpo Järvinen
0 siblings, 1 reply; 2+ messages in thread
From: Armin Wolf @ 2025-07-12 14:02 UTC (permalink / raw)
To: hansg, ilpo.jarvinen
Cc: Dell.Client.Kernel, platform-driver-x86, linux-kernel
The WMI core itself uses wdev->dev.id internally to track device IDs,
so modifying this value will result in a resource leak.
Fix this by not using the device ID for SMBIOS prioritization.
Tested on a Dell Inspiron 3505.
Fixes: 73f0f2b52c5e ("platform/x86: wmi: Fix WMI device naming issue")
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
---
drivers/platform/x86/dell/dell-smbios-base.c | 19 +++++++++----------
drivers/platform/x86/dell/dell-smbios-smm.c | 3 +--
drivers/platform/x86/dell/dell-smbios-wmi.c | 4 +---
drivers/platform/x86/dell/dell-smbios.h | 2 +-
4 files changed, 12 insertions(+), 16 deletions(-)
diff --git a/drivers/platform/x86/dell/dell-smbios-base.c b/drivers/platform/x86/dell/dell-smbios-base.c
index 01c72b91a50d..444786102f02 100644
--- a/drivers/platform/x86/dell/dell-smbios-base.c
+++ b/drivers/platform/x86/dell/dell-smbios-base.c
@@ -39,6 +39,7 @@ struct token_sysfs_data {
struct smbios_device {
struct list_head list;
struct device *device;
+ int priority;
int (*call_fn)(struct calling_interface_buffer *arg);
};
@@ -145,7 +146,7 @@ int dell_smbios_error(int value)
}
EXPORT_SYMBOL_GPL(dell_smbios_error);
-int dell_smbios_register_device(struct device *d, void *call_fn)
+int dell_smbios_register_device(struct device *d, int priority, void *call_fn)
{
struct smbios_device *priv;
@@ -154,6 +155,7 @@ int dell_smbios_register_device(struct device *d, void *call_fn)
return -ENOMEM;
get_device(d);
priv->device = d;
+ priv->priority = priority;
priv->call_fn = call_fn;
mutex_lock(&smbios_mutex);
list_add_tail(&priv->list, &smbios_device_list);
@@ -292,28 +294,25 @@ EXPORT_SYMBOL_GPL(dell_smbios_call_filter);
int dell_smbios_call(struct calling_interface_buffer *buffer)
{
- int (*call_fn)(struct calling_interface_buffer *) = NULL;
- struct device *selected_dev = NULL;
+ struct smbios_device *selected = NULL;
struct smbios_device *priv;
int ret;
mutex_lock(&smbios_mutex);
list_for_each_entry(priv, &smbios_device_list, list) {
- if (!selected_dev || priv->device->id >= selected_dev->id) {
- dev_dbg(priv->device, "Trying device ID: %d\n",
- priv->device->id);
- call_fn = priv->call_fn;
- selected_dev = priv->device;
+ if (!selected || priv->priority >= selected->priority) {
+ dev_dbg(priv->device, "Trying device ID: %d\n", priv->priority);
+ selected = priv;
}
}
- if (!selected_dev) {
+ if (!selected) {
ret = -ENODEV;
pr_err("No dell-smbios drivers are loaded\n");
goto out_smbios_call;
}
- ret = call_fn(buffer);
+ ret = selected->call_fn(buffer);
out_smbios_call:
mutex_unlock(&smbios_mutex);
diff --git a/drivers/platform/x86/dell/dell-smbios-smm.c b/drivers/platform/x86/dell/dell-smbios-smm.c
index 4d375985c85f..7055e2c40f34 100644
--- a/drivers/platform/x86/dell/dell-smbios-smm.c
+++ b/drivers/platform/x86/dell/dell-smbios-smm.c
@@ -125,8 +125,7 @@ int init_dell_smbios_smm(void)
if (ret)
goto fail_platform_device_add;
- ret = dell_smbios_register_device(&platform_device->dev,
- &dell_smbios_smm_call);
+ ret = dell_smbios_register_device(&platform_device->dev, 0, &dell_smbios_smm_call);
if (ret)
goto fail_register;
diff --git a/drivers/platform/x86/dell/dell-smbios-wmi.c b/drivers/platform/x86/dell/dell-smbios-wmi.c
index ae9012549560..a7dca8c59d60 100644
--- a/drivers/platform/x86/dell/dell-smbios-wmi.c
+++ b/drivers/platform/x86/dell/dell-smbios-wmi.c
@@ -264,9 +264,7 @@ static int dell_smbios_wmi_probe(struct wmi_device *wdev, const void *context)
if (ret)
return ret;
- /* ID is used by dell-smbios to set priority of drivers */
- wdev->dev.id = 1;
- ret = dell_smbios_register_device(&wdev->dev, &dell_smbios_wmi_call);
+ ret = dell_smbios_register_device(&wdev->dev, 1, &dell_smbios_wmi_call);
if (ret)
return ret;
diff --git a/drivers/platform/x86/dell/dell-smbios.h b/drivers/platform/x86/dell/dell-smbios.h
index 77baa15eb523..f421b8533a9e 100644
--- a/drivers/platform/x86/dell/dell-smbios.h
+++ b/drivers/platform/x86/dell/dell-smbios.h
@@ -64,7 +64,7 @@ struct calling_interface_structure {
struct calling_interface_token tokens[];
} __packed;
-int dell_smbios_register_device(struct device *d, void *call_fn);
+int dell_smbios_register_device(struct device *d, int priority, void *call_fn);
void dell_smbios_unregister_device(struct device *d);
int dell_smbios_error(int value);
--
2.39.5
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] platform/x86: dell-smbios-wmi: Stop touching WMI device ID
2025-07-12 14:02 [PATCH] platform/x86: dell-smbios-wmi: Stop touching WMI device ID Armin Wolf
@ 2025-07-22 13:14 ` Ilpo Järvinen
0 siblings, 0 replies; 2+ messages in thread
From: Ilpo Järvinen @ 2025-07-22 13:14 UTC (permalink / raw)
To: Armin Wolf; +Cc: hansg, Dell.Client.Kernel, platform-driver-x86, LKML
On Sat, 12 Jul 2025, Armin Wolf wrote:
> The WMI core itself uses wdev->dev.id internally to track device IDs,
> so modifying this value will result in a resource leak.
>
> Fix this by not using the device ID for SMBIOS prioritization.
Please describe the solution properly. The patch deals with what is called
"priority" which is not covered by the changelog text at all.
> Tested on a Dell Inspiron 3505.
>
> Fixes: 73f0f2b52c5e ("platform/x86: wmi: Fix WMI device naming issue")
> Signed-off-by: Armin Wolf <W_Armin@gmx.de>
> ---
> drivers/platform/x86/dell/dell-smbios-base.c | 19 +++++++++----------
> drivers/platform/x86/dell/dell-smbios-smm.c | 3 +--
> drivers/platform/x86/dell/dell-smbios-wmi.c | 4 +---
> drivers/platform/x86/dell/dell-smbios.h | 2 +-
> 4 files changed, 12 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/platform/x86/dell/dell-smbios-base.c b/drivers/platform/x86/dell/dell-smbios-base.c
> index 01c72b91a50d..444786102f02 100644
> --- a/drivers/platform/x86/dell/dell-smbios-base.c
> +++ b/drivers/platform/x86/dell/dell-smbios-base.c
> @@ -39,6 +39,7 @@ struct token_sysfs_data {
> struct smbios_device {
> struct list_head list;
> struct device *device;
> + int priority;
> int (*call_fn)(struct calling_interface_buffer *arg);
> };
>
> @@ -145,7 +146,7 @@ int dell_smbios_error(int value)
> }
> EXPORT_SYMBOL_GPL(dell_smbios_error);
>
> -int dell_smbios_register_device(struct device *d, void *call_fn)
> +int dell_smbios_register_device(struct device *d, int priority, void *call_fn)
> {
> struct smbios_device *priv;
>
> @@ -154,6 +155,7 @@ int dell_smbios_register_device(struct device *d, void *call_fn)
> return -ENOMEM;
> get_device(d);
> priv->device = d;
> + priv->priority = priority;
> priv->call_fn = call_fn;
> mutex_lock(&smbios_mutex);
> list_add_tail(&priv->list, &smbios_device_list);
> @@ -292,28 +294,25 @@ EXPORT_SYMBOL_GPL(dell_smbios_call_filter);
>
> int dell_smbios_call(struct calling_interface_buffer *buffer)
> {
> - int (*call_fn)(struct calling_interface_buffer *) = NULL;
> - struct device *selected_dev = NULL;
> + struct smbios_device *selected = NULL;
> struct smbios_device *priv;
> int ret;
>
> mutex_lock(&smbios_mutex);
> list_for_each_entry(priv, &smbios_device_list, list) {
> - if (!selected_dev || priv->device->id >= selected_dev->id) {
> - dev_dbg(priv->device, "Trying device ID: %d\n",
> - priv->device->id);
> - call_fn = priv->call_fn;
> - selected_dev = priv->device;
> + if (!selected || priv->priority >= selected->priority) {
> + dev_dbg(priv->device, "Trying device ID: %d\n", priv->priority);
> + selected = priv;
> }
> }
>
> - if (!selected_dev) {
> + if (!selected) {
> ret = -ENODEV;
> pr_err("No dell-smbios drivers are loaded\n");
> goto out_smbios_call;
> }
>
> - ret = call_fn(buffer);
> + ret = selected->call_fn(buffer);
>
> out_smbios_call:
> mutex_unlock(&smbios_mutex);
> diff --git a/drivers/platform/x86/dell/dell-smbios-smm.c b/drivers/platform/x86/dell/dell-smbios-smm.c
> index 4d375985c85f..7055e2c40f34 100644
> --- a/drivers/platform/x86/dell/dell-smbios-smm.c
> +++ b/drivers/platform/x86/dell/dell-smbios-smm.c
> @@ -125,8 +125,7 @@ int init_dell_smbios_smm(void)
> if (ret)
> goto fail_platform_device_add;
>
> - ret = dell_smbios_register_device(&platform_device->dev,
> - &dell_smbios_smm_call);
> + ret = dell_smbios_register_device(&platform_device->dev, 0, &dell_smbios_smm_call);
> if (ret)
> goto fail_register;
>
> diff --git a/drivers/platform/x86/dell/dell-smbios-wmi.c b/drivers/platform/x86/dell/dell-smbios-wmi.c
> index ae9012549560..a7dca8c59d60 100644
> --- a/drivers/platform/x86/dell/dell-smbios-wmi.c
> +++ b/drivers/platform/x86/dell/dell-smbios-wmi.c
> @@ -264,9 +264,7 @@ static int dell_smbios_wmi_probe(struct wmi_device *wdev, const void *context)
> if (ret)
> return ret;
>
> - /* ID is used by dell-smbios to set priority of drivers */
> - wdev->dev.id = 1;
> - ret = dell_smbios_register_device(&wdev->dev, &dell_smbios_wmi_call);
> + ret = dell_smbios_register_device(&wdev->dev, 1, &dell_smbios_wmi_call);
> if (ret)
> return ret;
>
> diff --git a/drivers/platform/x86/dell/dell-smbios.h b/drivers/platform/x86/dell/dell-smbios.h
> index 77baa15eb523..f421b8533a9e 100644
> --- a/drivers/platform/x86/dell/dell-smbios.h
> +++ b/drivers/platform/x86/dell/dell-smbios.h
> @@ -64,7 +64,7 @@ struct calling_interface_structure {
> struct calling_interface_token tokens[];
> } __packed;
>
> -int dell_smbios_register_device(struct device *d, void *call_fn);
> +int dell_smbios_register_device(struct device *d, int priority, void *call_fn);
> void dell_smbios_unregister_device(struct device *d);
>
> int dell_smbios_error(int value);
>
--
i.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-07-22 13:14 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-12 14:02 [PATCH] platform/x86: dell-smbios-wmi: Stop touching WMI device ID Armin Wolf
2025-07-22 13:14 ` Ilpo Järvinen
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).