Loading lib/nvme/nvme_qpair.c +5 −5 Original line number Diff line number Diff line Loading @@ -678,6 +678,11 @@ _nvme_qpair_build_hw_sgl_request(struct spdk_nvme_qpair *qpair, struct nvme_requ remaining_transfer_len = req->payload_size; while (remaining_transfer_len > 0) { if (nseg >= NVME_MAX_SGL_DESCRIPTORS) { _nvme_fail_request_bad_vtophys(qpair, tr); return -1; } rc = req->payload.u.sgl.next_sge_fn(req->payload.u.sgl.cb_arg, &phys_addr, &length); if (rc) { _nvme_fail_request_bad_vtophys(qpair, tr); Loading @@ -694,11 +699,6 @@ _nvme_qpair_build_hw_sgl_request(struct spdk_nvme_qpair *qpair, struct nvme_requ sgl++; nseg++; if (nseg >= NVME_MAX_SGL_DESCRIPTORS) { _nvme_fail_request_bad_vtophys(qpair, tr); return -1; } } if (nseg == 1) { Loading test/lib/nvme/unit/nvme_qpair_c/nvme_qpair_ut.c +66 −0 Original line number Diff line number Diff line Loading @@ -442,6 +442,71 @@ test_sgl_req(void) nvme_free_request(req); } static void test_hw_sgl_req(void) { struct spdk_nvme_qpair qpair = {}; struct nvme_request *req; struct spdk_nvme_ctrlr ctrlr = {}; struct spdk_nvme_registers regs = {}; struct nvme_payload payload = {}; struct nvme_tracker *sgl_tr = NULL; uint64_t i; struct io_request io_req = {}; payload.type = NVME_PAYLOAD_TYPE_SGL; payload.u.sgl.reset_sgl_fn = nvme_request_reset_sgl; payload.u.sgl.next_sge_fn = nvme_request_next_sge; payload.u.sgl.cb_arg = &io_req; prepare_submit_request_test(&qpair, &ctrlr, ®s); req = nvme_allocate_request(&payload, PAGE_SIZE, NULL, &io_req); SPDK_CU_ASSERT_FATAL(req != NULL); req->cmd.opc = SPDK_NVME_OPC_WRITE; req->cmd.cdw10 = 10000; req->cmd.cdw12 = 7 | 0; req->payload_offset = 0; ctrlr.flags |= SPDK_NVME_CTRLR_SGL_SUPPORTED; nvme_qpair_submit_request(&qpair, req); sgl_tr = LIST_FIRST(&qpair.outstanding_tr); CU_ASSERT(sgl_tr != NULL); CU_ASSERT(sgl_tr->u.sgl[0].type == SPDK_NVME_SGL_TYPE_DATA_BLOCK); CU_ASSERT(sgl_tr->u.sgl[0].type_specific == 0); CU_ASSERT(sgl_tr->u.sgl[0].length == 4096); CU_ASSERT(sgl_tr->u.sgl[0].address == 0); CU_ASSERT(req->cmd.dptr.sgl1.type == SPDK_NVME_SGL_TYPE_DATA_BLOCK); LIST_REMOVE(sgl_tr, list); cleanup_submit_request_test(&qpair); nvme_free_request(req); prepare_submit_request_test(&qpair, &ctrlr, ®s); req = nvme_allocate_request(&payload, NVME_MAX_SGL_DESCRIPTORS * PAGE_SIZE, NULL, &io_req); SPDK_CU_ASSERT_FATAL(req != NULL); req->cmd.opc = SPDK_NVME_OPC_WRITE; req->cmd.cdw10 = 10000; req->cmd.cdw12 = 2023 | 0; req->payload_offset = 0; ctrlr.flags |= SPDK_NVME_CTRLR_SGL_SUPPORTED; nvme_qpair_submit_request(&qpair, req); sgl_tr = LIST_FIRST(&qpair.outstanding_tr); CU_ASSERT(sgl_tr != NULL); for (i = 0; i < NVME_MAX_SGL_DESCRIPTORS; i++) { CU_ASSERT(sgl_tr->u.sgl[i].type == SPDK_NVME_SGL_TYPE_DATA_BLOCK); CU_ASSERT(sgl_tr->u.sgl[i].type_specific == 0); CU_ASSERT(sgl_tr->u.sgl[i].length == 4096); CU_ASSERT(sgl_tr->u.sgl[i].address == i * 4096); } CU_ASSERT(req->cmd.dptr.sgl1.type == SPDK_NVME_SGL_TYPE_LAST_SEGMENT); LIST_REMOVE(sgl_tr, list); cleanup_submit_request_test(&qpair); nvme_free_request(req); } static void test_ctrlr_failed(void) { Loading Loading @@ -705,6 +770,7 @@ int main(int argc, char **argv) || CU_add_test(suite, "nvme_completion_is_retry", test_nvme_completion_is_retry) == NULL || CU_add_test(suite, "get_status_string", test_get_status_string) == NULL || CU_add_test(suite, "sgl_request", test_sgl_req) == NULL || CU_add_test(suite, "hw_sgl_request", test_hw_sgl_req) == NULL ) { CU_cleanup_registry(); return CU_get_error(); Loading Loading
lib/nvme/nvme_qpair.c +5 −5 Original line number Diff line number Diff line Loading @@ -678,6 +678,11 @@ _nvme_qpair_build_hw_sgl_request(struct spdk_nvme_qpair *qpair, struct nvme_requ remaining_transfer_len = req->payload_size; while (remaining_transfer_len > 0) { if (nseg >= NVME_MAX_SGL_DESCRIPTORS) { _nvme_fail_request_bad_vtophys(qpair, tr); return -1; } rc = req->payload.u.sgl.next_sge_fn(req->payload.u.sgl.cb_arg, &phys_addr, &length); if (rc) { _nvme_fail_request_bad_vtophys(qpair, tr); Loading @@ -694,11 +699,6 @@ _nvme_qpair_build_hw_sgl_request(struct spdk_nvme_qpair *qpair, struct nvme_requ sgl++; nseg++; if (nseg >= NVME_MAX_SGL_DESCRIPTORS) { _nvme_fail_request_bad_vtophys(qpair, tr); return -1; } } if (nseg == 1) { Loading
test/lib/nvme/unit/nvme_qpair_c/nvme_qpair_ut.c +66 −0 Original line number Diff line number Diff line Loading @@ -442,6 +442,71 @@ test_sgl_req(void) nvme_free_request(req); } static void test_hw_sgl_req(void) { struct spdk_nvme_qpair qpair = {}; struct nvme_request *req; struct spdk_nvme_ctrlr ctrlr = {}; struct spdk_nvme_registers regs = {}; struct nvme_payload payload = {}; struct nvme_tracker *sgl_tr = NULL; uint64_t i; struct io_request io_req = {}; payload.type = NVME_PAYLOAD_TYPE_SGL; payload.u.sgl.reset_sgl_fn = nvme_request_reset_sgl; payload.u.sgl.next_sge_fn = nvme_request_next_sge; payload.u.sgl.cb_arg = &io_req; prepare_submit_request_test(&qpair, &ctrlr, ®s); req = nvme_allocate_request(&payload, PAGE_SIZE, NULL, &io_req); SPDK_CU_ASSERT_FATAL(req != NULL); req->cmd.opc = SPDK_NVME_OPC_WRITE; req->cmd.cdw10 = 10000; req->cmd.cdw12 = 7 | 0; req->payload_offset = 0; ctrlr.flags |= SPDK_NVME_CTRLR_SGL_SUPPORTED; nvme_qpair_submit_request(&qpair, req); sgl_tr = LIST_FIRST(&qpair.outstanding_tr); CU_ASSERT(sgl_tr != NULL); CU_ASSERT(sgl_tr->u.sgl[0].type == SPDK_NVME_SGL_TYPE_DATA_BLOCK); CU_ASSERT(sgl_tr->u.sgl[0].type_specific == 0); CU_ASSERT(sgl_tr->u.sgl[0].length == 4096); CU_ASSERT(sgl_tr->u.sgl[0].address == 0); CU_ASSERT(req->cmd.dptr.sgl1.type == SPDK_NVME_SGL_TYPE_DATA_BLOCK); LIST_REMOVE(sgl_tr, list); cleanup_submit_request_test(&qpair); nvme_free_request(req); prepare_submit_request_test(&qpair, &ctrlr, ®s); req = nvme_allocate_request(&payload, NVME_MAX_SGL_DESCRIPTORS * PAGE_SIZE, NULL, &io_req); SPDK_CU_ASSERT_FATAL(req != NULL); req->cmd.opc = SPDK_NVME_OPC_WRITE; req->cmd.cdw10 = 10000; req->cmd.cdw12 = 2023 | 0; req->payload_offset = 0; ctrlr.flags |= SPDK_NVME_CTRLR_SGL_SUPPORTED; nvme_qpair_submit_request(&qpair, req); sgl_tr = LIST_FIRST(&qpair.outstanding_tr); CU_ASSERT(sgl_tr != NULL); for (i = 0; i < NVME_MAX_SGL_DESCRIPTORS; i++) { CU_ASSERT(sgl_tr->u.sgl[i].type == SPDK_NVME_SGL_TYPE_DATA_BLOCK); CU_ASSERT(sgl_tr->u.sgl[i].type_specific == 0); CU_ASSERT(sgl_tr->u.sgl[i].length == 4096); CU_ASSERT(sgl_tr->u.sgl[i].address == i * 4096); } CU_ASSERT(req->cmd.dptr.sgl1.type == SPDK_NVME_SGL_TYPE_LAST_SEGMENT); LIST_REMOVE(sgl_tr, list); cleanup_submit_request_test(&qpair); nvme_free_request(req); } static void test_ctrlr_failed(void) { Loading Loading @@ -705,6 +770,7 @@ int main(int argc, char **argv) || CU_add_test(suite, "nvme_completion_is_retry", test_nvme_completion_is_retry) == NULL || CU_add_test(suite, "get_status_string", test_get_status_string) == NULL || CU_add_test(suite, "sgl_request", test_sgl_req) == NULL || CU_add_test(suite, "hw_sgl_request", test_hw_sgl_req) == NULL ) { CU_cleanup_registry(); return CU_get_error(); Loading