From 13f8cf1536ca5222878d2c03802fb367e1340ef9 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Sat, 29 Apr 2017 12:21:32 -0700 Subject: [PATCH] nvme: add NVME_QUIRK_DELAY_AFTER_QUEUE_ALLOC The VirtualBox emulated NVMe device will intermittently hang on the first read/write command after an I/O qpair has been allocated. The frequency of the hang diminishes if a delay is added after allocating the I/O qpair - until it disappears completely with a 100us delay. So add a quirk to insert this delay. Note - the 100us delay was tested by running the hello_world example app 50000 times. Signed-off-by: Jim Harris Change-Id: I237e31b1b8a1a1e28262851ae0a21cd7345f0f1a --- include/spdk/pci_ids.h | 1 + lib/nvme/nvme_ctrlr.c | 4 ++++ lib/nvme/nvme_internal.h | 6 ++++++ lib/nvme/nvme_quirks.c | 3 +++ 4 files changed, 14 insertions(+) diff --git a/include/spdk/pci_ids.h b/include/spdk/pci_ids.h index 3f9f25a91..5f7aa2949 100644 --- a/include/spdk/pci_ids.h +++ b/include/spdk/pci_ids.h @@ -47,6 +47,7 @@ extern "C" { #define SPDK_PCI_ANY_ID 0xffff #define SPDK_PCI_VID_INTEL 0x8086 #define SPDK_PCI_VID_MEMBLAZE 0x1c5f +#define SPDK_PCI_VID_VIRTUALBOX 0x80ee /** * PCI class code for NVMe devices. diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index d7cb083e6..25334bc5e 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -192,6 +192,10 @@ spdk_nvme_ctrlr_alloc_io_qpair(struct spdk_nvme_ctrlr *ctrlr, nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); + if (ctrlr->quirks & NVME_QUIRK_DELAY_AFTER_QUEUE_ALLOC) { + spdk_delay_us(100); + } + return qpair; } diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index ad4c82fbc..8afd104fa 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -89,6 +89,12 @@ */ #define NVME_INTEL_QUIRK_STRIPING 0x8 +/* + * The controller needs a delay after allocating an I/O queue pair + * before it is ready to accept I/O commands. + */ +#define NVME_QUIRK_DELAY_AFTER_QUEUE_ALLOC 0x10 + #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 7e552af83..fcd92144f 100644 --- a/lib/nvme/nvme_quirks.c +++ b/lib/nvme/nvme_quirks.c @@ -53,6 +53,9 @@ static const struct nvme_quirk nvme_quirks[] = { { {SPDK_PCI_VID_MEMBLAZE, 0x0540, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_QUIRK_DELAY_BEFORE_CHK_RDY }, + { {SPDK_PCI_VID_VIRTUALBOX, 0x4e56, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, + NVME_QUIRK_DELAY_AFTER_QUEUE_ALLOC + }, { {0x0000, 0x0000, 0x0000, 0x0000}, 0} };