[RFC PATCH] software node: Skip duplicated software_node sysfs
From: Qian Cai <hidden>
Date: 2021-11-01 20:04:49
Also in:
lkml
Subsystem:
driver core, kobjects, debugfs and sysfs, software nodes and device properties, the rest · Maintainers:
Greg Kroah-Hartman, "Rafael J. Wysocki", Danilo Krummrich, Linus Torvalds
A recent commit allowed device_create_managed_software_node() to call
software_node_notify() which could generate duplicated "software_node"
sysfs files. For example,
"/devices/platform/808622B7:01/xhci-hcd.3.auto/software_node"
Since it was created earlier from another path,
sysfs_create_link
software_node_notify
device_add
platform_device_add
dwc3_host_init
dwc3_probe
platform_probe
really_probe.part.0
really_probe
__driver_probe_device
driver_probe_device
__driver_attach
bus_for_each_dev
driver_attach
bus_add_driver
driver_register
__platform_driver_register
dwc3_driver_init at drivers/usb/dwc3/core.c:2072
do_one_initcall
Fixed it by using sysfs_create_link_nowarn() in software_node_notify() to
avoid those bad messages during booting,
sysfs: cannot create duplicate filename '/devices/platform/808622B7:01/xhci-hcd.3.auto/software_node'
Call trace:
dump_backtrace
show_stack
dump_stack_lvl
dump_stack
sysfs_warn_dup
sysfs_do_create_link_sd.isra.0
sysfs_create_link
software_node_notify
device_create_managed_software_node
iort_named_component_init
iort_iommu_configure_id
acpi_dma_configure_id
platform_dma_configure
really_probe.part.0
really_probe
__driver_probe_device
driver_probe_device
__driver_attach
bus_for_each_dev
driver_attach
bus_add_driver
driver_register
__platform_driver_register
xhci_plat_init
do_one_initcall
kernel_init_freeable
kernel_init
ret_from_fork
Fixes: 5aeb05b27f81 ("software node: balance refcount for managed software nodes")
Signed-off-by: Qian Cai <redacted>
---
drivers/base/swnode.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 4debcea4fb12..0a266c312aa3 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c@@ -1126,17 +1126,15 @@ void software_node_notify(struct device *dev) if (!swnode) return; - ret = sysfs_create_link(&dev->kobj, &swnode->kobj, "software_node"); - if (ret) + ret = sysfs_create_link_nowarn(&dev->kobj, &swnode->kobj, + "software_node"); + if (ret && ret != -EEXIST) return; - ret = sysfs_create_link(&swnode->kobj, &dev->kobj, dev_name(dev)); - if (ret) { + if (!sysfs_create_link(&swnode->kobj, &dev->kobj, dev_name(dev))) + kobject_get(&swnode->kobj); + else if (!ret) sysfs_remove_link(&dev->kobj, "software_node"); - return; - } - - kobject_get(&swnode->kobj); } void software_node_notify_remove(struct device *dev)
--
2.30.2