[PATCH] driver core: fix async device shutdown hang

Stuart Hayes posted 1 patch 2 months, 1 week ago
drivers/base/core.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
[PATCH] driver core: fix async device shutdown hang
Posted by Stuart Hayes 2 months, 1 week ago
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>
---
The patch this fixes is in driver-core-next and linux-next.

Please let me know if this needs to be a V2 or if it needs anything
else... it is the identical patch I sent in yesterday, except I added
a "Fixes:" tag and the comments.  Thank you for the help!

 drivers/base/core.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/base/core.c b/drivers/base/core.c
index b69b82da8837..76513e360496 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -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);
 
-- 
2.39.3
Re: [PATCH] driver core: fix async device shutdown hang
Posted by Nathan Chancellor 2 months, 1 week ago
On Wed, Sep 18, 2024 at 11:31:43PM -0500, Stuart Hayes wrote:
> 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>

All of my virtual testing seems happy with this change.

Tested-by: Nathan Chancellor <nathan@kernel.org>

> ---
> The patch this fixes is in driver-core-next and linux-next.
> 
> Please let me know if this needs to be a V2 or if it needs anything
> else... it is the identical patch I sent in yesterday, except I added
> a "Fixes:" tag and the comments.  Thank you for the help!
> 
>  drivers/base/core.c | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/base/core.c b/drivers/base/core.c
> index b69b82da8837..76513e360496 100644
> --- a/drivers/base/core.c
> +++ b/drivers/base/core.c
> @@ -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);
>  
> -- 
> 2.39.3
>
Re: [PATCH] driver core: fix async device shutdown hang
Posted by Greg Kroah-Hartman 2 months, 1 week ago
On Wed, Sep 18, 2024 at 11:31:43PM -0500, Stuart Hayes wrote:
> 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>

Nit, no blank line between Fixes: and signed-off-by is needed.

> ---
> The patch this fixes is in driver-core-next and linux-next.
> 
> Please let me know if this needs to be a V2 or if it needs anything
> else... it is the identical patch I sent in yesterday, except I added
> a "Fixes:" tag and the comments.  Thank you for the help!

In theory, yes, this is a v2 as something did change, but I can take
this as-is for now, thanks.

greg k-h