test/unit: Add test_nvme_pcie_hotplug_monitor to nvme_pcie_ut.c.
Add this test to increase code coverage rate. Signed-off-by: dongx.yi <dongx.yi@intel.com> Change-Id: I46533dcd1a528ae7385cdaa143aea9c396e2942c Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/472915 Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
parent
4ea996ce19
commit
94ec4785ef
@ -57,6 +57,20 @@ extern bool ut_fail_vtophys;
|
|||||||
|
|
||||||
bool fail_next_sge = false;
|
bool fail_next_sge = false;
|
||||||
|
|
||||||
|
struct spdk_nvme_ctrlr *g_ctrlr = NULL;
|
||||||
|
|
||||||
|
bool g_add_device = false;
|
||||||
|
|
||||||
|
bool g_device_is_enumerated = false;
|
||||||
|
|
||||||
|
bool g_device_is_removed = false;
|
||||||
|
|
||||||
|
bool g_remove_cb_done = false;
|
||||||
|
|
||||||
|
bool g_vfio_is_enabled = false;
|
||||||
|
|
||||||
|
char *g_pcie_traddr_str = "";
|
||||||
|
|
||||||
struct io_request {
|
struct io_request {
|
||||||
uint64_t address_offset;
|
uint64_t address_offset;
|
||||||
bool invalid_addr;
|
bool invalid_addr;
|
||||||
@ -66,7 +80,12 @@ struct io_request {
|
|||||||
void
|
void
|
||||||
nvme_ctrlr_fail(struct spdk_nvme_ctrlr *ctrlr, bool hot_remove)
|
nvme_ctrlr_fail(struct spdk_nvme_ctrlr *ctrlr, bool hot_remove)
|
||||||
{
|
{
|
||||||
abort();
|
CU_ASSERT(ctrlr != NULL);
|
||||||
|
if (hot_remove) {
|
||||||
|
ctrlr->is_removed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctrlr->is_failed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -78,7 +97,25 @@ spdk_uevent_connect(void)
|
|||||||
int
|
int
|
||||||
spdk_get_uevent(int fd, struct spdk_uevent *uevent)
|
spdk_get_uevent(int fd, struct spdk_uevent *uevent)
|
||||||
{
|
{
|
||||||
abort();
|
snprintf(uevent->traddr, sizeof(uevent->traddr), "%s", g_pcie_traddr_str);
|
||||||
|
|
||||||
|
if (g_vfio_is_enabled) {
|
||||||
|
uevent->subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_VFIO;
|
||||||
|
} else {
|
||||||
|
uevent->subsystem = SPDK_NVME_UEVENT_SUBSYSTEM_UIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_add_device) {
|
||||||
|
uevent->action = SPDK_NVME_UEVENT_ADD;
|
||||||
|
} else {
|
||||||
|
uevent->action = SPDK_NVME_UEVENT_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_remove_cb_done && !g_device_is_enumerated) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct spdk_pci_id
|
struct spdk_pci_id
|
||||||
@ -105,7 +142,9 @@ nvme_qpair_deinit(struct spdk_nvme_qpair *qpair)
|
|||||||
int
|
int
|
||||||
spdk_pci_enumerate(struct spdk_pci_driver *driver, spdk_pci_enum_cb enum_cb, void *enum_ctx)
|
spdk_pci_enumerate(struct spdk_pci_driver *driver, spdk_pci_enum_cb enum_cb, void *enum_ctx)
|
||||||
{
|
{
|
||||||
abort();
|
g_device_is_enumerated = true;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -283,16 +322,56 @@ nvme_request_check_timeout(struct nvme_request *req, uint16_t cid,
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct spdk_nvme_ctrlr_process *
|
||||||
|
spdk_nvme_ctrlr_get_current_process(struct spdk_nvme_ctrlr *ctrlr)
|
||||||
|
{
|
||||||
|
return (struct spdk_nvme_ctrlr_process *)0x1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
spdk_pci_device_is_removed(struct spdk_pci_device *dev)
|
||||||
|
{
|
||||||
|
return g_device_is_removed;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ut_remove_cb(void *cb_ctx, struct spdk_nvme_ctrlr *ctrlr)
|
||||||
|
{
|
||||||
|
g_remove_cb_done = true;
|
||||||
|
if (cb_ctx == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CU_ASSERT(ctrlr != NULL);
|
||||||
|
CU_ASSERT(g_ctrlr == NULL || g_ctrlr == ctrlr);
|
||||||
|
free(g_ctrlr);
|
||||||
|
g_ctrlr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
struct spdk_nvme_ctrlr *
|
struct spdk_nvme_ctrlr *
|
||||||
spdk_nvme_get_ctrlr_by_trid_unsafe(const struct spdk_nvme_transport_id *trid)
|
spdk_nvme_get_ctrlr_by_trid_unsafe(const struct spdk_nvme_transport_id *trid)
|
||||||
{
|
{
|
||||||
return NULL;
|
struct spdk_nvme_ctrlr *ctrlr;
|
||||||
|
|
||||||
|
ctrlr = calloc(1, sizeof(*ctrlr));
|
||||||
|
SPDK_CU_ASSERT_FATAL(ctrlr != NULL);
|
||||||
|
|
||||||
|
ctrlr->remove_cb = (void *)ut_remove_cb;
|
||||||
|
ctrlr->is_failed = false;
|
||||||
|
ctrlr->is_removed = false;
|
||||||
|
g_ctrlr = ctrlr;
|
||||||
|
|
||||||
|
return ctrlr;
|
||||||
}
|
}
|
||||||
|
|
||||||
union spdk_nvme_csts_register spdk_nvme_ctrlr_get_regs_csts(struct spdk_nvme_ctrlr *ctrlr)
|
union spdk_nvme_csts_register spdk_nvme_ctrlr_get_regs_csts(struct spdk_nvme_ctrlr *ctrlr)
|
||||||
{
|
{
|
||||||
union spdk_nvme_csts_register csts = {};
|
union spdk_nvme_csts_register csts = {};
|
||||||
|
|
||||||
|
if (g_device_is_removed) {
|
||||||
|
csts.raw = 0xFFFFFFFFu;
|
||||||
|
}
|
||||||
|
|
||||||
return csts;
|
return csts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -799,6 +878,92 @@ test_prp_list_append(void)
|
|||||||
(NVME_MAX_PRP_LIST_ENTRIES + 1) * 0x1000, 0x1000) == -EFAULT);
|
(NVME_MAX_PRP_LIST_ENTRIES + 1) * 0x1000, 0x1000) == -EFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_nvme_pcie_hotplug_monitor(void)
|
||||||
|
{
|
||||||
|
struct spdk_nvme_ctrlr ctrlr = {};
|
||||||
|
struct nvme_driver dummy;
|
||||||
|
pthread_mutexattr_t attr;
|
||||||
|
struct spdk_nvme_probe_ctx test_nvme_probe_ctx = {};
|
||||||
|
|
||||||
|
/* Initiate variables and ctrlr */
|
||||||
|
g_device_is_removed = false;
|
||||||
|
dummy.initialized = true;
|
||||||
|
CU_ASSERT(pthread_mutexattr_init(&attr) == 0);
|
||||||
|
CU_ASSERT(pthread_mutex_init(&dummy.lock, &attr) == 0);
|
||||||
|
TAILQ_INIT(&dummy.shared_attached_ctrlrs);
|
||||||
|
g_spdk_nvme_driver = &dummy;
|
||||||
|
test_nvme_probe_ctx.cb_ctx = (void *)ut_remove_cb;
|
||||||
|
|
||||||
|
/* Case 1: SPDK_NVME_UEVENT_ADD/ NVME_VFIO */
|
||||||
|
g_add_device = true;
|
||||||
|
g_vfio_is_enabled = true;
|
||||||
|
g_pcie_traddr_str = "0000:05:00.0";
|
||||||
|
CU_ASSERT(g_device_is_enumerated == false);
|
||||||
|
|
||||||
|
_nvme_pcie_hotplug_monitor(&test_nvme_probe_ctx);
|
||||||
|
|
||||||
|
CU_ASSERT(g_device_is_enumerated == true);
|
||||||
|
g_device_is_enumerated = false;
|
||||||
|
|
||||||
|
/* Case 2: SPDK_NVME_UEVENT_ADD/ NVME_UIO */
|
||||||
|
g_vfio_is_enabled = false;
|
||||||
|
|
||||||
|
_nvme_pcie_hotplug_monitor(&test_nvme_probe_ctx);
|
||||||
|
|
||||||
|
CU_ASSERT(g_device_is_enumerated == true);
|
||||||
|
g_device_is_enumerated = false;
|
||||||
|
|
||||||
|
/* Case 3: SPDK_NVME_UEVENT_REMOVE/ NVME_UIO */
|
||||||
|
g_add_device = false;
|
||||||
|
g_pcie_traddr_str = "0000:04:00.0";
|
||||||
|
test_nvme_probe_ctx.cb_ctx = NULL;
|
||||||
|
|
||||||
|
_nvme_pcie_hotplug_monitor(&test_nvme_probe_ctx);
|
||||||
|
|
||||||
|
CU_ASSERT(g_remove_cb_done == true);
|
||||||
|
CU_ASSERT(g_ctrlr != NULL);
|
||||||
|
free(g_ctrlr);
|
||||||
|
g_ctrlr = NULL;
|
||||||
|
g_remove_cb_done = false;
|
||||||
|
|
||||||
|
/* Case 4: SPDK_NVME_UEVENT_REMOVE/ NVME_VFIO */
|
||||||
|
g_vfio_is_enabled = true;
|
||||||
|
test_nvme_probe_ctx.cb_ctx = (void *)ut_remove_cb;
|
||||||
|
|
||||||
|
_nvme_pcie_hotplug_monitor(&test_nvme_probe_ctx);
|
||||||
|
|
||||||
|
CU_ASSERT(g_remove_cb_done == true);
|
||||||
|
CU_ASSERT(g_ctrlr == NULL);
|
||||||
|
|
||||||
|
/* Case 5: test only for VFIO hot remove detection */
|
||||||
|
g_remove_cb_done = true;
|
||||||
|
ctrlr.trid.trtype = SPDK_NVME_TRANSPORT_PCIE;
|
||||||
|
snprintf(ctrlr.trid.traddr, sizeof(ctrlr.trid.traddr), "0000:02:00.0");
|
||||||
|
ctrlr.remove_cb = NULL;
|
||||||
|
ctrlr.is_failed = false;
|
||||||
|
ctrlr.is_removed = false;
|
||||||
|
TAILQ_INSERT_TAIL(&g_spdk_nvme_driver->shared_attached_ctrlrs, &ctrlr, tailq);
|
||||||
|
|
||||||
|
_nvme_pcie_hotplug_monitor(&test_nvme_probe_ctx);
|
||||||
|
|
||||||
|
CU_ASSERT(ctrlr.is_failed == false);
|
||||||
|
|
||||||
|
g_device_is_removed = true;
|
||||||
|
g_remove_cb_done = false;
|
||||||
|
ctrlr.remove_cb = (void *)ut_remove_cb;
|
||||||
|
|
||||||
|
_nvme_pcie_hotplug_monitor(&test_nvme_probe_ctx);
|
||||||
|
|
||||||
|
CU_ASSERT(ctrlr.is_failed == true);
|
||||||
|
CU_ASSERT(ctrlr.is_removed == true);
|
||||||
|
CU_ASSERT(g_remove_cb_done == true);
|
||||||
|
|
||||||
|
pthread_mutex_destroy(&dummy.lock);
|
||||||
|
pthread_mutexattr_destroy(&attr);
|
||||||
|
g_spdk_nvme_driver = &_g_nvme_driver;
|
||||||
|
}
|
||||||
|
|
||||||
static void test_shadow_doorbell_update(void)
|
static void test_shadow_doorbell_update(void)
|
||||||
{
|
{
|
||||||
bool ret;
|
bool ret;
|
||||||
@ -827,6 +992,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (CU_add_test(suite, "prp_list_append", test_prp_list_append) == NULL
|
if (CU_add_test(suite, "prp_list_append", test_prp_list_append) == NULL
|
||||||
|
|| CU_add_test(suite, "nvme_pcie_hotplug_monitor", test_nvme_pcie_hotplug_monitor) == NULL
|
||||||
|| CU_add_test(suite, "shadow_doorbell_update",
|
|| CU_add_test(suite, "shadow_doorbell_update",
|
||||||
test_shadow_doorbell_update) == NULL) {
|
test_shadow_doorbell_update) == NULL) {
|
||||||
CU_cleanup_registry();
|
CU_cleanup_registry();
|
||||||
|
Loading…
Reference in New Issue
Block a user