diff --git a/CHANGELOG.md b/CHANGELOG.md index 2563b91cb..4bd955bf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -110,6 +110,11 @@ tags will appear in SPDK's log at the warn level. As the SPDK application exits, will log a summary of how many times `SPDK_LOG_DEPRECATED()` was called for each tag that was logged at least once. +### nvme + +Added `transport_tos` to `spdk_nvme_ctrlr_opts` to support setting of the "type of service" +value in the IPv4 header. Only RDMA is supported at this time. + ## v22.09 ### accel diff --git a/CONFIG b/CONFIG index b24e5640b..e99d58bed 100644 --- a/CONFIG +++ b/CONFIG @@ -92,6 +92,7 @@ CONFIG_FIO_SOURCE_DIR=/usr/src/fio CONFIG_RDMA=n CONFIG_RDMA_SEND_WITH_INVAL=n CONFIG_RDMA_SET_ACK_TIMEOUT=n +CONFIG_RDMA_SET_TOS=n CONFIG_RDMA_PROV=verbs # Enable NVMe Character Devices. diff --git a/configure b/configure index 19a538e7d..7c42fbdbf 100755 --- a/configure +++ b/configure @@ -846,6 +846,15 @@ than or equal to 4.14 will see significantly reduced performance. echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported" fi + if echo -e '#include \n' \ + 'int main(void) { return !!RDMA_OPTION_ID_TOS; }\n' \ + | "${BUILD_CMD[@]}" -c - 2> /dev/null; then + CONFIG[RDMA_SET_TOS]="y" + else + CONFIG[RDMA_SET_TOS]="n" + echo "RDMA_OPTION_ID_TOS is not supported" + fi + if [ "${CONFIG[RDMA_PROV]}" == "mlx5_dv" ]; then if ! echo -e '#include \n' \ '#include \n' \ diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index a52596655..1a87bee1e 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -275,8 +275,15 @@ struct spdk_nvme_ctrlr_opts { * 12B (header) + 2B (hash) + 176B (base64 for 1024b + crc32) + 3B (colons) + 1B (NULL) + 6B (extra space for future) */ char psk[200]; + + /** + * It is used for RDMA transport. + * + * Set the IP protocol type of service value for RDMA transport. Default is 0, which means that the TOS will not be set. + */ + uint8_t transport_tos; } __attribute__((packed)); -SPDK_STATIC_ASSERT(sizeof(struct spdk_nvme_ctrlr_opts) == 817, "Incorrect size"); +SPDK_STATIC_ASSERT(sizeof(struct spdk_nvme_ctrlr_opts) == 818, "Incorrect size"); /** * NVMe acceleration operation callback. diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index e1f3a13a9..2b3cc0ca1 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -171,6 +171,8 @@ extern pid_t g_spdk_nvme_pid; #define SPDK_NVME_TRANSPORT_ACK_TIMEOUT_DISABLED (0) #define SPDK_NVME_DEFAULT_TRANSPORT_ACK_TIMEOUT SPDK_NVME_TRANSPORT_ACK_TIMEOUT_DISABLED +#define SPDK_NVME_TRANSPORT_TOS_DISABLED (0) + #define MIN_KEEP_ALIVE_TIMEOUT_IN_MS (10000) /* We want to fit submission and completion rings each in a single 2MB diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index ca6270a92..976b2c3e6 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1023,6 +1023,18 @@ nvme_rdma_addr_resolved(struct nvme_rdma_qpair *rqpair, int ret) #endif } + if (rqpair->qpair.ctrlr->opts.transport_tos != SPDK_NVME_TRANSPORT_TOS_DISABLED) { +#ifdef SPDK_CONFIG_RDMA_SET_TOS + uint8_t tos = rqpair->qpair.ctrlr->opts.transport_tos; + ret = rdma_set_option(rqpair->cm_id, RDMA_OPTION_ID, RDMA_OPTION_ID_TOS, &tos, sizeof(tos)); + if (ret) { + SPDK_NOTICELOG("Can't apply RDMA_OPTION_ID_TOS %u, ret %d\n", tos, ret); + } +#else + SPDK_DEBUGLOG(nvme, "transport_tos is not supported\n"); +#endif + } + ret = rdma_resolve_route(rqpair->cm_id, NVME_RDMA_TIME_OUT_IN_MS); if (ret) { SPDK_ERRLOG("rdma_resolve_route\n");