Skip to content

Commit d26a9f4

Browse files
Wer-Wolfij-intel
authored andcommitted
platform/x86: dell-smbios-wmi: Stop touching WMI device ID
The Dell SMBIOS driver uses the "id" field inside struct device for prioritizing the WMI backend over the SMM backend. Because of this the WMI backend modifies the "id" field of the underlying WMI device. However 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 "id" field inside struct device for SMBIOS prioritization. Instead extend struct smbios_device with a separate "priority" field. Tested on a Dell Inspiron 3505. Fixes: 73f0f2b ("platform/x86: wmi: Fix WMI device naming issue") Signed-off-by: Armin Wolf <W_Armin@gmx.de> Link: https://lore.kernel.org/r/20250722183841.9552-1-W_Armin@gmx.de Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
1 parent 8f5ae30 commit d26a9f4

File tree

4 files changed

+12
-16
lines changed

4 files changed

+12
-16
lines changed

drivers/platform/x86/dell/dell-smbios-base.c

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ struct token_sysfs_data {
3939
struct smbios_device {
4040
struct list_head list;
4141
struct device *device;
42+
int priority;
4243
int (*call_fn)(struct calling_interface_buffer *arg);
4344
};
4445

@@ -145,7 +146,7 @@ int dell_smbios_error(int value)
145146
}
146147
EXPORT_SYMBOL_GPL(dell_smbios_error);
147148

148-
int dell_smbios_register_device(struct device *d, void *call_fn)
149+
int dell_smbios_register_device(struct device *d, int priority, void *call_fn)
149150
{
150151
struct smbios_device *priv;
151152

@@ -154,6 +155,7 @@ int dell_smbios_register_device(struct device *d, void *call_fn)
154155
return -ENOMEM;
155156
get_device(d);
156157
priv->device = d;
158+
priv->priority = priority;
157159
priv->call_fn = call_fn;
158160
mutex_lock(&smbios_mutex);
159161
list_add_tail(&priv->list, &smbios_device_list);
@@ -292,28 +294,25 @@ EXPORT_SYMBOL_GPL(dell_smbios_call_filter);
292294

293295
int dell_smbios_call(struct calling_interface_buffer *buffer)
294296
{
295-
int (*call_fn)(struct calling_interface_buffer *) = NULL;
296-
struct device *selected_dev = NULL;
297+
struct smbios_device *selected = NULL;
297298
struct smbios_device *priv;
298299
int ret;
299300

300301
mutex_lock(&smbios_mutex);
301302
list_for_each_entry(priv, &smbios_device_list, list) {
302-
if (!selected_dev || priv->device->id >= selected_dev->id) {
303-
dev_dbg(priv->device, "Trying device ID: %d\n",
304-
priv->device->id);
305-
call_fn = priv->call_fn;
306-
selected_dev = priv->device;
303+
if (!selected || priv->priority >= selected->priority) {
304+
dev_dbg(priv->device, "Trying device ID: %d\n", priv->priority);
305+
selected = priv;
307306
}
308307
}
309308

310-
if (!selected_dev) {
309+
if (!selected) {
311310
ret = -ENODEV;
312311
pr_err("No dell-smbios drivers are loaded\n");
313312
goto out_smbios_call;
314313
}
315314

316-
ret = call_fn(buffer);
315+
ret = selected->call_fn(buffer);
317316

318317
out_smbios_call:
319318
mutex_unlock(&smbios_mutex);

drivers/platform/x86/dell/dell-smbios-smm.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,7 @@ int init_dell_smbios_smm(void)
125125
if (ret)
126126
goto fail_platform_device_add;
127127

128-
ret = dell_smbios_register_device(&platform_device->dev,
129-
&dell_smbios_smm_call);
128+
ret = dell_smbios_register_device(&platform_device->dev, 0, &dell_smbios_smm_call);
130129
if (ret)
131130
goto fail_register;
132131

drivers/platform/x86/dell/dell-smbios-wmi.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,9 +264,7 @@ static int dell_smbios_wmi_probe(struct wmi_device *wdev, const void *context)
264264
if (ret)
265265
return ret;
266266

267-
/* ID is used by dell-smbios to set priority of drivers */
268-
wdev->dev.id = 1;
269-
ret = dell_smbios_register_device(&wdev->dev, &dell_smbios_wmi_call);
267+
ret = dell_smbios_register_device(&wdev->dev, 1, &dell_smbios_wmi_call);
270268
if (ret)
271269
return ret;
272270

drivers/platform/x86/dell/dell-smbios.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ struct calling_interface_structure {
6464
struct calling_interface_token tokens[];
6565
} __packed;
6666

67-
int dell_smbios_register_device(struct device *d, void *call_fn);
67+
int dell_smbios_register_device(struct device *d, int priority, void *call_fn);
6868
void dell_smbios_unregister_device(struct device *d);
6969

7070
int dell_smbios_error(int value);

0 commit comments

Comments
 (0)