diff --git a/include/spdk/pci_ids.h b/include/spdk/pci_ids.h index 6b3e7b5f9..a76220537 100644 --- a/include/spdk/pci_ids.h +++ b/include/spdk/pci_ids.h @@ -51,6 +51,7 @@ extern "C" { #define SPDK_PCI_VID_VIRTUALBOX 0x80ee #define SPDK_PCI_VID_VIRTIO 0x1af4 #define SPDK_PCI_VID_CNEXLABS 0x1d1d +#define SPDK_PCI_VID_VMWARE 0x15ad /** * PCI class code for NVMe devices. diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index b9e73ad11..d699c7456 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -544,6 +544,9 @@ nvme_ctrlr_shutdown(struct spdk_nvme_ctrlr *ctrlr) } while (ms_waited < shutdown_timeout_ms); SPDK_ERRLOG("did not shutdown within %u milliseconds\n", shutdown_timeout_ms); + if (ctrlr->quirks & NVME_QUIRK_SHST_COMPLETE) { + SPDK_ERRLOG("likely due to shutdown handling in the VMWare emulated NVMe SSD\n"); + } } static int diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 785152fb0..6c05e4c79 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -116,6 +116,13 @@ extern pid_t g_spdk_nvme_pid; */ #define NVME_INTEL_QUIRK_NO_LOG_PAGES 0x100 +/* + * The controller does not set SHST_COMPLETE in a reasonable amount of time. This + * is primarily seen in virtual VMWare NVMe SSDs. This quirk merely adds an additional + * error message that on VMWare NVMe SSDs, the shutdown timeout may be expected. + */ +#define NVME_QUIRK_SHST_COMPLETE 0x200 + #define NVME_MAX_ASYNC_EVENTS (8) #define NVME_MIN_TIMEOUT_PERIOD (5) diff --git a/lib/nvme/nvme_quirks.c b/lib/nvme/nvme_quirks.c index 9a213b12d..df8ea0cfb 100644 --- a/lib/nvme/nvme_quirks.c +++ b/lib/nvme/nvme_quirks.c @@ -83,6 +83,9 @@ static const struct nvme_quirk nvme_quirks[] = { NVME_QUIRK_IDENTIFY_CNS | NVME_QUIRK_OCSSD }, + { {SPDK_PCI_VID_VMWARE, 0x07f0, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + NVME_QUIRK_SHST_COMPLETE + }, { {0x0000, 0x0000, 0x0000, 0x0000}, 0} };