test/nvme: add tests to cover spdk_nvme_wait_for_completion
Change-Id: I5dc600b6ae7993d93494092d5fb4a81f840a06a9 Signed-off-by: Alexey Marchuk <alexeymar@mellanox.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/504 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
1fd96c85b4
commit
93988db982
@ -255,10 +255,12 @@ nvme_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_request *re
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t g_wait_for_completion_return_val;
|
||||||
|
|
||||||
int32_t
|
int32_t
|
||||||
spdk_nvme_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_completions)
|
spdk_nvme_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_completions)
|
||||||
{
|
{
|
||||||
return 0;
|
return g_wait_for_completion_return_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -276,6 +278,8 @@ nvme_completion_poll_cb(void *arg, const struct spdk_nvme_cpl *cpl)
|
|||||||
status->done = true;
|
status->done = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct nvme_completion_poll_status *g_failed_status;
|
||||||
|
|
||||||
int
|
int
|
||||||
spdk_nvme_wait_for_completion_robust_lock(
|
spdk_nvme_wait_for_completion_robust_lock(
|
||||||
struct spdk_nvme_qpair *qpair,
|
struct spdk_nvme_qpair *qpair,
|
||||||
@ -283,8 +287,13 @@ spdk_nvme_wait_for_completion_robust_lock(
|
|||||||
pthread_mutex_t *robust_mutex)
|
pthread_mutex_t *robust_mutex)
|
||||||
{
|
{
|
||||||
memset(status, 0, sizeof(*status));
|
memset(status, 0, sizeof(*status));
|
||||||
|
if (spdk_nvme_qpair_process_completions(qpair, 0) < 0) {
|
||||||
|
g_failed_status = status;
|
||||||
|
status->timed_out = true;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
status->done = true;
|
status->done = true;
|
||||||
status->cpl.status.sc = 0;
|
|
||||||
if (set_status_cpl == 1) {
|
if (set_status_cpl == 1) {
|
||||||
status->cpl.status.sc = 1;
|
status->cpl.status.sc = 1;
|
||||||
}
|
}
|
||||||
@ -1739,6 +1748,20 @@ test_spdk_nvme_ctrlr_update_firmware(void)
|
|||||||
ret = spdk_nvme_ctrlr_update_firmware(&ctrlr, payload, set_size, slot, commit_action, &status);
|
ret = spdk_nvme_ctrlr_update_firmware(&ctrlr, payload, set_size, slot, commit_action, &status);
|
||||||
CU_ASSERT(ret == 0);
|
CU_ASSERT(ret == 0);
|
||||||
|
|
||||||
|
/* spdk_nvme_wait_for_completion returns an error */
|
||||||
|
g_wait_for_completion_return_val = -1;
|
||||||
|
ret = spdk_nvme_ctrlr_update_firmware(&ctrlr, payload, set_size, slot, commit_action, &status);
|
||||||
|
CU_ASSERT(ret == -ENXIO);
|
||||||
|
CU_ASSERT(g_failed_status != NULL);
|
||||||
|
CU_ASSERT(g_failed_status->timed_out == true);
|
||||||
|
/* status should be freed by callback, which is not triggered in test env.
|
||||||
|
Store status to global variable and free it manually.
|
||||||
|
If spdk_nvme_ctrlr_update_firmware changes its behaviour and frees the status
|
||||||
|
itself, we'll get a double free here.. */
|
||||||
|
free(g_failed_status);
|
||||||
|
g_failed_status = NULL;
|
||||||
|
g_wait_for_completion_return_val = 0;
|
||||||
|
|
||||||
set_status_cpl = 0;
|
set_status_cpl = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1827,6 +1850,39 @@ test_nvme_ctrlr_test_active_ns(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_nvme_ctrlr_test_active_ns_error_case(void)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
struct spdk_nvme_ctrlr ctrlr = {};
|
||||||
|
|
||||||
|
ctrlr.page_size = 0x1000;
|
||||||
|
ctrlr.vs.bits.mjr = 1;
|
||||||
|
ctrlr.vs.bits.mnr = 2;
|
||||||
|
ctrlr.vs.bits.ter = 0;
|
||||||
|
ctrlr.num_ns = 2;
|
||||||
|
|
||||||
|
/* completion with error, status is freed by nvme_ctrlr_identify_active_ns */
|
||||||
|
set_status_cpl = 1;
|
||||||
|
rc = nvme_ctrlr_identify_active_ns(&ctrlr);
|
||||||
|
CU_ASSERT(rc == -ENXIO);
|
||||||
|
set_status_cpl = 0;
|
||||||
|
|
||||||
|
/* spdk_nvme_qpair_process_completions returns an error, status is not freed */
|
||||||
|
g_wait_for_completion_return_val = -1;
|
||||||
|
rc = nvme_ctrlr_identify_active_ns(&ctrlr);
|
||||||
|
CU_ASSERT(rc == -ENXIO);
|
||||||
|
CU_ASSERT(g_failed_status != NULL);
|
||||||
|
CU_ASSERT(g_failed_status->timed_out == true);
|
||||||
|
/* status should be freed by callback, which is not triggered in test env.
|
||||||
|
Store status to global variable and free it manually.
|
||||||
|
If nvme_ctrlr_identify_active_ns changes its behaviour and frees the status
|
||||||
|
itself, we'll get a double free here.. */
|
||||||
|
free(g_failed_status);
|
||||||
|
g_failed_status = NULL;
|
||||||
|
g_wait_for_completion_return_val = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
test_nvme_ctrlr_init_delay(void)
|
test_nvme_ctrlr_init_delay(void)
|
||||||
{
|
{
|
||||||
@ -1974,6 +2030,8 @@ int main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|| CU_add_test(suite, "test nvme ctrlr function test_nvme_ctrlr_test_active_ns",
|
|| CU_add_test(suite, "test nvme ctrlr function test_nvme_ctrlr_test_active_ns",
|
||||||
test_nvme_ctrlr_test_active_ns) == NULL
|
test_nvme_ctrlr_test_active_ns) == NULL
|
||||||
|
|| CU_add_test(suite, "test nvme ctrlr function test_nvme_ctrlr_test_active_ns_error_case",
|
||||||
|
test_nvme_ctrlr_test_active_ns_error_case) == NULL
|
||||||
|| CU_add_test(suite, "test_spdk_nvme_ctrlr_reconnect_io_qpair",
|
|| CU_add_test(suite, "test_spdk_nvme_ctrlr_reconnect_io_qpair",
|
||||||
test_spdk_nvme_ctrlr_reconnect_io_qpair) == NULL
|
test_spdk_nvme_ctrlr_reconnect_io_qpair) == NULL
|
||||||
|| CU_add_test(suite, "test_spdk_nvme_ctrlr_set_trid", test_spdk_nvme_ctrlr_set_trid) == NULL
|
|| CU_add_test(suite, "test_spdk_nvme_ctrlr_set_trid", test_spdk_nvme_ctrlr_set_trid) == NULL
|
||||||
|
Loading…
Reference in New Issue
Block a user