Re: [PATCH] ata: libata: avoid superfluous disk spin down + spin up during hibernation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/8/24 02:15, Niklas Cassel wrote:
> A user reported that commit aa3998dbeb3a ("ata: libata-scsi: Disable scsi
> device manage_system_start_stop") introduced a spin down + immediate spin
> up of the disk both when entering and when resuming from hibernation.
> This behavior was not there before, and causes an increased latency both
> when when entering and when resuming from hibernation.
> 
> Hibernation is done by three consecutive PM events, in the following order:
> 1) PM_EVENT_FREEZE
> 2) PM_EVENT_THAW
> 3) PM_EVENT_HIBERNATE
> 
> Commit aa3998dbeb3a ("ata: libata-scsi: Disable scsi device
> manage_system_start_stop") modified ata_eh_handle_port_suspend() to call
> ata_dev_power_set_standby() (which spins down the disk), for both event
> PM_EVENT_FREEZE and event PM_EVENT_HIBERNATE.
> 
> Documentation/driver-api/pm/devices.rst, section "Entering Hibernation",
> explicitly mentions that PM_EVENT_FREEZE does not have to be put the device
> in a low-power state, and actually recommends not doing so. Thus, let's not
> spin down the disk on PM_EVENT_FREEZE. (The disk will instead be spun down
> during the subsequent PM_EVENT_HIBERNATE event.)
> 
> This way, PM_EVENT_FREEZE will behave as it did before commit aa3998dbeb3a
> ("ata: libata-scsi: Disable scsi device manage_system_start_stop"), while
> PM_EVENT_HIBERNATE will continue to spin down the disk.
> 
> This will avoid the superfluous spin down + spin up when entering and
> resuming from hibernation, while still making sure that the disk is spun
> down before actually entering hibernation.
> 
> Fixes: aa3998dbeb3a ("ata: libata-scsi: Disable scsi device manage_system_start_stop")

You forgot to add Cc: stable@xxxxxxxxxxxxxxx

With that added, looks good.

Reviewed-by: Damien Le Moal <dlemoal@xxxxxxxxxx>

> Signed-off-by: Niklas Cassel <cassel@xxxxxxxxxx>
> ---
>  drivers/ata/libata-eh.c | 18 ++++++++++++++----
>  1 file changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
> index 3f0144e7dc80..fa41ea57a978 100644
> --- a/drivers/ata/libata-eh.c
> +++ b/drivers/ata/libata-eh.c
> @@ -4099,10 +4099,20 @@ static void ata_eh_handle_port_suspend(struct ata_port *ap)
>  
>  	WARN_ON(ap->pflags & ATA_PFLAG_SUSPENDED);
>  
> -	/* Set all devices attached to the port in standby mode */
> -	ata_for_each_link(link, ap, HOST_FIRST) {
> -		ata_for_each_dev(dev, link, ENABLED)
> -			ata_dev_power_set_standby(dev);
> +	/*
> +	 * We will reach this point for all of the PM events:
> +	 * PM_EVENT_SUSPEND (if runtime pm, PM_EVENT_AUTO will also be set)
> +	 * PM_EVENT_FREEZE, and PM_EVENT_HIBERNATE.
> +	 *
> +	 * We do not want to perform disk spin down for PM_EVENT_FREEZE.
> +	 * (Spin down will be performed by the subsequent PM_EVENT_HIBERNATE.)
> +	 */
> +	if (!(ap->pm_mesg.event & PM_EVENT_FREEZE)) {
> +		/* Set all devices attached to the port in standby mode */
> +		ata_for_each_link(link, ap, HOST_FIRST) {
> +			ata_for_each_dev(dev, link, ENABLED)
> +				ata_dev_power_set_standby(dev);
> +		}
>  	}
>  
>  	/*


-- 
Damien Le Moal
Western Digital Research




[Index of Archives]     [Linux Filesystems]     [Linux SCSI]     [Linux RAID]     [Git]     [Kernel Newbies]     [Linux Newbie]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Samba]     [Device Mapper]

  Powered by Linux