driver core: fix async device shutdown hang
authorStuart Hayes <stuart.w.hayes@gmail.com>
Thu, 19 Sep 2024 04:31:43 +0000 (23:31 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 21 Sep 2024 09:14:52 +0000 (11:14 +0200)
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: 8064952c6504 ("driver core: shut down devices asynchronously")
Signed-off-by: Stuart Hayes <stuart.w.hayes@gmail.com>
Tested-by: Laurence Oberman <loberman@redhat.com>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Link: https://lore.kernel.org/r/20240919043143.1194950-1-stuart.w.hayes@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/base/core.c

index b69b82da8837ebb6b3497d52d46a43e26ea1c64a..76513e360496b66aea1d3184d473b85b3b95baa3 100644 (file)
@@ -4898,8 +4898,16 @@ void device_shutdown(void)
 
                idx = device_links_read_lock();
                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;
+               }
                device_links_read_unlock(idx);
                put_device(dev);