nvmf/rdma: Use RDMA provider API to send WRs
Change-Id: I9bd6956d27716ae95abea0fd78adebaa9b288edb Signed-off-by: Alexey Marchuk <alexeymar@mellanox.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1660 Community-CI: Mellanox Build Bot Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Seth Howell <seth.howell@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
a12530d6d2
commit
bbb493ce0c
@ -373,9 +373,6 @@ struct spdk_nvmf_rdma_qpair {
|
|||||||
/* The maximum number of SGEs per WR on the recv queue */
|
/* The maximum number of SGEs per WR on the recv queue */
|
||||||
uint32_t max_recv_sge;
|
uint32_t max_recv_sge;
|
||||||
|
|
||||||
/* The list of pending send requests for a transfer */
|
|
||||||
struct spdk_nvmf_send_wr_list sends_to_post;
|
|
||||||
|
|
||||||
struct spdk_nvmf_rdma_resources *resources;
|
struct spdk_nvmf_rdma_resources *resources;
|
||||||
|
|
||||||
STAILQ_HEAD(, spdk_nvmf_rdma_request) pending_rdma_read_queue;
|
STAILQ_HEAD(, spdk_nvmf_rdma_request) pending_rdma_read_queue;
|
||||||
@ -997,9 +994,6 @@ nvmf_rdma_qpair_initialize(struct spdk_nvmf_qpair *qpair)
|
|||||||
spdk_trace_record(TRACE_RDMA_QP_CREATE, 0, 0, (uintptr_t)rqpair->cm_id, 0);
|
spdk_trace_record(TRACE_RDMA_QP_CREATE, 0, 0, (uintptr_t)rqpair->cm_id, 0);
|
||||||
SPDK_DEBUGLOG(SPDK_LOG_RDMA, "New RDMA Connection: %p\n", qpair);
|
SPDK_DEBUGLOG(SPDK_LOG_RDMA, "New RDMA Connection: %p\n", qpair);
|
||||||
|
|
||||||
rqpair->sends_to_post.first = NULL;
|
|
||||||
rqpair->sends_to_post.last = NULL;
|
|
||||||
|
|
||||||
if (rqpair->poller->srq == NULL) {
|
if (rqpair->poller->srq == NULL) {
|
||||||
rtransport = SPDK_CONTAINEROF(qpair->transport, struct spdk_nvmf_rdma_transport, transport);
|
rtransport = SPDK_CONTAINEROF(qpair->transport, struct spdk_nvmf_rdma_transport, transport);
|
||||||
transport = &rtransport->transport;
|
transport = &rtransport->transport;
|
||||||
@ -1058,28 +1052,6 @@ nvmf_rdma_qpair_queue_recv_wrs(struct spdk_nvmf_rdma_qpair *rqpair, struct ibv_r
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Append the given send wr structure to the qpair's outstanding sends list. */
|
|
||||||
/* This function accepts either a single wr or the first wr in a linked list. */
|
|
||||||
static void
|
|
||||||
nvmf_rdma_qpair_queue_send_wrs(struct spdk_nvmf_rdma_qpair *rqpair, struct ibv_send_wr *first)
|
|
||||||
{
|
|
||||||
struct ibv_send_wr *last;
|
|
||||||
|
|
||||||
last = first;
|
|
||||||
while (last->next != NULL) {
|
|
||||||
last = last->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rqpair->sends_to_post.first == NULL) {
|
|
||||||
rqpair->sends_to_post.first = first;
|
|
||||||
rqpair->sends_to_post.last = last;
|
|
||||||
STAILQ_INSERT_TAIL(&rqpair->poller->qpairs_pending_send, rqpair, send_link);
|
|
||||||
} else {
|
|
||||||
rqpair->sends_to_post.last->next = first;
|
|
||||||
rqpair->sends_to_post.last = last;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
request_transfer_in(struct spdk_nvmf_request *req)
|
request_transfer_in(struct spdk_nvmf_request *req)
|
||||||
{
|
{
|
||||||
@ -1094,7 +1066,10 @@ request_transfer_in(struct spdk_nvmf_request *req)
|
|||||||
assert(req->xfer == SPDK_NVME_DATA_HOST_TO_CONTROLLER);
|
assert(req->xfer == SPDK_NVME_DATA_HOST_TO_CONTROLLER);
|
||||||
assert(rdma_req != NULL);
|
assert(rdma_req != NULL);
|
||||||
|
|
||||||
nvmf_rdma_qpair_queue_send_wrs(rqpair, &rdma_req->data.wr);
|
if (spdk_rdma_qp_queue_send_wrs(rqpair->rdma_qp, &rdma_req->data.wr)) {
|
||||||
|
STAILQ_INSERT_TAIL(&rqpair->poller->qpairs_pending_send, rqpair, send_link);
|
||||||
|
}
|
||||||
|
|
||||||
rqpair->current_read_depth += rdma_req->num_outstanding_data_wr;
|
rqpair->current_read_depth += rdma_req->num_outstanding_data_wr;
|
||||||
rqpair->current_send_depth += rdma_req->num_outstanding_data_wr;
|
rqpair->current_send_depth += rdma_req->num_outstanding_data_wr;
|
||||||
return 0;
|
return 0;
|
||||||
@ -1145,7 +1120,10 @@ request_transfer_out(struct spdk_nvmf_request *req, int *data_posted)
|
|||||||
*data_posted = 1;
|
*data_posted = 1;
|
||||||
num_outstanding_data_wr = rdma_req->num_outstanding_data_wr;
|
num_outstanding_data_wr = rdma_req->num_outstanding_data_wr;
|
||||||
}
|
}
|
||||||
nvmf_rdma_qpair_queue_send_wrs(rqpair, first);
|
if (spdk_rdma_qp_queue_send_wrs(rqpair->rdma_qp, first)) {
|
||||||
|
STAILQ_INSERT_TAIL(&rqpair->poller->qpairs_pending_send, rqpair, send_link);
|
||||||
|
}
|
||||||
|
|
||||||
/* +1 for the rsp wr */
|
/* +1 for the rsp wr */
|
||||||
rqpair->current_send_depth += num_outstanding_data_wr + 1;
|
rqpair->current_send_depth += num_outstanding_data_wr + 1;
|
||||||
|
|
||||||
@ -3743,15 +3721,12 @@ _poller_submit_sends(struct spdk_nvmf_rdma_transport *rtransport,
|
|||||||
|
|
||||||
while (!STAILQ_EMPTY(&rpoller->qpairs_pending_send)) {
|
while (!STAILQ_EMPTY(&rpoller->qpairs_pending_send)) {
|
||||||
rqpair = STAILQ_FIRST(&rpoller->qpairs_pending_send);
|
rqpair = STAILQ_FIRST(&rpoller->qpairs_pending_send);
|
||||||
assert(rqpair->sends_to_post.first != NULL);
|
rc = spdk_rdma_qp_flush_send_wrs(rqpair->rdma_qp, &bad_wr);
|
||||||
rc = ibv_post_send(rqpair->rdma_qp->qp, rqpair->sends_to_post.first, &bad_wr);
|
|
||||||
|
|
||||||
/* bad wr always points to the first wr that failed. */
|
/* bad wr always points to the first wr that failed. */
|
||||||
if (rc) {
|
if (rc) {
|
||||||
_qp_reset_failed_sends(rtransport, rqpair, bad_wr, rc);
|
_qp_reset_failed_sends(rtransport, rqpair, bad_wr, rc);
|
||||||
}
|
}
|
||||||
rqpair->sends_to_post.first = NULL;
|
|
||||||
rqpair->sends_to_post.last = NULL;
|
|
||||||
STAILQ_REMOVE_HEAD(&rpoller->qpairs_pending_send, send_link);
|
STAILQ_REMOVE_HEAD(&rpoller->qpairs_pending_send, send_link);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,3 +41,7 @@ DEFINE_STUB(spdk_rdma_qp_create, struct spdk_rdma_qp *, (struct rdma_cm_id *cm_i
|
|||||||
DEFINE_STUB(spdk_rdma_qp_complete_connect, int, (struct spdk_rdma_qp *spdk_rdma_qp), 0);
|
DEFINE_STUB(spdk_rdma_qp_complete_connect, int, (struct spdk_rdma_qp *spdk_rdma_qp), 0);
|
||||||
DEFINE_STUB_V(spdk_rdma_qp_destroy, (struct spdk_rdma_qp *spdk_rdma_qp));
|
DEFINE_STUB_V(spdk_rdma_qp_destroy, (struct spdk_rdma_qp *spdk_rdma_qp));
|
||||||
DEFINE_STUB(spdk_rdma_qp_disconnect, int, (struct spdk_rdma_qp *spdk_rdma_qp), 0);
|
DEFINE_STUB(spdk_rdma_qp_disconnect, int, (struct spdk_rdma_qp *spdk_rdma_qp), 0);
|
||||||
|
DEFINE_STUB(spdk_rdma_qp_queue_send_wrs, bool, (struct spdk_rdma_qp *spdk_rdma_qp,
|
||||||
|
struct ibv_send_wr *first), true);
|
||||||
|
DEFINE_STUB(spdk_rdma_qp_flush_send_wrs, int, (struct spdk_rdma_qp *spdk_rdma_qp,
|
||||||
|
struct ibv_send_wr **bad_wr), 0);
|
||||||
|
@ -647,8 +647,6 @@ test_spdk_nvmf_rdma_request_process(void)
|
|||||||
CU_ASSERT(progress == true);
|
CU_ASSERT(progress == true);
|
||||||
CU_ASSERT(rdma_req->state == RDMA_REQUEST_STATE_TRANSFERRING_CONTROLLER_TO_HOST);
|
CU_ASSERT(rdma_req->state == RDMA_REQUEST_STATE_TRANSFERRING_CONTROLLER_TO_HOST);
|
||||||
CU_ASSERT(rdma_req->recv == NULL);
|
CU_ASSERT(rdma_req->recv == NULL);
|
||||||
CU_ASSERT(rqpair.sends_to_post.first == &rdma_req->data.wr);
|
|
||||||
CU_ASSERT(rqpair.sends_to_post.last == &rdma_req->rsp.wr);
|
|
||||||
CU_ASSERT(resources.recvs_to_post.first == &rdma_recv->wr);
|
CU_ASSERT(resources.recvs_to_post.first == &rdma_recv->wr);
|
||||||
CU_ASSERT(resources.recvs_to_post.last == &rdma_recv->wr);
|
CU_ASSERT(resources.recvs_to_post.last == &rdma_recv->wr);
|
||||||
/* COMPLETED -> FREE */
|
/* COMPLETED -> FREE */
|
||||||
@ -671,9 +669,6 @@ test_spdk_nvmf_rdma_request_process(void)
|
|||||||
CU_ASSERT(progress == true);
|
CU_ASSERT(progress == true);
|
||||||
CU_ASSERT(rdma_req->state == RDMA_REQUEST_STATE_TRANSFERRING_HOST_TO_CONTROLLER);
|
CU_ASSERT(rdma_req->state == RDMA_REQUEST_STATE_TRANSFERRING_HOST_TO_CONTROLLER);
|
||||||
CU_ASSERT(rdma_req->req.xfer == SPDK_NVME_DATA_HOST_TO_CONTROLLER);
|
CU_ASSERT(rdma_req->req.xfer == SPDK_NVME_DATA_HOST_TO_CONTROLLER);
|
||||||
CU_ASSERT(rqpair.sends_to_post.first == &rdma_req->data.wr);
|
|
||||||
CU_ASSERT(rqpair.sends_to_post.last == &rdma_req->data.wr);
|
|
||||||
rqpair.sends_to_post.first = rqpair.sends_to_post.last = NULL;
|
|
||||||
STAILQ_INIT(&poller.qpairs_pending_send);
|
STAILQ_INIT(&poller.qpairs_pending_send);
|
||||||
/* READY_TO_EXECUTE -> EXECUTING */
|
/* READY_TO_EXECUTE -> EXECUTING */
|
||||||
rdma_req->state = RDMA_REQUEST_STATE_READY_TO_EXECUTE;
|
rdma_req->state = RDMA_REQUEST_STATE_READY_TO_EXECUTE;
|
||||||
@ -686,8 +681,6 @@ test_spdk_nvmf_rdma_request_process(void)
|
|||||||
CU_ASSERT(progress == true);
|
CU_ASSERT(progress == true);
|
||||||
CU_ASSERT(rdma_req->state == RDMA_REQUEST_STATE_COMPLETING);
|
CU_ASSERT(rdma_req->state == RDMA_REQUEST_STATE_COMPLETING);
|
||||||
CU_ASSERT(rdma_req->recv == NULL);
|
CU_ASSERT(rdma_req->recv == NULL);
|
||||||
CU_ASSERT(rqpair.sends_to_post.first == &rdma_req->rsp.wr);
|
|
||||||
CU_ASSERT(rqpair.sends_to_post.last == &rdma_req->rsp.wr);
|
|
||||||
CU_ASSERT(resources.recvs_to_post.first == &rdma_recv->wr);
|
CU_ASSERT(resources.recvs_to_post.first == &rdma_recv->wr);
|
||||||
CU_ASSERT(resources.recvs_to_post.last == &rdma_recv->wr);
|
CU_ASSERT(resources.recvs_to_post.last == &rdma_recv->wr);
|
||||||
/* COMPLETED -> FREE */
|
/* COMPLETED -> FREE */
|
||||||
@ -714,20 +707,12 @@ test_spdk_nvmf_rdma_request_process(void)
|
|||||||
rqpair.current_recv_depth = 1;
|
rqpair.current_recv_depth = 1;
|
||||||
nvmf_rdma_request_process(&rtransport, req1);
|
nvmf_rdma_request_process(&rtransport, req1);
|
||||||
CU_ASSERT(req1->state == RDMA_REQUEST_STATE_TRANSFERRING_HOST_TO_CONTROLLER);
|
CU_ASSERT(req1->state == RDMA_REQUEST_STATE_TRANSFERRING_HOST_TO_CONTROLLER);
|
||||||
/* WRITE 1 is the first in batching list */
|
|
||||||
CU_ASSERT(rqpair.sends_to_post.first == &req1->data.wr);
|
|
||||||
CU_ASSERT(rqpair.sends_to_post.last == &req1->data.wr);
|
|
||||||
|
|
||||||
/* WRITE 2: NEW -> TRANSFERRING_H2C */
|
/* WRITE 2: NEW -> TRANSFERRING_H2C */
|
||||||
rqpair.current_recv_depth = 2;
|
rqpair.current_recv_depth = 2;
|
||||||
nvmf_rdma_request_process(&rtransport, req2);
|
nvmf_rdma_request_process(&rtransport, req2);
|
||||||
CU_ASSERT(req2->state == RDMA_REQUEST_STATE_TRANSFERRING_HOST_TO_CONTROLLER);
|
CU_ASSERT(req2->state == RDMA_REQUEST_STATE_TRANSFERRING_HOST_TO_CONTROLLER);
|
||||||
/* WRITE 2 is now also in the batching list */
|
|
||||||
CU_ASSERT(rqpair.sends_to_post.first->next == &req2->data.wr);
|
|
||||||
CU_ASSERT(rqpair.sends_to_post.last == &req2->data.wr);
|
|
||||||
|
|
||||||
/* Send everything */
|
|
||||||
rqpair.sends_to_post.first = rqpair.sends_to_post.last = NULL;
|
|
||||||
STAILQ_INIT(&poller.qpairs_pending_send);
|
STAILQ_INIT(&poller.qpairs_pending_send);
|
||||||
|
|
||||||
/* WRITE 1 completes before WRITE 2 has finished RDMA reading */
|
/* WRITE 1 completes before WRITE 2 has finished RDMA reading */
|
||||||
@ -739,9 +724,6 @@ test_spdk_nvmf_rdma_request_process(void)
|
|||||||
req1->state = RDMA_REQUEST_STATE_EXECUTED;
|
req1->state = RDMA_REQUEST_STATE_EXECUTED;
|
||||||
nvmf_rdma_request_process(&rtransport, req1);
|
nvmf_rdma_request_process(&rtransport, req1);
|
||||||
CU_ASSERT(req1->state == RDMA_REQUEST_STATE_COMPLETING);
|
CU_ASSERT(req1->state == RDMA_REQUEST_STATE_COMPLETING);
|
||||||
CU_ASSERT(rqpair.sends_to_post.first == &req1->rsp.wr);
|
|
||||||
CU_ASSERT(rqpair.sends_to_post.last == &req1->rsp.wr);
|
|
||||||
rqpair.sends_to_post.first = rqpair.sends_to_post.last = NULL;
|
|
||||||
STAILQ_INIT(&poller.qpairs_pending_send);
|
STAILQ_INIT(&poller.qpairs_pending_send);
|
||||||
/* WRITE 1: COMPLETED -> FREE */
|
/* WRITE 1: COMPLETED -> FREE */
|
||||||
req1->state = RDMA_REQUEST_STATE_COMPLETED;
|
req1->state = RDMA_REQUEST_STATE_COMPLETED;
|
||||||
@ -758,9 +740,6 @@ test_spdk_nvmf_rdma_request_process(void)
|
|||||||
req2->state = RDMA_REQUEST_STATE_EXECUTED;
|
req2->state = RDMA_REQUEST_STATE_EXECUTED;
|
||||||
nvmf_rdma_request_process(&rtransport, req2);
|
nvmf_rdma_request_process(&rtransport, req2);
|
||||||
CU_ASSERT(req2->state == RDMA_REQUEST_STATE_COMPLETING);
|
CU_ASSERT(req2->state == RDMA_REQUEST_STATE_COMPLETING);
|
||||||
CU_ASSERT(rqpair.sends_to_post.first == &req2->rsp.wr);
|
|
||||||
CU_ASSERT(rqpair.sends_to_post.last == &req2->rsp.wr);
|
|
||||||
rqpair.sends_to_post.first = rqpair.sends_to_post.last = NULL;
|
|
||||||
STAILQ_INIT(&poller.qpairs_pending_send);
|
STAILQ_INIT(&poller.qpairs_pending_send);
|
||||||
/* WRITE 1: COMPLETED -> FREE */
|
/* WRITE 1: COMPLETED -> FREE */
|
||||||
req2->state = RDMA_REQUEST_STATE_COMPLETED;
|
req2->state = RDMA_REQUEST_STATE_COMPLETED;
|
||||||
|
Loading…
Reference in New Issue
Block a user