Hannes Reinecke 6f6fa1
From: Josh Triplett <josh@joshtriplett.org>
Hannes Reinecke 6f6fa1
Date: Fri, 28 Feb 2020 18:52:28 -0800
Hannes Reinecke 6f6fa1
Subject: [PATCH] nvme: Check for readiness more quickly, to speed up boot time
Hannes Reinecke 6f6fa1
Git-commit: 3e98c2443f5c7f127b5b7492a3089e92a1c85112
Michal Kubecek 66e035
Patch-mainline: v5.7-rc1
Hannes Reinecke 6f6fa1
References: bsc#1161930
Hannes Reinecke 6f6fa1
Hannes Reinecke 6f6fa1
After initialization, nvme_wait_ready checks for readiness every 100ms,
Hannes Reinecke 6f6fa1
even though the drive may be ready far sooner than that. This delays
Hannes Reinecke 6f6fa1
system boot by hundreds of milliseconds. Reduce the delay, checking for
Hannes Reinecke 6f6fa1
readiness every millisecond instead.
Hannes Reinecke 6f6fa1
Hannes Reinecke 6f6fa1
Boot-time tests on an AWS c5.12xlarge:
Hannes Reinecke 6f6fa1
Hannes Reinecke 6f6fa1
Before:
Hannes Reinecke 6f6fa1
[    0.546936] initcall nvme_init+0x0/0x5b returned 0 after 37 usecs
Hannes Reinecke 6f6fa1
...
Hannes Reinecke 6f6fa1
[    0.764178] nvme nvme0: 2/0/0 default/read/poll queues
Hannes Reinecke 6f6fa1
[    0.768424]  nvme0n1: p1
Hannes Reinecke 6f6fa1
[    0.774132] EXT4-fs (nvme0n1p1): mounted filesystem with ordered data mode. Opts: (null)
Hannes Reinecke 6f6fa1
[    0.774146] VFS: Mounted root (ext4 filesystem) on device 259:1.
Hannes Reinecke 6f6fa1
...
Hannes Reinecke 6f6fa1
[    0.788141] Run /sbin/init as init process
Hannes Reinecke 6f6fa1
Hannes Reinecke 6f6fa1
After:
Hannes Reinecke 6f6fa1
[    0.537088] initcall nvme_init+0x0/0x5b returned 0 after 37 usecs
Hannes Reinecke 6f6fa1
...
Hannes Reinecke 6f6fa1
[    0.543457] nvme nvme0: 2/0/0 default/read/poll queues
Hannes Reinecke 6f6fa1
[    0.548473]  nvme0n1: p1
Hannes Reinecke 6f6fa1
[    0.554339] EXT4-fs (nvme0n1p1): mounted filesystem with ordered data mode. Opts: (null)
Hannes Reinecke 6f6fa1
[    0.554344] VFS: Mounted root (ext4 filesystem) on device 259:1.
Hannes Reinecke 6f6fa1
...
Hannes Reinecke 6f6fa1
[    0.567931] Run /sbin/init as init process
Hannes Reinecke 6f6fa1
Hannes Reinecke 6f6fa1
Signed-off-by: Josh Triplett <josh@joshtriplett.org>
Hannes Reinecke 6f6fa1
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke 6f6fa1
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Hannes Reinecke 6f6fa1
Signed-off-by: Keith Busch <kbusch@kernel.org>
Hannes Reinecke 6f6fa1
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke 6f6fa1
---
Hannes Reinecke 6f6fa1
 drivers/nvme/host/core.c | 2 +-
Hannes Reinecke 6f6fa1
 1 file changed, 1 insertion(+), 1 deletion(-)
Hannes Reinecke 6f6fa1
Hannes Reinecke 6f6fa1
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
Hannes Reinecke 6f6fa1
index c9988942d0aa..0e38e07a302f 100644
Hannes Reinecke 6f6fa1
--- a/drivers/nvme/host/core.c
Hannes Reinecke 6f6fa1
+++ b/drivers/nvme/host/core.c
Hannes Reinecke 6f6fa1
@@ -2078,7 +2078,7 @@ static int nvme_wait_ready(struct nvme_ctrl *ctrl, u64 cap, bool enabled)
Hannes Reinecke 6f6fa1
 		if ((csts & NVME_CSTS_RDY) == bit)
Hannes Reinecke 6f6fa1
 			break;
Hannes Reinecke 6f6fa1
 
Hannes Reinecke 6f6fa1
-		msleep(100);
Hannes Reinecke 6f6fa1
+		usleep_range(1000, 2000);
Hannes Reinecke 6f6fa1
 		if (fatal_signal_pending(current))
Hannes Reinecke 6f6fa1
 			return -EINTR;
Hannes Reinecke 6f6fa1
 		if (time_after(jiffies, timeout)) {
Hannes Reinecke 6f6fa1
-- 
Hannes Reinecke 6f6fa1
2.16.4
Hannes Reinecke 6f6fa1