Commit 4f2c346e authored by Stuart Hayes's avatar Stuart Hayes Committed by Greg Kroah-Hartman

driver core: fix async device shutdown hang

Modify device_shutdown() so that supplier devices do not wait for
consumer devices to be shut down first when the devlink is sync state
only, since the consumer is not dependent on the supplier in this case.

Without this change, a circular dependency could hang the system.

Fixes: 8064952c ("driver core: shut down devices asynchronously")
Signed-off-by: default avatarStuart Hayes <stuart.w.hayes@gmail.com>
Tested-by: default avatarLaurence Oberman <loberman@redhat.com>
Tested-by: default avatarNathan Chancellor <nathan@kernel.org>
Link: https://lore.kernel.org/r/20240919043143.1194950-1-stuart.w.hayes@gmail.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6a36d828
...@@ -4898,8 +4898,16 @@ void device_shutdown(void) ...@@ -4898,8 +4898,16 @@ void device_shutdown(void)
idx = device_links_read_lock(); idx = device_links_read_lock();
list_for_each_entry_rcu(link, &dev->links.suppliers, c_node, list_for_each_entry_rcu(link, &dev->links.suppliers, c_node,
device_links_read_lock_held()) device_links_read_lock_held()) {
/*
* sync_state_only suppliers don't need to wait,
* aren't reordered on devices_kset, so making them
* wait could result in a hang
*/
if (device_link_flag_is_sync_state_only(link->flags))
continue;
link->supplier->p->shutdown_after = cookie; link->supplier->p->shutdown_after = cookie;
}
device_links_read_unlock(idx); device_links_read_unlock(idx);
put_device(dev); put_device(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment