nvme/rdma: Introduce transport_ack_timeout
Add transport_ack_timeout parameter to nvme controller opts. This parameter allows to configure RDMA ACK timeout according to the formula 4.096 * 2^(transport_ack_timeout) usec. The parameter should be in range 0..31 where 0 means use driver-specific default value. Change-Id: I0c8a5a636aa9d816bda5c1ba58f56a00a585b060 Signed-off-by: Alexey Marchuk <alexeymar@mellanox.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/502 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:
parent
ebe4bfc2bb
commit
94966468ae
@ -156,6 +156,9 @@ the target expects the initiator to send both the compare command and write comm
|
|||||||
SPDK initiator currently respects this requirement, but this note is included as a flag for other initiators attempting
|
SPDK initiator currently respects this requirement, but this note is included as a flag for other initiators attempting
|
||||||
compatibility with this version of SPDK.
|
compatibility with this version of SPDK.
|
||||||
|
|
||||||
|
The `spdk_nvme_ctrlr_opts` struct has been extended with new field `transport_ack_timeout` which allows
|
||||||
|
to configure transport ACK timeout. Applicable for RDMA transport only.
|
||||||
|
|
||||||
### rpc
|
### rpc
|
||||||
|
|
||||||
A new RPC, `bdev_zone_block_create`, enables creating an emulated zoned bdev on top of a standard block device.
|
A new RPC, `bdev_zone_block_create`, enables creating an emulated zoned bdev on top of a standard block device.
|
||||||
|
1
CONFIG
1
CONFIG
@ -93,6 +93,7 @@ CONFIG_FIO_SOURCE_DIR=/usr/src/fio
|
|||||||
# Requires ibverbs development libraries.
|
# Requires ibverbs development libraries.
|
||||||
CONFIG_RDMA=n
|
CONFIG_RDMA=n
|
||||||
CONFIG_RDMA_SEND_WITH_INVAL=n
|
CONFIG_RDMA_SEND_WITH_INVAL=n
|
||||||
|
CONFIG_RDMA_SET_ACK_TIMEOUT=n
|
||||||
|
|
||||||
# Enable NVMe Character Devices.
|
# Enable NVMe Character Devices.
|
||||||
CONFIG_NVME_CUSE=n
|
CONFIG_NVME_CUSE=n
|
||||||
|
10
configure
vendored
10
configure
vendored
@ -569,6 +569,16 @@ of libibverbs, so Linux kernel NVMe-oF initiators based on kernels greater
|
|||||||
than or equal to 4.14 will see significantly reduced performance.
|
than or equal to 4.14 will see significantly reduced performance.
|
||||||
*******************************************************************************"
|
*******************************************************************************"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if echo -e '#include <rdma/rdma_cma.h>\n' \
|
||||||
|
'int main(void) { return !!RDMA_OPTION_ID_ACK_TIMEOUT; }\n' \
|
||||||
|
| ${BUILD_CMD[@]} -c - 2>/dev/null; then
|
||||||
|
CONFIG[RDMA_SET_ACK_TIMEOUT]="y"
|
||||||
|
else
|
||||||
|
CONFIG[RDMA_SET_ACK_TIMEOUT]="n"
|
||||||
|
echo "RDMA_OPTION_ID_ACK_TIMEOUT is not supported"
|
||||||
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "${CONFIG[FC]}" = "y" ]]; then
|
if [[ "${CONFIG[FC]}" = "y" ]]; then
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* BSD LICENSE
|
* BSD LICENSE
|
||||||
*
|
*
|
||||||
* Copyright (c) Intel Corporation. All rights reserved.
|
* Copyright (c) Intel Corporation. All rights reserved.
|
||||||
* Copyright (c) 2019 Mellanox Technologies LTD. All rights reserved.
|
* Copyright (c) 2019, 2020 Mellanox Technologies LTD. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@ -220,6 +220,20 @@ struct spdk_nvme_ctrlr_opts {
|
|||||||
* Defaults to 'false' (errors are logged).
|
* Defaults to 'false' (errors are logged).
|
||||||
*/
|
*/
|
||||||
bool disable_error_logging;
|
bool disable_error_logging;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* It is used for RDMA transport
|
||||||
|
* Specify the transport ACK timeout. The value should be in range 0-31 where 0 means
|
||||||
|
* use driver-specific default value. The value is applied to each RDMA qpair
|
||||||
|
* and affects the time that qpair waits for transport layer acknowledgement
|
||||||
|
* until it retransmits a packet. The value should be chosen empirically
|
||||||
|
* to meet the needs of a particular application. A low value means less time
|
||||||
|
* the qpair waits for ACK which can increase the number of retransmissions.
|
||||||
|
* A large value can increase the time the connection is closed.
|
||||||
|
* The value of ACK timeout is calculated according to the formula
|
||||||
|
* 4.096 * 2^(transport_ack_timeout) usec.
|
||||||
|
*/
|
||||||
|
uint8_t transport_ack_timeout;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -174,6 +174,10 @@ spdk_nvme_ctrlr_get_default_ctrlr_opts(struct spdk_nvme_ctrlr_opts *opts, size_t
|
|||||||
if (FIELD_OK(disable_error_logging)) {
|
if (FIELD_OK(disable_error_logging)) {
|
||||||
opts->disable_error_logging = false;
|
opts->disable_error_logging = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (FIELD_OK(transport_ack_timeout)) {
|
||||||
|
opts->transport_ack_timeout = SPDK_NVME_DEFAULT_TRANSPORT_ACK_TIMEOUT;
|
||||||
|
}
|
||||||
#undef FIELD_OK
|
#undef FIELD_OK
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,6 +159,9 @@ extern pid_t g_spdk_nvme_pid;
|
|||||||
|
|
||||||
#define SPDK_NVME_DEFAULT_RETRY_COUNT (4)
|
#define SPDK_NVME_DEFAULT_RETRY_COUNT (4)
|
||||||
|
|
||||||
|
#define SPDK_NVME_TRANSPORT_ACK_TIMEOUT_DISABLED (0)
|
||||||
|
#define SPDK_NVME_DEFAULT_TRANSPORT_ACK_TIMEOUT SPDK_NVME_TRANSPORT_ACK_TIMEOUT_DISABLED
|
||||||
|
|
||||||
#define MIN_KEEP_ALIVE_TIMEOUT_IN_MS (10000)
|
#define MIN_KEEP_ALIVE_TIMEOUT_IN_MS (10000)
|
||||||
|
|
||||||
/* We want to fit submission and completion rings each in a single 2MB
|
/* We want to fit submission and completion rings each in a single 2MB
|
||||||
|
@ -51,6 +51,7 @@
|
|||||||
#include "spdk/string.h"
|
#include "spdk/string.h"
|
||||||
#include "spdk/endian.h"
|
#include "spdk/endian.h"
|
||||||
#include "spdk/likely.h"
|
#include "spdk/likely.h"
|
||||||
|
#include "spdk/config.h"
|
||||||
|
|
||||||
#include "nvme_internal.h"
|
#include "nvme_internal.h"
|
||||||
|
|
||||||
@ -84,6 +85,11 @@
|
|||||||
*/
|
*/
|
||||||
#define NVME_RDMA_CTRLR_MAX_TRANSPORT_RETRY_COUNT 7
|
#define NVME_RDMA_CTRLR_MAX_TRANSPORT_RETRY_COUNT 7
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maximum value of transport_ack_timeout used by RDMA controller
|
||||||
|
*/
|
||||||
|
#define NVME_RDMA_CTRLR_MAX_TRANSPORT_ACK_TIMEOUT 31
|
||||||
|
|
||||||
struct spdk_nvmf_cmd {
|
struct spdk_nvmf_cmd {
|
||||||
struct spdk_nvme_cmd cmd;
|
struct spdk_nvme_cmd cmd;
|
||||||
struct spdk_nvme_sgl_descriptor sgl[NVME_RDMA_MAX_SGL_DESCRIPTORS];
|
struct spdk_nvme_sgl_descriptor sgl[NVME_RDMA_MAX_SGL_DESCRIPTORS];
|
||||||
@ -859,6 +865,21 @@ nvme_rdma_resolve_addr(struct nvme_rdma_qpair *rqpair,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rqpair->qpair.ctrlr->opts.transport_ack_timeout != SPDK_NVME_TRANSPORT_ACK_TIMEOUT_DISABLED) {
|
||||||
|
#ifdef SPDK_CONFIG_RDMA_SET_ACK_TIMEOUT
|
||||||
|
uint8_t timeout = rqpair->qpair.ctrlr->opts.transport_ack_timeout;
|
||||||
|
ret = rdma_set_option(rqpair->cm_id, RDMA_OPTION_ID,
|
||||||
|
RDMA_OPTION_ID_ACK_TIMEOUT,
|
||||||
|
&timeout, sizeof(timeout));
|
||||||
|
if (ret) {
|
||||||
|
SPDK_NOTICELOG("Can't apply RDMA_OPTION_ID_ACK_TIMEOUT %d, ret %d\n", timeout, ret);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
SPDK_DEBUGLOG(SPDK_LOG_NVME, "transport_ack_timeout is not supported\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ret = rdma_resolve_route(rqpair->cm_id, NVME_RDMA_TIME_OUT_IN_MS);
|
ret = rdma_resolve_route(rqpair->cm_id, NVME_RDMA_TIME_OUT_IN_MS);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
SPDK_ERRLOG("rdma_resolve_route\n");
|
SPDK_ERRLOG("rdma_resolve_route\n");
|
||||||
@ -1732,6 +1753,11 @@ static struct spdk_nvme_ctrlr *nvme_rdma_ctrlr_construct(const struct spdk_nvme_
|
|||||||
NVME_RDMA_CTRLR_MAX_TRANSPORT_RETRY_COUNT);
|
NVME_RDMA_CTRLR_MAX_TRANSPORT_RETRY_COUNT);
|
||||||
rctrlr->ctrlr.opts.transport_retry_count = NVME_RDMA_CTRLR_MAX_TRANSPORT_RETRY_COUNT;
|
rctrlr->ctrlr.opts.transport_retry_count = NVME_RDMA_CTRLR_MAX_TRANSPORT_RETRY_COUNT;
|
||||||
}
|
}
|
||||||
|
if (rctrlr->ctrlr.opts.transport_ack_timeout > NVME_RDMA_CTRLR_MAX_TRANSPORT_ACK_TIMEOUT) {
|
||||||
|
SPDK_NOTICELOG("transport_ack_timeout exceeds max value %d, use max value\n",
|
||||||
|
NVME_RDMA_CTRLR_MAX_TRANSPORT_ACK_TIMEOUT);
|
||||||
|
rctrlr->ctrlr.opts.transport_ack_timeout = NVME_RDMA_CTRLR_MAX_TRANSPORT_ACK_TIMEOUT;
|
||||||
|
}
|
||||||
|
|
||||||
contexts = rdma_get_devices(NULL);
|
contexts = rdma_get_devices(NULL);
|
||||||
if (contexts == NULL) {
|
if (contexts == NULL) {
|
||||||
|
Loading…
Reference in New Issue
Block a user