diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 509f70bbd..a93882ad3 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -644,40 +644,22 @@ static void nvmf_rdma_request_free_data(struct spdk_nvmf_rdma_request *rdma_req, struct spdk_nvmf_rdma_transport *rtransport) { - struct spdk_nvmf_rdma_request_data *current_data_wr = NULL, *next_data_wr = NULL; - struct ibv_send_wr *send_wr; - int i; + struct spdk_nvmf_rdma_request_data *data_wr; + struct ibv_send_wr *next_send_wr; + uint64_t req_wrid; rdma_req->num_outstanding_data_wr = 0; - current_data_wr = &rdma_req->data; - for (i = 0; i < current_data_wr->wr.num_sge; i++) { - current_data_wr->wr.sg_list[i].addr = 0; - current_data_wr->wr.sg_list[i].length = 0; - current_data_wr->wr.sg_list[i].lkey = 0; - } - current_data_wr->wr.num_sge = 0; - - send_wr = current_data_wr->wr.next; - if (send_wr != NULL && send_wr != &rdma_req->rsp.wr) { - next_data_wr = SPDK_CONTAINEROF(send_wr, struct spdk_nvmf_rdma_request_data, wr); - } - while (next_data_wr) { - current_data_wr = next_data_wr; - send_wr = current_data_wr->wr.next; - if (send_wr != NULL && send_wr != &rdma_req->rsp.wr && - send_wr->wr_id == current_data_wr->wr.wr_id) { - next_data_wr = SPDK_CONTAINEROF(send_wr, struct spdk_nvmf_rdma_request_data, wr); - } else { - next_data_wr = NULL; + data_wr = &rdma_req->data; + req_wrid = data_wr->wr.wr_id; + while (data_wr && data_wr->wr.wr_id == req_wrid) { + memset(data_wr->sgl, 0, sizeof(data_wr->wr.sg_list[0]) * data_wr->wr.num_sge); + data_wr->wr.num_sge = 0; + next_send_wr = data_wr->wr.next; + if (data_wr != &rdma_req->data) { + spdk_mempool_put(rtransport->data_wr_pool, data_wr); } - - for (i = 0; i < current_data_wr->wr.num_sge; i++) { - current_data_wr->wr.sg_list[i].addr = 0; - current_data_wr->wr.sg_list[i].length = 0; - current_data_wr->wr.sg_list[i].lkey = 0; - } - current_data_wr->wr.num_sge = 0; - spdk_mempool_put(rtransport->data_wr_pool, current_data_wr); + data_wr = (!next_send_wr || next_send_wr == &rdma_req->rsp.wr) ? NULL : + SPDK_CONTAINEROF(next_send_wr, struct spdk_nvmf_rdma_request_data, wr); } }