linux-stable/drivers/base
Herve Codina 9406d598a1 driver core: Introduce device_link_wait_removal()
commit 0462c56c29 upstream.

The commit 80dd33cf72 ("drivers: base: Fix device link removal")
introduces a workqueue to release the consumer and supplier devices used
in the devlink.
In the job queued, devices are release and in turn, when all the
references to these devices are dropped, the release function of the
device itself is called.

Nothing is present to provide some synchronisation with this workqueue
in order to ensure that all ongoing releasing operations are done and
so, some other operations can be started safely.

For instance, in the following sequence:
  1) of_platform_depopulate()
  2) of_overlay_remove()

During the step 1, devices are released and related devlinks are removed
(jobs pushed in the workqueue).
During the step 2, OF nodes are destroyed but, without any
synchronisation with devlink removal jobs, of_overlay_remove() can raise
warnings related to missing of_node_put():
  ERROR: memory leak, expected refcount 1 instead of 2

Indeed, the missing of_node_put() call is going to be done, too late,
from the workqueue job execution.

Introduce device_link_wait_removal() to offer a way to synchronize
operations waiting for the end of devlink removals (i.e. end of
workqueue jobs).
Also, as a flushing operation is done on the workqueue, the workqueue
used is moved from a system-wide workqueue to a local one.

Cc: stable@vger.kernel.org
Signed-off-by: Herve Codina <herve.codina@bootlin.com>
Tested-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Reviewed-by: Nuno Sa <nuno.sa@analog.com>
Reviewed-by: Saravana Kannan <saravanak@google.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Link: https://lore.kernel.org/r/20240325152140.198219-2-herve.codina@bootlin.com
Signed-off-by: Rob Herring <robh@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2024-04-10 16:28:32 +02:00
..
firmware_loader
power PM: sleep: wakeirq: fix wake irq warning in system suspend 2024-04-03 15:19:30 +02:00
regmap regmap: fix bogus error on regcache_sync success 2023-12-13 18:39:20 +01:00
test
Kconfig
Makefile
arch_numa.c arm64: irq: set the correct node for VMAP stack 2024-02-05 20:12:46 +00:00
arch_topology.c
attribute_container.c
auxiliary.c
base.h
bus.c
cacheinfo.c
class.c
component.c
container.c
core.c driver core: Introduce device_link_wait_removal() 2024-04-10 16:28:32 +02:00
cpu.c x86/rfds: Mitigate Register File Data Sampling (RFDS) 2024-03-15 10:48:21 -04:00
dd.c driver core: Release all resources during unbind before updating device links 2023-11-28 17:07:13 +00:00
devcoredump.c devcoredump: Send uevent once devcd is ready 2023-12-13 18:39:28 +01:00
devres.c
devtmpfs.c
driver.c
firmware.c
hypervisor.c
init.c
isa.c
map.c
memory.c mm/memory_hotplug: add missing mem_hotplug_lock 2024-01-10 17:10:33 +01:00
module.c
node.c base/node.c: initialize the accessor list before registering 2024-01-25 15:27:46 -08:00
physical_location.c
physical_location.h
pinctrl.c
platform-msi.c
platform.c
property.c device property: Allow const parameter to dev_fwnode() 2024-01-05 15:18:40 +01:00
soc.c
swnode.c software node: Let args be NULL in software_node_get_reference_args 2024-01-25 15:27:46 -08:00
syscore.c
topology.c
trace.c
trace.h
transport_class.c