Commit 26e0ef9a authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

lib/nvmf: Make abort execution timeout value optional



Make the abort execution timeout value as optional.

Zero is acceptable and means immediate timeout.

Signed-off-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: Ia4b03c65b8bd15899f48be9476ee657446147581
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3104


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: default avatarMichael Haeuptle <michaelhaeuptle@gmail.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 3e1ab5ea
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -4120,6 +4120,7 @@ c2h_success | Optional | boolean | Disable C2H success optimizat
dif_insert_or_strip         | Optional | boolean | Enable DIF insert for write I/O and DIF strip for read I/O DIF
sock_priority               | Optional | number  | The socket priority of the connection owned by this transport (TCP only)
acceptor_backlog            | Optional | number  | The number of pending connections allowed in backlog before failing new connection attempts (RDMA only)
abort_timeout_sec           | Optional | number  | Abort execution timeout value, in seconds

### Example

@@ -4655,7 +4656,8 @@ Example response:
      "max_io_qpairs_per_ctrlr": 64,
      "in_capsule_data_size": 4096,
      "max_io_size": 131072,
      "io_unit_size": 131072
      "io_unit_size": 131072,
      "abort_timeout_sec": 1
    }
  ]
}
+1 −0
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ struct spdk_nvmf_transport_opts {
	bool		dif_insert_or_strip;
	uint32_t	sock_priority;
	int		acceptor_backlog;
	uint32_t	abort_timeout_sec;
};

struct spdk_nvmf_poll_group_stat {
+1 −0
Original line number Diff line number Diff line
@@ -546,6 +546,7 @@ spdk_nvmf_tgt_write_config_json(struct spdk_json_write_ctx *w, struct spdk_nvmf_
		if (transport->ops->type == SPDK_NVME_TRANSPORT_RDMA) {
			spdk_json_write_named_uint32(w, "max_srq_depth", transport->opts.max_srq_depth);
		}
		spdk_json_write_named_uint32(w, "abort_timeout_sec", transport->opts.abort_timeout_sec);
		spdk_json_write_object_end(w);

		spdk_json_write_object_end(w);
+5 −0
Original line number Diff line number Diff line
@@ -1650,6 +1650,10 @@ static const struct spdk_json_object_decoder nvmf_rpc_create_transport_decoder[]
		"acceptor_backlog", offsetof(struct nvmf_rpc_create_transport_ctx, opts.acceptor_backlog),
		spdk_json_decode_int32, true
	},
	{
		"abort_timeout_sec", offsetof(struct nvmf_rpc_create_transport_ctx, opts.abort_timeout_sec),
		spdk_json_decode_uint32, true
	},
	{
		"tgt_name", offsetof(struct nvmf_rpc_create_transport_ctx, tgt_name),
		spdk_json_decode_string, true
@@ -1802,6 +1806,7 @@ dump_nvmf_transport(struct spdk_json_write_ctx *w, struct spdk_nvmf_transport *t
		spdk_json_write_named_bool(w, "c2h_success", opts->c2h_success);
		spdk_json_write_named_uint32(w, "sock_priority", opts->sock_priority);
	}
	spdk_json_write_named_uint32(w, "abort_timeout_sec", opts->abort_timeout_sec);

	spdk_json_write_object_end(w);
}
+12 −5
Original line number Diff line number Diff line
@@ -2222,6 +2222,7 @@ nvmf_rdma_request_process(struct spdk_nvmf_rdma_transport *rtransport,
#define SPDK_NVMF_RDMA_DEFAULT_NO_SRQ false
#define SPDK_NVMF_RDMA_DIF_INSERT_OR_STRIP false
#define SPDK_NVMF_RDMA_ACCEPTOR_BACKLOG 100
#define SPDK_NVMF_RDMA_DEFAULT_ABORT_TIMEOUT_SEC 1

static void
nvmf_rdma_opts_init(struct spdk_nvmf_transport_opts *opts)
@@ -2238,6 +2239,7 @@ nvmf_rdma_opts_init(struct spdk_nvmf_transport_opts *opts)
	opts->no_srq =			SPDK_NVMF_RDMA_DEFAULT_NO_SRQ;
	opts->dif_insert_or_strip =	SPDK_NVMF_RDMA_DIF_INSERT_OR_STRIP;
	opts->acceptor_backlog =	SPDK_NVMF_RDMA_ACCEPTOR_BACKLOG;
	opts->abort_timeout_sec =	SPDK_NVMF_RDMA_DEFAULT_ABORT_TIMEOUT_SEC;
}

const struct spdk_mem_map_ops g_nvmf_rdma_map_ops = {
@@ -2299,7 +2301,7 @@ nvmf_rdma_create(struct spdk_nvmf_transport_opts *opts)
		     "  max_io_qpairs_per_ctrlr=%d, io_unit_size=%d,\n"
		     "  in_capsule_data_size=%d, max_aq_depth=%d,\n"
		     "  num_shared_buffers=%d, max_srq_depth=%d, no_srq=%d,"
		     "  acceptor_backlog=%d\n",
		     "  acceptor_backlog=%d, abort_timeout_sec=%d\n",
		     opts->max_queue_depth,
		     opts->max_io_size,
		     opts->max_qpairs_per_ctrlr - 1,
@@ -2309,7 +2311,8 @@ nvmf_rdma_create(struct spdk_nvmf_transport_opts *opts)
		     opts->num_shared_buffers,
		     opts->max_srq_depth,
		     opts->no_srq,
		     opts->acceptor_backlog);
		     opts->acceptor_backlog,
		     opts->abort_timeout_sec);

	/* I/O unit size cannot be larger than max I/O size */
	if (opts->io_unit_size > opts->max_io_size) {
@@ -4040,8 +4043,6 @@ nvmf_rdma_request_set_abort_status(struct spdk_nvmf_request *req,
	req->rsp->nvme_cpl.cdw0 &= ~1U;	/* Command was successfully aborted. */
}

#define NVMF_RDMA_ABORT_TIMEOUT_SEC	1

static int
_nvmf_rdma_qpair_abort_request(void *ctx)
{
@@ -4103,11 +4104,16 @@ nvmf_rdma_qpair_abort_request(struct spdk_nvmf_qpair *qpair,
			      struct spdk_nvmf_request *req)
{
	struct spdk_nvmf_rdma_qpair *rqpair;
	struct spdk_nvmf_rdma_transport *rtransport;
	struct spdk_nvmf_transport *transport;
	uint16_t cid;
	uint32_t i;
	struct spdk_nvmf_rdma_request *rdma_req_to_abort = NULL;

	rqpair = SPDK_CONTAINEROF(qpair, struct spdk_nvmf_rdma_qpair, qpair);
	rtransport = SPDK_CONTAINEROF(qpair->transport, struct spdk_nvmf_rdma_transport, transport);
	transport = &rtransport->transport;

	cid = req->cmd->nvme_cmd.cdw10_bits.abort.cid;

	for (i = 0; i < rqpair->max_queue_depth; i++) {
@@ -4125,7 +4131,8 @@ nvmf_rdma_qpair_abort_request(struct spdk_nvmf_qpair *qpair,
	}

	req->req_to_abort = &rdma_req_to_abort->req;
	req->timeout_tsc = spdk_get_ticks() + NVMF_RDMA_ABORT_TIMEOUT_SEC * spdk_get_ticks_hz();
	req->timeout_tsc = spdk_get_ticks() +
			   transport->opts.abort_timeout_sec * spdk_get_ticks_hz();
	req->poller = NULL;

	_nvmf_rdma_qpair_abort_request(req);
Loading