lib/nvmf: Add nvmf_transport_qpair_abort_request()

State machine is different among NVMe-oF transports and is
encapsulated to the transport neutral NVMe-oF controller and
NVMe-oF qpair.

To implement abort operation for each NVMe-oF transport,
add a function pointer qpair_abort_request to struct spdk_nvmf_transport_ops
and a stub nvmf_transport_qpair_abort_request() to encapsulate
which transport is used.

The following patches will implement qpair_abort_request for each
transport. Each qpair_abort_request() is responsible to call
spdk_nvmf_request_complete() for the abort request.

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: I2beac959ed428c5108cf33691226b7fae5cd24d6
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3007
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Michael Haeuptle <michaelhaeuptle@gmail.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Shuhei Matsumoto 2020-06-22 00:28:27 +09:00 committed by Tomasz Zawadzki
parent a8beb79ea3
commit 604b4503c4
10 changed files with 51 additions and 4 deletions

View File

@ -334,6 +334,15 @@ struct spdk_nvmf_transport_ops {
int (*qpair_get_listen_trid)(struct spdk_nvmf_qpair *qpair, int (*qpair_get_listen_trid)(struct spdk_nvmf_qpair *qpair,
struct spdk_nvme_transport_id *trid); struct spdk_nvme_transport_id *trid);
/*
* Abort the request which the abort request specifies.
* This function can complete synchronously or asynchronously, but
* is expected to call spdk_nvmf_request_complete() in the end
* for both cases.
*/
void (*qpair_abort_request)(struct spdk_nvmf_qpair *qpair,
struct spdk_nvmf_request *req);
/* /*
* Get transport poll group statistics * Get transport poll group statistics
*/ */

View File

@ -2103,10 +2103,7 @@ nvmf_qpair_abort_request(struct spdk_nvmf_qpair *qpair, struct spdk_nvmf_request
return; return;
} }
/* TODO: track list of outstanding requests in qpair? */ nvmf_transport_qpair_abort_request(qpair, req);
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "cid %u not found\n", cid);
spdk_nvmf_request_complete(req);
} }
static void static void

View File

@ -2116,6 +2116,13 @@ nvmf_fc_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair,
return 0; return 0;
} }
static void
nvmf_fc_qpair_abort_request(struct spdk_nvmf_qpair *qpair,
struct spdk_nvmf_request *req)
{
spdk_nvmf_request_complete(req);
}
const struct spdk_nvmf_transport_ops spdk_nvmf_transport_fc = { const struct spdk_nvmf_transport_ops spdk_nvmf_transport_fc = {
.name = "FC", .name = "FC",
.type = (enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC, .type = (enum spdk_nvme_transport_type) SPDK_NVMF_TRTYPE_FC,
@ -2140,6 +2147,7 @@ const struct spdk_nvmf_transport_ops spdk_nvmf_transport_fc = {
.qpair_get_peer_trid = nvmf_fc_qpair_get_peer_trid, .qpair_get_peer_trid = nvmf_fc_qpair_get_peer_trid,
.qpair_get_local_trid = nvmf_fc_qpair_get_local_trid, .qpair_get_local_trid = nvmf_fc_qpair_get_local_trid,
.qpair_get_listen_trid = nvmf_fc_qpair_get_listen_trid, .qpair_get_listen_trid = nvmf_fc_qpair_get_listen_trid,
.qpair_abort_request = nvmf_fc_qpair_abort_request,
}; };
/* /*

View File

@ -4026,6 +4026,13 @@ spdk_nvmf_rdma_init_hooks(struct spdk_nvme_rdma_hooks *hooks)
g_nvmf_hooks = *hooks; g_nvmf_hooks = *hooks;
} }
static void
nvmf_rdma_qpair_abort_request(struct spdk_nvmf_qpair *qpair,
struct spdk_nvmf_request *req)
{
spdk_nvmf_request_complete(req);
}
static int static int
nvmf_rdma_poll_group_get_stat(struct spdk_nvmf_tgt *tgt, nvmf_rdma_poll_group_get_stat(struct spdk_nvmf_tgt *tgt,
struct spdk_nvmf_transport_poll_group_stat **stat) struct spdk_nvmf_transport_poll_group_stat **stat)
@ -4122,6 +4129,7 @@ const struct spdk_nvmf_transport_ops spdk_nvmf_transport_rdma = {
.qpair_get_peer_trid = nvmf_rdma_qpair_get_peer_trid, .qpair_get_peer_trid = nvmf_rdma_qpair_get_peer_trid,
.qpair_get_local_trid = nvmf_rdma_qpair_get_local_trid, .qpair_get_local_trid = nvmf_rdma_qpair_get_local_trid,
.qpair_get_listen_trid = nvmf_rdma_qpair_get_listen_trid, .qpair_get_listen_trid = nvmf_rdma_qpair_get_listen_trid,
.qpair_abort_request = nvmf_rdma_qpair_abort_request,
.poll_group_get_stat = nvmf_rdma_poll_group_get_stat, .poll_group_get_stat = nvmf_rdma_poll_group_get_stat,
.poll_group_free_stat = nvmf_rdma_poll_group_free_stat, .poll_group_free_stat = nvmf_rdma_poll_group_free_stat,

View File

@ -2459,6 +2459,13 @@ nvmf_tcp_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair,
return nvmf_tcp_qpair_get_trid(qpair, trid, 0); return nvmf_tcp_qpair_get_trid(qpair, trid, 0);
} }
static void
nvmf_tcp_qpair_abort_request(struct spdk_nvmf_qpair *qpair,
struct spdk_nvmf_request *req)
{
spdk_nvmf_request_complete(req);
}
#define SPDK_NVMF_TCP_DEFAULT_MAX_QUEUE_DEPTH 128 #define SPDK_NVMF_TCP_DEFAULT_MAX_QUEUE_DEPTH 128
#define SPDK_NVMF_TCP_DEFAULT_AQ_DEPTH 128 #define SPDK_NVMF_TCP_DEFAULT_AQ_DEPTH 128
#define SPDK_NVMF_TCP_DEFAULT_MAX_QPAIRS_PER_CTRLR 128 #define SPDK_NVMF_TCP_DEFAULT_MAX_QPAIRS_PER_CTRLR 128
@ -2514,6 +2521,7 @@ const struct spdk_nvmf_transport_ops spdk_nvmf_transport_tcp = {
.qpair_get_local_trid = nvmf_tcp_qpair_get_local_trid, .qpair_get_local_trid = nvmf_tcp_qpair_get_local_trid,
.qpair_get_peer_trid = nvmf_tcp_qpair_get_peer_trid, .qpair_get_peer_trid = nvmf_tcp_qpair_get_peer_trid,
.qpair_get_listen_trid = nvmf_tcp_qpair_get_listen_trid, .qpair_get_listen_trid = nvmf_tcp_qpair_get_listen_trid,
.qpair_abort_request = nvmf_tcp_qpair_abort_request,
}; };
SPDK_NVMF_TRANSPORT_REGISTER(tcp, &spdk_nvmf_transport_tcp); SPDK_NVMF_TRANSPORT_REGISTER(tcp, &spdk_nvmf_transport_tcp);

View File

@ -401,6 +401,13 @@ nvmf_transport_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair,
return qpair->transport->ops->qpair_get_listen_trid(qpair, trid); return qpair->transport->ops->qpair_get_listen_trid(qpair, trid);
} }
void
nvmf_transport_qpair_abort_request(struct spdk_nvmf_qpair *qpair,
struct spdk_nvmf_request *req)
{
qpair->transport->ops->qpair_abort_request(qpair, req);
}
bool bool
spdk_nvmf_transport_opts_init(const char *transport_name, spdk_nvmf_transport_opts_init(const char *transport_name,
struct spdk_nvmf_transport_opts *opts) struct spdk_nvmf_transport_opts *opts)

View File

@ -76,4 +76,7 @@ int nvmf_transport_qpair_get_local_trid(struct spdk_nvmf_qpair *qpair,
int nvmf_transport_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair, int nvmf_transport_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair,
struct spdk_nvme_transport_id *trid); struct spdk_nvme_transport_id *trid);
void nvmf_transport_qpair_abort_request(struct spdk_nvmf_qpair *qpair,
struct spdk_nvmf_request *req);
#endif /* SPDK_NVMF_TRANSPORT_H */ #endif /* SPDK_NVMF_TRANSPORT_H */

View File

@ -179,6 +179,9 @@ DEFINE_STUB(nvmf_bdev_ctrlr_get_dif_ctx, bool,
struct spdk_dif_ctx *dif_ctx), struct spdk_dif_ctx *dif_ctx),
true); true);
DEFINE_STUB_V(nvmf_transport_qpair_abort_request,
(struct spdk_nvmf_qpair *qpair, struct spdk_nvmf_request *req));
int int
spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_cb cb_fn, void *ctx) spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_cb cb_fn, void *ctx)
{ {

View File

@ -77,6 +77,7 @@ DEFINE_STUB_V(_spdk_trace_record, (uint64_t tsc, uint16_t tpoint_id, uint16_t po
DEFINE_STUB_V(spdk_nvmf_ctrlr_data_init, (struct spdk_nvmf_transport_opts *opts, DEFINE_STUB_V(spdk_nvmf_ctrlr_data_init, (struct spdk_nvmf_transport_opts *opts,
struct spdk_nvmf_ctrlr_data *cdata)); struct spdk_nvmf_ctrlr_data *cdata));
DEFINE_STUB_V(spdk_nvmf_request_exec, (struct spdk_nvmf_request *req)); DEFINE_STUB_V(spdk_nvmf_request_exec, (struct spdk_nvmf_request *req));
DEFINE_STUB(spdk_nvmf_request_complete, int, (struct spdk_nvmf_request *req), 0);
DEFINE_STUB(spdk_nvme_transport_id_compare, int, (const struct spdk_nvme_transport_id *trid1, DEFINE_STUB(spdk_nvme_transport_id_compare, int, (const struct spdk_nvme_transport_id *trid1,
const struct spdk_nvme_transport_id *trid2), 0); const struct spdk_nvme_transport_id *trid2), 0);
DEFINE_STUB_V(nvmf_ctrlr_abort_aer, (struct spdk_nvmf_ctrlr *ctrlr)); DEFINE_STUB_V(nvmf_ctrlr_abort_aer, (struct spdk_nvmf_ctrlr *ctrlr));

View File

@ -200,6 +200,9 @@ DEFINE_STUB_V(spdk_nvmf_transport_register, (const struct spdk_nvmf_transport_op
DEFINE_STUB_V(spdk_nvmf_tgt_new_qpair, (struct spdk_nvmf_tgt *tgt, struct spdk_nvmf_qpair *qpair)); DEFINE_STUB_V(spdk_nvmf_tgt_new_qpair, (struct spdk_nvmf_tgt *tgt, struct spdk_nvmf_qpair *qpair));
DEFINE_STUB_V(nvmf_transport_qpair_abort_request,
(struct spdk_nvmf_qpair *qpair, struct spdk_nvmf_request *req));
struct spdk_trace_histories *g_trace_histories; struct spdk_trace_histories *g_trace_histories;
struct spdk_bdev { struct spdk_bdev {