From e3b8c31d03284cbbbc4bb6a29a110d0daf911b20 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Fri, 23 Aug 2019 07:44:22 +0900 Subject: [PATCH] nvmf/fc: Use spdk_mempool_get_bulk in nvmf_fc_request_alloc_buffers This follows the practice of RDMA transport and a preparation to unify buffer management among transport types. Signed-off-by: Shuhei Matsumoto Change-Id: Ic7dc8e6b826baf7f471d192630e8a048a35056ac Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/465866 Reviewed-by: Broadcom SPDK FC-NVMe CI Reviewed-by: Anil Veerabhadrappa Reviewed-by: Jim Harris Reviewed-by: Ben Walker Tested-by: SPDK CI Jenkins --- lib/nvmf/fc.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/lib/nvmf/fc.c b/lib/nvmf/fc.c index 10a5c22db..999ce1fe3 100644 --- a/lib/nvmf/fc.c +++ b/lib/nvmf/fc.c @@ -1291,35 +1291,32 @@ complete: static int nvmf_fc_request_alloc_buffers(struct spdk_nvmf_fc_request *fc_req) { - void *buf = NULL; uint32_t length = fc_req->req.length; + uint32_t num_buffers; uint32_t i = 0; struct spdk_nvmf_fc_transport *fc_transport = fc_req->hwqp->fc_poll_group->fc_transport; struct spdk_nvmf_transport *transport = &fc_transport->transport; - fc_req->req.iovcnt = 0; - fc_req->data_from_pool = true; - while (length) { - buf = spdk_mempool_get(transport->data_buf_pool); - if (!buf) { - goto nomem; - } + num_buffers = SPDK_CEIL_DIV(length, transport->opts.io_unit_size); - fc_req->req.iov[i].iov_base = (void *)((uintptr_t)((char *)buf + + if (spdk_mempool_get_bulk(transport->data_buf_pool, fc_req->buffers, num_buffers)) { + return -ENOMEM; + } + + fc_req->req.iovcnt = 0; + + while (length) { + i = fc_req->req.iovcnt; + fc_req->req.iov[i].iov_base = (void *)((uintptr_t)((char *)fc_req->buffers[i] + NVMF_DATA_BUFFER_MASK) & ~NVMF_DATA_BUFFER_MASK); fc_req->req.iov[i].iov_len = spdk_min(length, transport->opts.io_unit_size); fc_req->req.iovcnt++; - fc_req->buffers[i] = buf; - length -= fc_req->req.iov[i++].iov_len; + length -= fc_req->req.iov[i].iov_len; } + fc_req->data_from_pool = true; return 0; - -nomem: - nvmf_fc_request_free_buffers(fc_req); - fc_req->req.iovcnt = 0; - return -ENOMEM; } static int