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; +}