On 4/5/22 04:39, Limonciello, Mario wrote: > [AMD Official Use Only] > > > >> -----Original Message----- >> From: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx> >> Sent: Sunday, April 3, 2022 20:11 >> To: Limonciello, Mario <Mario.Limonciello@xxxxxxx> >> Cc: open list:LIBATA SUBSYSTEM (Serial and Parallel ATA drivers) <linux- >> ide@xxxxxxxxxxxxxxx>; open list <linux-kernel@xxxxxxxxxxxxxxx>; >> hdegoede@xxxxxxxxxx >> Subject: Re: [PATCH v2 2/2] ata: ahci: Protect users from setting policies their >> drives don't support >> >> On 3/3/22 12:49, Mario Limonciello wrote: >>> As the default low power policy applies to more chipsets and drives, it's >>> important to make sure that drives actually support the policy that a user >>> selected in their kernel configuration. >>> >>> If the drive doesn't support slumber, don't let the default policies >>> dependent upon slumber (`min_power` or `min_power_with_partial`) affect >> the >>> disk. >>> >>> Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> >> >> Mario, >> >> Can you resend a rebased version of this, on top of libata for-5.19 branch ? > > > OK. > >> >>> --- >>> Changes from v1->v2: >>> * Move deeper into codepaths >>> * Reset to MED_POWER rather than ignore >>> drivers/ata/libata-sata.c | 11 +++++++++++ >>> 1 file changed, 11 insertions(+) >>> >>> diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c >>> index 071158c0c44c..0dc03888c62b 100644 >>> --- a/drivers/ata/libata-sata.c >>> +++ b/drivers/ata/libata-sata.c >>> @@ -13,6 +13,7 @@ >>> #include <scsi/scsi_device.h> >>> #include <linux/libata.h> >>> >>> +#include "ahci.h" >>> #include "libata.h" >>> #include "libata-transport.h" >>> >>> @@ -368,10 +369,20 @@ int sata_link_scr_lpm(struct ata_link *link, enum >> ata_lpm_policy policy, >>> bool spm_wakeup) >>> { >>> struct ata_eh_context *ehc = &link->eh_context; >>> + struct ata_port *ap = link->ap; >>> + struct ahci_host_priv *hpriv; >>> bool woken_up = false; >>> u32 scontrol; >>> int rc; >>> >>> + hpriv = ap->host->private_data; >>> + if (policy >= ATA_LPM_MIN_POWER_WITH_PARTIAL && >>> + !(hpriv->cap & HOST_CAP_SSC)) { >>> + dev_warn(ap->host->dev, >>> + "This drive doesn't support slumber; restting policy to >> MED_POWER\n"); >> >> Typo here: s/restting/resetting. Also, s/doesn't/does not. >> >>> + policy = ATA_LPM_MED_POWER; >> >> Here, shouldn't we use the default policy defined by >> CONFIG_SATA_LPM_POLICY ? > > If they set it too aggressively we still don't want to honor it if the drive > can't do slumber I would expect. True. But if the default is set to a higher performance mode, we should not fall back to the med-power mode. We should either (1) fallback to the closest higher performance policy supported, or (2) not change the current policy at all. no ? See what ahci_update_initial_lpm_policy() does to check the possible "initial" (the default ?) policy. > >> >>> + } >>> + >>> rc = sata_scr_read(link, SCR_CONTROL, &scontrol); >>> if (rc) >>> return rc; >> >> >> -- >> Damien Le Moal >> Western Digital Research -- Damien Le Moal Western Digital Research