[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20231224050657.182022-5-haifeng.zhao@linux.intel.com>
Date: Sun, 24 Dec 2023 00:06:57 -0500
From: Ethan Zhao <haifeng.zhao@...ux.intel.com>
To: bhelgaas@...gle.com,
baolu.lu@...ux.intel.com,
dwmw2@...radead.org,
will@...nel.org,
robin.murphy@....com,
lukas@...ner.de
Cc: linux-pci@...r.kernel.org,
iommu@...ts.linux.dev,
linux-kernel@...r.kernel.org
Subject: [RFC PATCH v6 4/4] iommu/vt-d: break out devTLB invalidation if target device is gone
to fix the rare case, the in-process safe_removal unpluged device could
be supprise_removed anytime, thus check the target device state if it
is gone, don't wait for the completion/timeout anymore. it might cause
hard lockup or system hang
Signed-off-by: Ethan Zhao <haifeng.zhao@...ux.intel.com>
---
drivers/iommu/intel/dmar.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
index 23cb80d62a9a..7a273ee80c49 100644
--- a/drivers/iommu/intel/dmar.c
+++ b/drivers/iommu/intel/dmar.c
@@ -1423,6 +1423,13 @@ int qi_submit_sync(struct intel_iommu *iommu, struct qi_desc *desc,
writel(qi->free_head << shift, iommu->reg + DMAR_IQT_REG);
while (qi->desc_status[wait_index] != QI_DONE) {
+ /*
+ * if the devTLB invalidation target device is gone, don't wait
+ * anymore, it might take up to 1min+50%, causes system hang.
+ */
+ if (type == QI_DIOTLB_TYPE && iommu->flush_target_dev)
+ if (!pci_device_is_present(to_pci_dev(iommu->flush_target_dev)))
+ break;
/*
* We will leave the interrupts disabled, to prevent interrupt
* context to queue another cmd while a cmd is already submitted
--
2.31.1
Powered by blists - more mailing lists