From 6e82aa5ace5a89f690a70832af584a4ac4696d2e Mon Sep 17 00:00:00 2001 From: Cunyin Chang Date: Tue, 12 Dec 2017 10:32:33 +0800 Subject: [PATCH] nvme: Add support of hot remove vfio-attached devices in pcie layer. Change-Id: Ia7d6ca2d6c0bec6345f05718f6a6328eccda2dcc Signed-off-by: Cunyin Chang Reviewed-on: https://review.gerrithub.io/391329 Reviewed-by: Ben Walker Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp --- lib/nvme/nvme_pcie.c | 14 +++++++++++++- test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c | 6 ++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index baea1997e..37521f3e0 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -235,9 +235,10 @@ static int _nvme_pcie_hotplug_monitor(void *cb_ctx, spdk_nvme_probe_cb probe_cb, spdk_nvme_remove_cb remove_cb) { - struct spdk_nvme_ctrlr *ctrlr; + struct spdk_nvme_ctrlr *ctrlr, *tmp; struct spdk_uevent event; struct spdk_pci_addr pci_addr; + union spdk_nvme_csts_register csts; while (spdk_get_uevent(hotplug_fd, &event) > 0) { if (event.subsystem == SPDK_NVME_UEVENT_SUBSYSTEM_UIO || @@ -275,6 +276,17 @@ _nvme_pcie_hotplug_monitor(void *cb_ctx, spdk_nvme_probe_cb probe_cb, } } } + + /* This is a work around for vfio-attached device hot remove detection. */ + TAILQ_FOREACH_SAFE(ctrlr, &g_spdk_nvme_driver->shared_attached_ctrlrs, tailq, tmp) { + csts = spdk_nvme_ctrlr_get_regs_csts(ctrlr); + if (csts.raw == 0xffffffffU) { + nvme_ctrlr_fail(ctrlr, true); + nvme_robust_mutex_unlock(&g_spdk_nvme_driver->lock); + remove_cb(cb_ctx, ctrlr); + nvme_robust_mutex_lock(&g_spdk_nvme_driver->lock); + } + } return 0; } diff --git a/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c b/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c index e0e87c403..b4a296afe 100644 --- a/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c +++ b/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c @@ -274,6 +274,12 @@ spdk_nvme_get_ctrlr_by_trid_unsafe(const struct spdk_nvme_transport_id *trid) return NULL; } +union spdk_nvme_csts_register spdk_nvme_ctrlr_get_regs_csts(struct spdk_nvme_ctrlr *ctrlr) +{ + union spdk_nvme_csts_register csts = {}; + + return csts; +} #if 0 /* TODO: update PCIe-specific unit test */ static void