[PATCH i-g-t] lib/igt_pm: Skip LPM policy control on unsupported SATA hosts

Damien Le Moal dlemoal at kernel.org
Thu Jul 31 08:04:06 UTC 2025


On 7/31/25 4:41 PM, Chaitanya Kumar Borah wrote:
> With [1], LPM policy control is now disabled for external SATA ports.
> This led to a regression in our CI runs [2]. Discussions on the regression
> resulted in patch [3] which introduces a new sysfs entry, querying
> which we can determine if LPM policy control is allowed on a host or not.
> 
> Store/Re-store LPM policy only when it is allowed. If the sysfs entry is
> not present assume LPM policy control is allowed. This  maintains backward
> compatibility.

Note: allowed, yes, but that does not mean it will actually work or do
anything, since the port or the device may not be supporting LPN at all.

> 
> [1] https://lore.kernel.org/linux-ide/20250701125321.69496-8-dlemoal@kernel.org/
> [2] https://lore.kernel.org/linux-ide/07563042-6576-41cd-9a95-de83cfc95de1@intel.com/
> [3] https://lore.kernel.org/linux-ide/20250730001947.332661-1-dlemoal@kernel.org/
> 
> Signed-off-by: Chaitanya Kumar Borah <chaitanya.kumar.borah at intel.com>

Patch looks OK to me (nit below though).

Reviewed-by: Damien Le Moal <dlemoal at kernel.org>


> ---
>  lib/igt_pm.c | 35 +++++++++++++++++++++++++++++++++++
>  1 file changed, 35 insertions(+)
> 
> diff --git a/lib/igt_pm.c b/lib/igt_pm.c
> index cf1c442f8..1ffcdcef3 100644
> --- a/lib/igt_pm.c
> +++ b/lib/igt_pm.c
> @@ -321,6 +321,35 @@ void igt_pm_enable_audio_runtime_pm(void)
>  		igt_debug("Failed to enable audio runtime PM! (%d)\n", -err);
>  }
>  
> +static bool lpm_supported_by_sata_host(int host_num)
> +{
> +	int fd;
> +	ssize_t len;
> +	char buf[2];
> +	char file_name[PATH_MAX];
> +
> +	snprintf(file_name, PATH_MAX,
> +		 "/sys/class/scsi_host/host%d/link_power_management_supported",
> +		 host_num);
> +
> +	fd = open(file_name, O_RDONLY);
> +
> +	/* assume LPM is supported if sysfs entry is absent. This preserves default behaviour */
> +	if (fd < 0)
> +		return true;
> +
> +	len = read(fd, buf, 1);
> +
> +	close(fd);

Nit: this would all be a lot simpler using scanf:
	
	snprintf(file_name, PATH_MAX,
		 "/sys/class/scsi_host/host%d/link_power_management_supported",
		 host_num);

	/*
	 * If sysfs entry is absent, assume that LPM is supported to
	 * preserve the default behaviour.
	 */
	if (scanf(file_name, "%d", &supported) != 1)
		return true;

	return supported;

> +
> +	if (len <= 0)
> +		return true;
> +
> +	buf[len] = '\0';
> +
> +	return buf[0] == '1';
> +}
> +
>  static void __igt_pm_enable_sata_link_power_management(void)
>  {
>  	int fd, i;
> @@ -372,6 +401,9 @@ static void __igt_pm_enable_sata_link_power_management(void)
>  	igt_install_exit_handler(__igt_pm_sata_link_pm_exit_handler);
>  
>  	for (i = 0; i < __scsi_host_cnt; i++) {
> +		if (!lpm_supported_by_sata_host(i))
> +			continue;
> +
>  		snprintf(file_name, PATH_MAX,
>  			 "/sys/class/scsi_host/host%d/link_power_management_policy",
>  			 i);
> @@ -412,6 +444,9 @@ static void __igt_pm_restore_sata_link_power_management(void)
>  	for (i = 0; i < __scsi_host_cnt; i++) {
>  		int8_t policy;
>  
> +		if (!lpm_supported_by_sata_host(i))
> +			continue;
> +
>  		if (__sata_pm_policies[i] == POLICY_UNKNOWN)
>  			continue;
>  		else


-- 
Damien Le Moal
Western Digital Research


More information about the igt-dev mailing list