Re: [PATCH 1/5] driver core: separate function to shutdown one device

Pasha Tatashin
2026-04-20T20:25:38Z

On 04-20 11:26, David Jeffery wrote:
> Make a separate function for the part of device_shutdown() that does the
> shutown for a single device. This is in preparation for making device
> shutdown asynchronous.
>
> Signed-off-by: Stuart Hayes <stuart.w.hayes@gmail.com>
> Signed-off-by: David Jeffery <djeffery@redhat.com>
> Tested-by: Laurence Oberman <loberman@redhat.com>
> ---
> drivers/base/core.c | 71 +++++++++++++++++++++++++--------------------
> 1 file changed, 39 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/base/core.c b/drivers/base/core.c
> index 0613de0fbe44..5353c6c22d49 100644
> --- a/drivers/base/core.c
> +++ b/drivers/base/core.c
> @@ -4783,12 +4783,48 @@ int device_change_owner(struct device *dev, kuid_t kuid, kgid_t kgid)
> return error;
> }
>
> +static void shutdown_one_device(struct device *dev)
> +{
> + struct device *parent = dev->parent;
> +
> + /* hold lock to avoid race with probe/release */
> + if (parent)
> + device_lock(parent);
> + device_lock(dev);
> +
> + /* Don't allow any more runtime suspends */
> + pm_runtime_get_noresume(dev);
> + pm_runtime_barrier(dev);
> +
> + if (dev->class && dev->class->shutdown_pre) {
> + if (initcall_debug)
> + dev_info(dev, "shutdown_pre\n");
> + dev->class->shutdown_pre(dev);
> + }
> + if (dev->bus && dev->bus->shutdown) {
> + if (initcall_debug)
> + dev_info(dev, "shutdown\n");
> + dev->bus->shutdown(dev);
> + } else if (dev->driver && dev->driver->shutdown) {
> + if (initcall_debug)
> + dev_info(dev, "shutdown\n");
> + dev->driver->shutdown(dev);
> + }
> +
> + device_unlock(dev);
> + if (parent)
> + device_unlock(parent);
> +
> + put_device(parent);
> + put_device(dev);
> +}

Reviewed-by: Pasha Tatashin <pasha.tatashin@soleen.com>

Also, please CC: kexec@lists.infradead.org, this series helps the live
update, and kexec performance.

Pasha