From 5ea1c95947f18e2812e46e11595e6e5b4cf439e4 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 24 Sep 2019 10:58:39 +0900 Subject: [PATCH] nvmf/rdma: Update only iov_base when buffer replacement succeeds When buffer replacement succeeds, only iov_base has to be updated. This change is small but will be helpful to disaggregate buffer allocation and filling WR SGL. Signed-off-by: Shuhei Matsumoto Change-Id: Ifc72fd783b515dfaecac04939c183097f939e29b Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/469202 Community-CI: Broadcom SPDK FC-NVMe CI Reviewed-by: Ben Walker Reviewed-by: Jim Harris Reviewed-by: Alexey Marchuk Reviewed-by: Seth Howell Tested-by: SPDK CI Jenkins --- lib/nvmf/rdma.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index f97955a17..100542d46 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -1635,12 +1635,14 @@ nvmf_rdma_fill_buffers_with_md_interleave(struct spdk_nvmf_rdma_transport *rtran & ~NVMF_DATA_BUFFER_MASK); iov->iov_len = spdk_min(remaining_length, rtransport->transport.opts.io_unit_size); - if (spdk_unlikely(!nvmf_rdma_fill_wr_sge_with_md_interleave(device, req, wr, - &remaining_data_block, &offset, dif_ctx))) { + while (spdk_unlikely(!nvmf_rdma_fill_wr_sge_with_md_interleave(device, req, wr, + &remaining_data_block, &offset, dif_ctx))) { if (nvmf_rdma_replace_buffer(rgroup, &req->buffers[req->iovcnt]) == -ENOMEM) { return -ENOMEM; } - continue; + req->iov[req->iovcnt].iov_base = (void *)((uintptr_t)(req->buffers[req->iovcnt] + + NVMF_DATA_BUFFER_MASK) & + ~NVMF_DATA_BUFFER_MASK); } remaining_length -= iov->iov_len; @@ -1690,11 +1692,13 @@ nvmf_rdma_fill_buffers(struct spdk_nvmf_rdma_transport *rtransport, ~NVMF_DATA_BUFFER_MASK); req->iov[req->iovcnt].iov_len = spdk_min(length, rtransport->transport.opts.io_unit_size); - if (spdk_unlikely(!nvmf_rdma_fill_wr_sge(device, req, wr))) { + while (spdk_unlikely(!nvmf_rdma_fill_wr_sge(device, req, wr))) { if (nvmf_rdma_replace_buffer(rgroup, &req->buffers[req->iovcnt]) == -ENOMEM) { return -ENOMEM; } - continue; + req->iov[req->iovcnt].iov_base = (void *)((uintptr_t)(req->buffers[req->iovcnt] + + NVMF_DATA_BUFFER_MASK) & + ~NVMF_DATA_BUFFER_MASK); } length -= req->iov[req->iovcnt].iov_len;