From: Blazej Kucman <blazej.kucman@linux.intel.com>
To: linux-pci@vger.kernel.org, ilpo.jarvinen@linux.intel.com,
bhelgaas@google.com
Cc: mstowe@redhat.com, mariusz.tkaczyk@linux.intel.com
Subject: Re: [REGRESSION] Setting the LED status via attention stopped working.
Date: Mon, 22 Jul 2024 16:21:25 +0200 [thread overview]
Message-ID: <20240722162125.00005e38@linux.intel.com> (raw)
In-Reply-To: <20240719122253.00004b0e@linux.intel.com>
On Fri, 19 Jul 2024 12:22:53 +0200
Blazej Kucman <blazej.kucman@linux.intel.com> wrote:
> Hi all,
>
> We discovered regression with setting LED state through "attention"
> for VMD slot. e.g /sys/bus/pci/slots/2-1/attention.
>
> Expected behavior:
> write status into "attention" will set the LED status correctly.
>
> Actual behavior:
> write the status causes undefined behavior, "attention" contains a
> different value than the one entered, the requested LED status is not
> set
>
> After bisection kernel, it turned out that the issue appeared between
> kernel v6.6..v6.7-rc1. Tested kernel:
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
>
> I found a patch that causes issue:
> PCI: hotplug: Use FIELD_GET/PREP()
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.7-rc1&id=abaaac4845a0d6f39f83cbaba4c3b46ba5f93170
> I confirmed this by reverting this patch from kernel 6.10.
>
> Issue was discovered by using ledmon utility (ledctl is a part of
> ledmon software) https://github.com/intel/ledmon,
> example command: ledctl locate={/dev/nvme6n1 }, should set locate
> status on nvme6n1
>
> The values that ledmon writes into "attention"
>
> #define ATTENTION_OFF 0xF /* (1111) Attention Off, Power Off
> */ #define ATTENTION_LOCATE 0x7 /* (0111) Attention Off, Power
> On */ #define ATTENTION_REBUILD 0x5 /* (0101) Attention On, Power
> On */ #define ATTENTION_FAILURE 0xD /* (1101) Attention On, Power
> Off */
>
> Without mentioned patch, writing these values will set the LEDs
> correctly.
>
> I was able to determine that the change in behavior was caused by this
> change @@ -484,7 +485,7 @@ int pciehp_set_raw_indicator_status(struct
> hotplug_slot *hotplug_slot, struct pci_dev *pdev = ctrl_dev(ctrl);
>
> pci_config_pm_runtime_get(pdev);
> - pcie_write_cmd_nowait(ctrl, status << 6,
> + pcie_write_cmd_nowait(ctrl, FIELD_PREP(PCI_EXP_SLTCTL_AIC,
> status), PCI_EXP_SLTCTL_AIC | PCI_EXP_SLTCTL_PIC);
> pci_config_pm_runtime_put(pdev)
>
> I added logging of bit shift values and there is a significant
> difference in the operation of this method
>
> int pciehp_set_raw_indicator_status(struct hotplug_slot *hotplug_slot,
> u8 status)
> {
> struct controller *ctrl = to_ctrl(hotplug_slot);
> struct pci_dev *pdev = ctrl_dev(ctrl);
>
> pr_err("SET_INDICATOR_ST START");
>
> pr_err("SET_INDICATOR_ST_INPUT: STATUS: %d %u", status,
> status); pr_err("SET_INDICATOR_ST_OLD d %d, u %u", status << 6, status
> << 6);
>
> u8 test = FIELD_PREP(PCI_EXP_SLTCTL_AIC, status);
> pr_err("SET_INDICATOR_ST_NEW d %d, u %u", test, test);
>
> pr_err("SET_INDICATOR_ST END");
>
> pci_config_pm_runtime_get(pdev);
> pcie_write_cmd_nowait(ctrl, status << 6,
> PCI_EXP_SLTCTL_AIC |
> PCI_EXP_SLTCTL_PIC); pci_config_pm_runtime_put(pdev);
> return 0;
> }
> LOGS:
>
> [ 75.814893] SET_INDICATOR_ST START
> [ 75.814895] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 75.818362] SET_INDICATOR_ST_OLD d 960, u 960
> [ 75.823143] SET_INDICATOR_ST_NEW d 192, u 192
> [ 75.827634] SET_INDICATOR_ST END
> [ 75.832880] SET_INDICATOR_ST START
> [ 75.836167] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 75.839626] SET_INDICATOR_ST_OLD d 960, u 960
> [ 75.844408] SET_INDICATOR_ST_NEW d 192, u 192
> [ 75.848834] SET_INDICATOR_ST END
> [ 76.225732] SET_INDICATOR_ST START
> [ 76.229022] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 76.232481] SET_INDICATOR_ST_OLD d 960, u 960
> [ 76.237259] SET_INDICATOR_ST_NEW d 192, u 192
> [ 76.241691] SET_INDICATOR_ST END
> [ 76.250247] SET_INDICATOR_ST START
> [ 76.253530] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 76.256990] SET_INDICATOR_ST_OLD d 960, u 960
> [ 76.261766] SET_INDICATOR_ST_NEW d 192, u 192
> [ 76.266189] SET_INDICATOR_ST END
> [ 77.223562] SET_INDICATOR_ST START
> [ 77.226852] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 77.230312] SET_INDICATOR_ST_OLD d 960, u 960
> [ 77.235091] SET_INDICATOR_ST_NEW d 192, u 192
> [ 77.239521] SET_INDICATOR_ST END
> [ 77.244765] SET_INDICATOR_ST START
> [ 77.248051] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 77.251510] SET_INDICATOR_ST_OLD d 960, u 960
> [ 77.256288] SET_INDICATOR_ST_NEW d 192, u 192
> [ 77.260725] SET_INDICATOR_ST END
> [ 77.267606] SET_INDICATOR_ST START
>
> # ATTENTION_LOCATE
> [ 77.270895] SET_INDICATOR_ST_INPUT: STATUS: 7 7
> [ 77.274356] SET_INDICATOR_ST_OLD d 448, u 448
> [ 77.278959] SET_INDICATOR_ST_NEW d 192, u 192
> [ 77.283379] SET_INDICATOR_ST END
>
> With patch PCI: hotplug: Use FIELD_GET/PREP():
> after trying to set ATTENTION_LOCATE, file "attention" contains value
> 0x3 instead expected 0x7.
>
> [ 862.150910] SET_INDICATOR_ST START
> [ 862.150912] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 862.154375] SET_INDICATOR_ST_OLD d 960, u 960
> [ 862.159159] SET_INDICATOR_ST_NEW d 192, u 192
> [ 862.163591] SET_INDICATOR_ST END
> [ 862.169235] SET_INDICATOR_ST START
> [ 862.172524] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 862.175984] SET_INDICATOR_ST_OLD d 960, u 960
> [ 862.182933] SET_INDICATOR_ST_NEW d 192, u 192
> [ 862.189190] SET_INDICATOR_ST END
> [ 862.198302] SET_INDICATOR_ST START
> [ 862.203290] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 862.208398] SET_INDICATOR_ST_OLD d 960, u 960
> [ 862.214780] SET_INDICATOR_ST_NEW d 192, u 192
> [ 862.220817] SET_INDICATOR_ST END
> [ 862.231044] SET_INDICATOR_ST START
> [ 862.235931] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 862.240994] SET_INDICATOR_ST_OLD d 960, u 960
> [ 862.247376] SET_INDICATOR_ST_NEW d 192, u 192
> [ 862.253411] SET_INDICATOR_ST END
> [ 862.262574] SET_INDICATOR_ST START
> [ 862.267471] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 862.272537] SET_INDICATOR_ST_OLD d 960, u 960
> [ 862.278918] SET_INDICATOR_ST_NEW d 192, u 192
> [ 862.284945] SET_INDICATOR_ST END
> [ 862.291705] SET_INDICATOR_ST START
> [ 862.296596] SET_INDICATOR_ST_INPUT: STATUS: 15 15
> [ 862.301656] SET_INDICATOR_ST_OLD d 960, u 960
> [ 862.308039] SET_INDICATOR_ST_NEW d 192, u 192
> [ 862.314064] SET_INDICATOR_ST END
>
> # ATTENTION_REBUILD
> [ 862.322480] SET_INDICATOR_ST START
> [ 862.327388] SET_INDICATOR_ST_INPUT: STATUS: 5 5
> [ 862.332454] SET_INDICATOR_ST_OLD d 320, u 320
> [ 862.338662] SET_INDICATOR_ST_NEW d 64, u 64
> [ 862.344704] SET_INDICATOR_ST END
>
> With patch PCI: hotplug: Use FIELD_GET/PREP():
> After trying to set ATTENTION_REBUILD, file "attention" contains value
> 0x1 instead expected 0x5.
>
> This topic is quite important for us, because this change has been
> included in RHEL9.5 kernel and causes LED setting for VMD drives to
> not work.
>
> Looking at the above logs, I don't know if it always worked wrong,
> because the input status is u8 and the bit shift did not cut off some
> of higher bits e.g. for ATTENTION_LOCATE 0x7 (0111),
> currently macro FIELD_PREP it does this through "AND" with mask.
>
> Regards,
> Blazej
>
Hi,
I sent a fix to mailing list.
[PATCH] PCI: pciehp_hpc: Fix set raw indicator status
https://lore.kernel.org/linux-pci/20240722141440.7210-1-blazej.kucman@intel.com/T/#u
Thanks,
Blazej
prev parent reply other threads:[~2024-07-22 14:21 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-19 10:22 [REGRESSION] Setting the LED status via attention stopped working Blazej Kucman
2024-07-22 14:21 ` Blazej Kucman [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240722162125.00005e38@linux.intel.com \
--to=blazej.kucman@linux.intel.com \
--cc=bhelgaas@google.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=linux-pci@vger.kernel.org \
--cc=mariusz.tkaczyk@linux.intel.com \
--cc=mstowe@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).