nvmf/ctrlr: Disable in-capsule data transfer for RDMA controllers when dif_insert_or_strip is enabled

In-capsule data transfer can only be supported by NVME drives with SGL memory layout
Add test to examine new behaviour

Change-Id: Iaef6564c8e5c96c1c5af16ab41d6e3827f6a82b6
Signed-off-by: Alexey Marchuk <alexeymar@mellanox.com>
Signed-off-by: Sasha Kotchubievsky <sashakot@mellanox.com>
Signed-off-by: Evgenii Kochetov <evgeniik@mellanox.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/470469
Tested-by: 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:
Alexey Marchuk 2019-10-02 08:51:28 +00:00 committed by Jim Harris
parent e1101529e5
commit 225c74e4e7
2 changed files with 71 additions and 21 deletions

View File

@ -1631,7 +1631,11 @@ spdk_nvmf_ctrlr_identify_ctrlr(struct spdk_nvmf_ctrlr *ctrlr, struct spdk_nvme_c
}
/* TODO: this should be set by the transport */
cdata->nvmf_specific.ioccsz += transport->opts.in_capsule_data_size / 16;
/* Disable in-capsule data transfer for RDMA controller when dif_insert_or_strip is enabled
since in-capsule data only works with NVME drives that support SGL memory layout */
if (!(transport->ops->type == SPDK_NVME_TRANSPORT_RDMA && ctrlr->dif_insert_or_strip)) {
cdata->nvmf_specific.ioccsz += transport->opts.in_capsule_data_size / 16;
}
cdata->oncs.dsm = spdk_nvmf_ctrlr_dsm_supported(ctrlr);
cdata->oncs.write_zeroes = spdk_nvmf_ctrlr_write_zeroes_supported(ctrlr);

View File

@ -47,6 +47,9 @@ struct spdk_bdev {
uint64_t blockcnt;
};
const char subsystem_default_sn[SPDK_NVME_CTRLR_SN_LEN + 1] = "subsys_default_sn";
const char subsystem_default_mn[SPDK_NVME_CTRLR_MN_LEN + 1] = "subsys_default_mn";
DEFINE_STUB(spdk_nvmf_tgt_find_subsystem,
struct spdk_nvmf_subsystem *,
(struct spdk_nvmf_tgt *tgt, const char *subnqn),
@ -60,12 +63,12 @@ DEFINE_STUB(spdk_nvmf_poll_group_create,
DEFINE_STUB(spdk_nvmf_subsystem_get_sn,
const char *,
(const struct spdk_nvmf_subsystem *subsystem),
NULL);
subsystem_default_sn);
DEFINE_STUB(spdk_nvmf_subsystem_get_mn,
const char *,
(const struct spdk_nvmf_subsystem *subsystem),
NULL);
subsystem_default_mn);
DEFINE_STUB(spdk_nvmf_subsystem_get_first_ns,
struct spdk_nvmf_ns *,
@ -1270,6 +1273,51 @@ test_get_dif_ctx(void)
CU_ASSERT(ret == true);
}
static void
test_identify_ctrlr(void)
{
struct spdk_nvmf_subsystem subsystem = {
.subtype = SPDK_NVMF_SUBTYPE_NVME
};
struct spdk_nvmf_transport_ops tops = {};
struct spdk_nvmf_transport transport = {
.ops = &tops,
.opts = {
.in_capsule_data_size = 4096,
},
};
struct spdk_nvmf_qpair admin_qpair = { .transport = &transport};
struct spdk_nvmf_ctrlr ctrlr = { .subsys = &subsystem, .admin_qpair = &admin_qpair };
struct spdk_nvme_ctrlr_data cdata = {};
uint32_t expected_ioccsz;
/* Check ioccsz, TCP transport */
tops.type = SPDK_NVME_TRANSPORT_TCP;
expected_ioccsz = sizeof(struct spdk_nvme_cmd) / 16 + transport.opts.in_capsule_data_size / 16;
CU_ASSERT(spdk_nvmf_ctrlr_identify_ctrlr(&ctrlr, &cdata) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
CU_ASSERT(cdata.nvmf_specific.ioccsz == expected_ioccsz);
/* Check ioccsz, RDMA transport */
tops.type = SPDK_NVME_TRANSPORT_RDMA;
expected_ioccsz = sizeof(struct spdk_nvme_cmd) / 16 + transport.opts.in_capsule_data_size / 16;
CU_ASSERT(spdk_nvmf_ctrlr_identify_ctrlr(&ctrlr, &cdata) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
CU_ASSERT(cdata.nvmf_specific.ioccsz == expected_ioccsz);
/* Check ioccsz, TCP transport with dif_insert_or_strip */
tops.type = SPDK_NVME_TRANSPORT_TCP;
ctrlr.dif_insert_or_strip = true;
expected_ioccsz = sizeof(struct spdk_nvme_cmd) / 16 + transport.opts.in_capsule_data_size / 16;
CU_ASSERT(spdk_nvmf_ctrlr_identify_ctrlr(&ctrlr, &cdata) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
CU_ASSERT(cdata.nvmf_specific.ioccsz == expected_ioccsz);
/* Check ioccsz, RDMA transport with dif_insert_or_strip */
tops.type = SPDK_NVME_TRANSPORT_RDMA;
ctrlr.dif_insert_or_strip = true;
expected_ioccsz = sizeof(struct spdk_nvme_cmd) / 16;
CU_ASSERT(spdk_nvmf_ctrlr_identify_ctrlr(&ctrlr, &cdata) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
CU_ASSERT(cdata.nvmf_specific.ioccsz == expected_ioccsz);
}
int main(int argc, char **argv)
{
CU_pSuite suite = NULL;
@ -1285,24 +1333,22 @@ int main(int argc, char **argv)
return CU_get_error();
}
if (
CU_add_test(suite, "get_log_page", test_get_log_page) == NULL ||
CU_add_test(suite, "process_fabrics_cmd", test_process_fabrics_cmd) == NULL ||
CU_add_test(suite, "connect", test_connect) == NULL ||
CU_add_test(suite, "get_ns_id_desc_list", test_get_ns_id_desc_list) == NULL ||
CU_add_test(suite, "identify_ns", test_identify_ns) == NULL ||
CU_add_test(suite, "reservation_write_exclusive", test_reservation_write_exclusive) == NULL ||
CU_add_test(suite, "reservation_exclusive_access", test_reservation_exclusive_access) == NULL ||
CU_add_test(suite, "reservation_write_exclusive_regs_only_and_all_regs",
test_reservation_write_exclusive_regs_only_and_all_regs) == NULL ||
CU_add_test(suite, "reservation_exclusive_access_regs_only_and_all_regs",
test_reservation_exclusive_access_regs_only_and_all_regs) == NULL ||
CU_add_test(suite, "reservation_notification_log_page",
test_reservation_notification_log_page) == NULL ||
CU_add_test(suite, "get_dif_ctx", test_get_dif_ctx) == NULL ||
CU_add_test(suite, "set_get_features",
test_set_get_features) == NULL
) {
if (CU_add_test(suite, "get_log_page", test_get_log_page) == NULL ||
CU_add_test(suite, "process_fabrics_cmd", test_process_fabrics_cmd) == NULL ||
CU_add_test(suite, "connect", test_connect) == NULL ||
CU_add_test(suite, "get_ns_id_desc_list", test_get_ns_id_desc_list) == NULL ||
CU_add_test(suite, "identify_ns", test_identify_ns) == NULL ||
CU_add_test(suite, "reservation_write_exclusive", test_reservation_write_exclusive) == NULL ||
CU_add_test(suite, "reservation_exclusive_access", test_reservation_exclusive_access) == NULL ||
CU_add_test(suite, "reservation_write_exclusive_regs_only_and_all_regs",
test_reservation_write_exclusive_regs_only_and_all_regs) == NULL ||
CU_add_test(suite, "reservation_exclusive_access_regs_only_and_all_regs",
test_reservation_exclusive_access_regs_only_and_all_regs) == NULL ||
CU_add_test(suite, "reservation_notification_log_page",
test_reservation_notification_log_page) == NULL ||
CU_add_test(suite, "get_dif_ctx", test_get_dif_ctx) == NULL ||
CU_add_test(suite, "set_get_features", test_set_get_features) == NULL ||
CU_add_test(suite, "identify_ctrlr", test_identify_ctrlr) == NULL) {
CU_cleanup_registry();
return CU_get_error();
}