static void nvmf_test_check_admin_completions(void) { struct nvmf_session *sess; struct spdk_nvmf_subsystem *subsystem; struct spdk_nvme_ctrlr ctrlr1, ctrlr2; int i; ctrlr1.a = 1; ctrlr2.a = 2; sess = nvmf_find_session_by_id("subsystem1", SS_SC_CNTLID); subsystem = nvmf_find_subsystem("subsystem1"); /* preload ns_list_map */ #define PRELOAD_NS_LIST(index, nvme_ctrlr, ns_id) \ do { \ subsystem->ns_list_map[index].ctrlr = nvme_ctrlr; \ subsystem->ns_list_map[index].ns = NULL; \ subsystem->ns_list_map[index].nvme_ns_id = ns_id; \ \ } while (0) for (i = 0; i < MAX_PER_SUBSYSTEM_NAMESPACES; i++) { PRELOAD_NS_LIST(i, NULL, 0); } PRELOAD_NS_LIST(0, &ctrlr1, 1); PRELOAD_NS_LIST(1, &ctrlr1, 2); PRELOAD_NS_LIST(2, &ctrlr1, 3); PRELOAD_NS_LIST(3, NULL, 1); PRELOAD_NS_LIST(4, &ctrlr1, 4); PRELOAD_NS_LIST(5, &ctrlr2, 1); PRELOAD_NS_LIST(6, &ctrlr2, 2); PRELOAD_NS_LIST(7, NULL, 2); PRELOAD_NS_LIST(8, NULL, 3); PRELOAD_NS_LIST(9, &ctrlr1, 5); #undef PRELOAD_NS_LIST /* make sure the check completion is done by * ctrlr1,ctrlr2,ctrlr1 */ controller_checked[0] = -1; nvmf_check_admin_completions(sess); CU_ASSERT_EQUAL(controller_checked[0], 1); CU_ASSERT_EQUAL(controller_checked[1], 2); CU_ASSERT_EQUAL(controller_checked[2], 1); CU_ASSERT_EQUAL(controller_checked[3], -1); }
static int nvmf_execute_conn(struct spdk_nvmf_conn *conn) { int rc = 0; /* for an active session, process any pending NVMf completions */ if (conn->sess) { if (conn->type == CONN_TYPE_AQ) nvmf_check_admin_completions(conn->sess); else nvmf_check_io_completions(conn->sess); } /* process all pending completions */ rc = nvmf_cq_event_handler(conn); if (rc > 0) { SPDK_TRACELOG(SPDK_TRACE_RDMA, "CQ event handler, %d CQ completions\n", rc); } else if (rc < 0) { SPDK_ERRLOG("CQ event handler error!\n"); return -1; } return 0; }