`nvme_disable_ctrl()` takes 411 ms on a Dell XPS 13 with SK hynix PC300 NVMEe
Paul Menzel
pmenzel at molgen.mpg.de
Wed May 1 23:12:39 PDT 2024
[add forgotten reply to questions in second paragraph]
Am 02.05.24 um 08:04 schrieb Paul Menzel:
> Dear Keith,
>
>
> Thank you for your quick reply.
>
> Am 02.05.24 um 00:03 schrieb Keith Busch:
>> On Wed, May 01, 2024 at 10:58:05PM +0200, Paul Menzel wrote:
>>> Am 01.05.24 um 09:58 schrieb Keith Busch:
>>>> Exactly. Unless the device reports a lower D3 entry latency, then this
>>>> sounds like everything is working-as-designed.
>>>
>>> Maybe according to the spec, but I have a hard time to believe, that
>>> disks
>>> should take longer to shut down than coreboot to initialize a mainboard.
>>
>> That doesn't seem too hard to believe to me. A safe shutdown can often
>> take a while time for an SSD. I've seen other implementations orders of
>> magnitude worse than what you're showing.
>
> But why? Due to physics or due to “slow” firmware?
>
>> You could do an unsafe shutdown instead, but the device will just
>> take even more time to enable on its next power-on.
>
> Indeed, that is does not sound good.
>
>>> In the end, in my opinion, users cannot make an informed decision, if these
>>> things are hidden. If it would be visible somehow in the logs - maybe not
>>> warning but info level - then even not so technical users could inform
>>> themselves and factor this in their buying decision.
>>
>> What good is it to advertise a shutdown time when vendors are clearly
>> unreliable at reporting an accurate value?
Linux time stamps would be reliable, and showing if vendors lie is a
good thing, because then people can support vendors not lying.
>> If you need to see the driver report it from emperical testing,
>> then you've already bought the device, right?
Not necessarily, as logs from other systems can be accessed in databases
like the Hardware for Linux database [1] and the uploaded log messages [2].
>>>> You can check your device's advertised shutdown time (assuming your
>>>> device is nvme0):
>>>>
>>>> nvme id-ctrl /dev/nvme0 | grep rtd3e
>>>>
>>>> The value is reported in microseconds. If it shows 0, then the device
>>>> doesn't report an expected shutdown time.
>>>
>>> Thank you for sharing. It´s 60 ms:
>
> I added some debug prints:
>
> ```
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index 27281a9a8951..76857d5e8a1a 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -2335,6 +2335,10 @@ int nvme_disable_ctrl(struct nvme_ctrl *ctrl,
> bool shutdown)
> {
> int ret;
>
> + dev_err(ctrl->device,
> + "XXX Enter nvme_disable_ctrl with shutdown %s\n",
> + shutdown ? "yes" : "no");
> +
> ctrl->ctrl_config &= ~NVME_CC_SHN_MASK;
> if (shutdown)
> ctrl->ctrl_config |= NVME_CC_SHN_NORMAL;
> @@ -2346,14 +2350,24 @@ int nvme_disable_ctrl(struct nvme_ctrl *ctrl, bool shutdown)
> return ret;
>
> if (shutdown) {
> - return nvme_wait_ready(ctrl, NVME_CSTS_SHST_MASK,
> + dev_err(ctrl->device,
> + "XXX before nvme_wait_ready, shutdown_timeout %u\n", ctrl->shutdown_timeout);
> + ret = nvme_wait_ready(ctrl, NVME_CSTS_SHST_MASK,
> NVME_CSTS_SHST_CMPLT,
> ctrl->shutdown_timeout, "shutdown");
> + dev_err(ctrl->device,
> + "XXX after nvme_wait_ready\n");
> + return ret;
> }
> if (ctrl->quirks & NVME_QUIRK_DELAY_BEFORE_CHK_RDY)
> msleep(NVME_QUIRK_DELAY_AMOUNT);
> - return nvme_wait_ready(ctrl, NVME_CSTS_RDY, 0,
> + dev_err(ctrl->device,
> + "XXX before nvme_wait_ready, shutdown_timeout %u\n", (NVME_CAP_TIMEOUT(ctrl->cap) + 1) / 2);
> + ret = nvme_wait_ready(ctrl, NVME_CSTS_RDY, 0,
> (NVME_CAP_TIMEOUT(ctrl->cap) + 1) / 2,
> "reset");
> + dev_err(ctrl->device,
> + "XXX after nvme_wait_ready\n");
> + return ret;
> }
> EXPORT_SYMBOL_GPL(nvme_disable_ctrl);
> ```
>
> and got for “cold boot” and from ACPI S3 suspend and resume:
>
> ```
> [ 0.955837] nvme nvme0: XXX Enter nvme_disable_ctrl with shutdown no
> [ 0.955898] nvme nvme0: XXX before nvme_wait_ready, shutdown_timeout 128
> [ 0.961861] nvme nvme0: XXX after nvme_wait_ready
> [ 1.637251] device-mapper: core: CONFIG_IMA_DISABLE_HTABLE is disabled. Duplicate IMA measurements will not be recorded in the IMA log.
> [ 27.785752] wmi_bus wmi_bus-PNP0C14:01: [Firmware Bug]: WQBC data block query control method not found
> [ 29.811581] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
> [ 62.697526] nvme nvme0: XXX Enter nvme_disable_ctrl with shutdown yes
> [ 62.697538] nvme nvme0: XXX before nvme_wait_ready, shutdown_timeout 5
> [ 63.110008] nvme nvme0: XXX after nvme_wait_ready
> [ 63.308385] nvme nvme0: XXX Enter nvme_disable_ctrl with shutdown no
> [ 63.308394] nvme nvme0: XXX before nvme_wait_ready, shutdown_timeout 128
> [ 63.308399] nvme nvme0: XXX after nvme_wait_ready
> ```
>
> So this confirms the ftrace findings. Excuse my ignorance, so the
> time-out is in seconds? And how does this relate to the rtd3e value (410
> ms ≠ 60 ms ≠ 5 s(?)?
>
>
> Kind regards,
>
> Paul
[1]: https://linux-hardware.org/
[2]: https://github.com/linuxhw/Dmesg
More information about the Linux-nvme
mailing list