Commit 79606bee authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

nvmf: introduce ack_timeout



This transport option configures the time between transmitting data and
receiving acknowledgement from the peer that it's been received.  Its
implementation is transport specific and in the TCP transport it's
equivalent to TCP_USER_TIMEOUT.  Currently, this is the only transport
that supports this option.

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: If3a1d8faa9a6da28bf1659b71c345bd3d41399ed
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/22400


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent aafada11
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -8001,6 +8001,7 @@ disable_mappable_bar0 | Optional | boolean | disable client mmap() of BAR0
disable_adaptive_irq        | Optional | boolean | Disable adaptive interrupt feature (VFIO-USER only)
disable_shadow_doorbells    | Optional | boolean | disable shadow doorbell support (VFIO-USER only)
zcopy                       | Optional | boolean | Use zero-copy operations if the underlying bdev supports them
ack_timeout                 | Optional | number  | ACK timeout in milliseconds

#### Example

+3 −1
Original line number Diff line number Diff line
@@ -102,8 +102,10 @@ struct spdk_nvmf_transport_opts {

	/* Hole at bytes 61-63. */
	uint8_t reserved61[3];
	/* ACK timeout in milliseconds */
	uint32_t ack_timeout;
} __attribute__((packed));
SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_transport_opts) == 64, "Incorrect size");
SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_transport_opts) == 68, "Incorrect size");

struct spdk_nvmf_listen_opts {
	/**
+4 −0
Original line number Diff line number Diff line
@@ -2169,6 +2169,10 @@ static const struct spdk_json_object_decoder nvmf_rpc_create_transport_decoder[]
		"acceptor_poll_rate", offsetof(struct nvmf_rpc_create_transport_ctx, opts.acceptor_poll_rate),
		spdk_json_decode_uint32, true
	},
	{
		"ack_timeout", offsetof(struct nvmf_rpc_create_transport_ctx, opts.ack_timeout),
		spdk_json_decode_uint32, true
	}
};

static void
+6 −2
Original line number Diff line number Diff line
@@ -366,6 +366,7 @@ struct tcp_psk_entry {
struct spdk_nvmf_tcp_transport {
	struct spdk_nvmf_transport		transport;
	struct tcp_transport_opts               tcp_opts;
	uint32_t				ack_timeout;

	struct spdk_nvmf_tcp_poll_group		*next_pg;

@@ -678,7 +679,8 @@ nvmf_tcp_create(struct spdk_nvmf_transport_opts *opts)
		     "  in_capsule_data_size=%d, max_aq_depth=%d\n"
		     "  num_shared_buffers=%d, c2h_success=%d,\n"
		     "  dif_insert_or_strip=%d, sock_priority=%d\n"
		     "  abort_timeout_sec=%d, control_msg_num=%hu\n",
		     "  abort_timeout_sec=%d, control_msg_num=%hu\n"
		     "  ack_timeout=%d\n",
		     opts->max_queue_depth,
		     opts->max_io_size,
		     opts->max_qpairs_per_ctrlr - 1,
@@ -690,7 +692,8 @@ nvmf_tcp_create(struct spdk_nvmf_transport_opts *opts)
		     opts->dif_insert_or_strip,
		     ttransport->tcp_opts.sock_priority,
		     opts->abort_timeout_sec,
		     ttransport->tcp_opts.control_msg_num);
		     ttransport->tcp_opts.control_msg_num,
		     opts->ack_timeout);

	if (ttransport->tcp_opts.sock_priority > SPDK_NVMF_TCP_DEFAULT_MAX_SOCK_PRIORITY) {
		SPDK_ERRLOG("Unsupported socket_priority=%d, the current range is: 0 to %d\n"
@@ -921,6 +924,7 @@ nvmf_tcp_listen(struct spdk_nvmf_transport *transport, const struct spdk_nvme_tr
	opts.opts_size = sizeof(opts);
	spdk_sock_get_default_opts(&opts);
	opts.priority = ttransport->tcp_opts.sock_priority;
	opts.ack_timeout = transport->opts.ack_timeout;
	if (listen_opts->secure_channel) {
		if (!g_tls_log) {
			SPDK_NOTICELOG("TLS support is considered experimental\n");
+3 −1
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ nvmf_transport_dump_opts(struct spdk_nvmf_transport *transport, struct spdk_json
	}

	spdk_json_write_named_uint32(w, "abort_timeout_sec", opts->abort_timeout_sec);
	spdk_json_write_named_uint32(w, "ack_timeout", opts->ack_timeout);
	spdk_json_write_object_end(w);
}

@@ -149,10 +150,11 @@ nvmf_transport_opts_copy(struct spdk_nvmf_transport_opts *opts,
	SET_FIELD(transport_specific);
	SET_FIELD(acceptor_poll_rate);
	SET_FIELD(zcopy);
	SET_FIELD(ack_timeout);

	/* Do not remove this statement, you should always update this statement when you adding a new field,
	 * and do not forget to add the SET_FIELD statement for your added field. */
	SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_transport_opts) == 64, "Incorrect size");
	SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_transport_opts) == 68, "Incorrect size");

#undef SET_FIELD
#undef FILED_CHECK
Loading