From cc4d1f82cc7d1b6d9f3d823a90d0b4037c859557 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Wed, 21 Aug 2019 14:36:13 +0900 Subject: [PATCH] nvmf: Add spdk_nvmf_request_get/free_buffers() usable among transports This patch adds new APIs spdk_nvmf_request_get_buffers() and spdk_nvmf_request_free_buffers() to be used among transports. Subsequent patches will replace transport specific APIs by them. Signed-off-by: Shuhei Matsumoto Change-Id: Ib153e2c5806b7276915a0aa91179fe9dbcb2a1f0 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/465874 Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Anil Veerabhadrappa Reviewed-by: Broadcom SPDK FC-NVMe CI Reviewed-by: Ben Walker --- lib/nvmf/nvmf_internal.h | 9 +++++++ lib/nvmf/transport.c | 55 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index a3ab3f295..45d4e544d 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -382,6 +382,15 @@ void spdk_nvmf_request_exec(struct spdk_nvmf_request *req); int spdk_nvmf_request_free(struct spdk_nvmf_request *req); int spdk_nvmf_request_complete(struct spdk_nvmf_request *req); +void spdk_nvmf_request_free_buffers(struct spdk_nvmf_request *req, + struct spdk_nvmf_transport_poll_group *group, + struct spdk_nvmf_transport *transport, + uint32_t num_buffers); +int spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req, + struct spdk_nvmf_transport_poll_group *group, + struct spdk_nvmf_transport *transport, + uint32_t num_buffers); + bool spdk_nvmf_request_get_dif_ctx(struct spdk_nvmf_request *req, struct spdk_dif_ctx *dif_ctx); void spdk_nvmf_get_discovery_log_page(struct spdk_nvmf_tgt *tgt, const char *hostnqn, diff --git a/lib/nvmf/transport.c b/lib/nvmf/transport.c index 6b6fd3902..ab1c3c596 100644 --- a/lib/nvmf/transport.c +++ b/lib/nvmf/transport.c @@ -359,3 +359,58 @@ spdk_nvmf_transport_poll_group_free_stat(struct spdk_nvmf_transport *transport, transport->ops->poll_group_free_stat(stat); } } + +void +spdk_nvmf_request_free_buffers(struct spdk_nvmf_request *req, + struct spdk_nvmf_transport_poll_group *group, + struct spdk_nvmf_transport *transport, + uint32_t num_buffers) +{ + uint32_t i; + + for (i = 0; i < num_buffers; i++) { + if (group->buf_cache_count < group->buf_cache_size) { + STAILQ_INSERT_HEAD(&group->buf_cache, + (struct spdk_nvmf_transport_pg_cache_buf *)req->buffers[i], + link); + group->buf_cache_count++; + } else { + spdk_mempool_put(transport->data_buf_pool, req->buffers[i]); + } + req->iov[i].iov_base = NULL; + req->buffers[i] = NULL; + req->iov[i].iov_len = 0; + } + req->data_from_pool = false; +} + +int +spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req, + struct spdk_nvmf_transport_poll_group *group, + struct spdk_nvmf_transport *transport, + uint32_t num_buffers) +{ + uint32_t i = 0; + + while (i < num_buffers) { + if (!(STAILQ_EMPTY(&group->buf_cache))) { + group->buf_cache_count--; + req->buffers[i] = STAILQ_FIRST(&group->buf_cache); + STAILQ_REMOVE_HEAD(&group->buf_cache, link); + assert(req->buffers[i] != NULL); + i++; + } else { + if (spdk_mempool_get_bulk(transport->data_buf_pool, &req->buffers[i], + num_buffers - i)) { + goto err_exit; + } + i += num_buffers - i; + } + } + + return 0; + +err_exit: + spdk_nvmf_request_free_buffers(req, group, transport, i); + return -ENOMEM; +}