2024-09-01 14:06:29 +00:00
|
|
|
From f0b4cffe4d1813305f783d208f260747ecc56c50 Mon Sep 17 00:00:00 2001
|
|
|
|
From: "Kevin.xie" <kevin.xie@starfivetech.com>
|
|
|
|
Date: Thu, 24 Nov 2022 16:59:12 +0800
|
|
|
|
Subject: [PATCH 072/116] drivers: nvme: Add precheck and delay for CQE pending
|
|
|
|
status.
|
|
|
|
|
|
|
|
To workaroud the NVMe I/O timeout problem in bootup S10udev case
|
|
|
|
which caused by the CQE update lantancy.
|
|
|
|
|
|
|
|
Signed-off-by: Kevin.xie <kevin.xie@starfivetech.com>
|
|
|
|
---
|
|
|
|
drivers/nvme/host/pci.c | 10 ++++++++++
|
|
|
|
1 file changed, 10 insertions(+)
|
|
|
|
|
|
|
|
--- a/drivers/nvme/host/pci.c
|
|
|
|
+++ b/drivers/nvme/host/pci.c
|
|
|
|
@@ -28,6 +28,7 @@
|
|
|
|
#include <linux/io-64-nonatomic-hi-lo.h>
|
|
|
|
#include <linux/sed-opal.h>
|
|
|
|
#include <linux/pci-p2pdma.h>
|
|
|
|
+#include <linux/delay.h>
|
|
|
|
|
|
|
|
#include "trace.h"
|
|
|
|
#include "nvme.h"
|
2024-12-09 23:19:18 +00:00
|
|
|
@@ -1058,6 +1059,15 @@ static inline int nvme_poll_cq(struct nv
|
2024-09-01 14:06:29 +00:00
|
|
|
{
|
|
|
|
int found = 0;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * In some cases, such as udev trigger, cqe status may update
|
|
|
|
+ * a little bit later than MSI, which cause an irq handle missing.
|
|
|
|
+ * To workaound, here we will prefetch the status first, and wait
|
|
|
|
+ * 1us if we get nothing.
|
|
|
|
+ */
|
|
|
|
+ if (!nvme_cqe_pending(nvmeq))
|
|
|
|
+ udelay(1);
|
|
|
|
+
|
|
|
|
while (nvme_cqe_pending(nvmeq)) {
|
|
|
|
found++;
|
|
|
|
/*
|