nvme/rdma: Use RDMA provider API to post recv WRs

Signed-off-by: Alexey Marchuk <alexeymar@mellanox.com>
Change-Id: I47cc1a21af1104f681519e542edaf66e363bb214
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6296
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Alexey Marchuk 2020-12-03 18:16:47 +03:00 committed by Tomasz Zawadzki
parent 3caf2e710f
commit 47afb9280f

View File

@ -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, 2020 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 2019-2021 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
@ -163,11 +163,6 @@ struct nvme_rdma_poll_group {
STAILQ_HEAD(, nvme_rdma_destroyed_qpair) destroyed_qpairs; STAILQ_HEAD(, nvme_rdma_destroyed_qpair) destroyed_qpairs;
}; };
struct spdk_nvme_recv_wr_list {
struct ibv_recv_wr *first;
struct ibv_recv_wr *last;
};
/* Memory regions */ /* Memory regions */
union nvme_rdma_mr { union nvme_rdma_mr {
struct ibv_mr *mr; struct ibv_mr *mr;
@ -202,8 +197,6 @@ struct nvme_rdma_qpair {
struct ibv_recv_wr *rsp_recv_wrs; struct ibv_recv_wr *rsp_recv_wrs;
struct spdk_nvme_recv_wr_list recvs_to_post;
/* Memory region describing all rsps for this qpair */ /* Memory region describing all rsps for this qpair */
union nvme_rdma_mr rsp_mr; union nvme_rdma_mr rsp_mr;
@ -662,20 +655,17 @@ nvme_rdma_qpair_submit_recvs(struct nvme_rdma_qpair *rqpair)
struct ibv_recv_wr *bad_recv_wr; struct ibv_recv_wr *bad_recv_wr;
int rc = 0; int rc = 0;
if (rqpair->recvs_to_post.first) { rc = spdk_rdma_qp_flush_recv_wrs(rqpair->rdma_qp, &bad_recv_wr);
rc = ibv_post_recv(rqpair->rdma_qp->qp, rqpair->recvs_to_post.first, &bad_recv_wr); if (spdk_unlikely(rc)) {
if (spdk_unlikely(rc)) { SPDK_ERRLOG("Failed to post WRs on receive queue, errno %d (%s), bad_wr %p\n",
SPDK_ERRLOG("Failed to post WRs on receive queue, errno %d (%s), bad_wr %p\n", rc, spdk_strerror(rc), bad_recv_wr);
rc, spdk_strerror(rc), bad_recv_wr); while (bad_recv_wr != NULL) {
while (bad_recv_wr != NULL) { assert(rqpair->current_num_sends > 0);
assert(rqpair->current_num_sends > 0); rqpair->current_num_recvs--;
rqpair->current_num_recvs--; bad_recv_wr = bad_recv_wr->next;
bad_recv_wr = bad_recv_wr->next;
}
} }
rqpair->recvs_to_post.first = NULL;
} }
return rc; return rc;
} }
@ -708,13 +698,7 @@ nvme_rdma_qpair_queue_recv_wr(struct nvme_rdma_qpair *rqpair, struct ibv_recv_wr
assert(rqpair->current_num_recvs < rqpair->num_entries); assert(rqpair->current_num_recvs < rqpair->num_entries);
rqpair->current_num_recvs++; rqpair->current_num_recvs++;
if (rqpair->recvs_to_post.first == NULL) { spdk_rdma_qp_queue_recv_wrs(rqpair->rdma_qp, wr);
rqpair->recvs_to_post.first = wr;
} else {
rqpair->recvs_to_post.last->next = wr;
}
rqpair->recvs_to_post.last = wr;
if (!rqpair->delay_cmd_submit) { if (!rqpair->delay_cmd_submit) {
return nvme_rdma_qpair_submit_recvs(rqpair); return nvme_rdma_qpair_submit_recvs(rqpair);