diff --git a/lib/nvmf/fc.c b/lib/nvmf/fc.c index a90a5a23a..855649cd0 100644 --- a/lib/nvmf/fc.c +++ b/lib/nvmf/fc.c @@ -1483,7 +1483,7 @@ spdk_nvmf_fc_request_free(struct spdk_nvmf_fc_request *fc_req) /* Release IO buffers */ if (fc_req->req.data_from_pool) { - spdk_nvmf_request_free_buffers(&fc_req->req, group, transport, fc_req->req.iovcnt); + spdk_nvmf_request_free_buffers(&fc_req->req, group, transport); } fc_req->req.data = NULL; fc_req->req.iovcnt = 0; diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index 99b2f2d76..a212850bd 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -213,6 +213,7 @@ struct spdk_nvmf_request { union nvmf_h2c_msg *cmd; union nvmf_c2h_msg *rsp; void *buffers[NVMF_REQ_MAX_BUFFERS]; + uint32_t num_buffers; struct iovec iov[NVMF_REQ_MAX_BUFFERS]; uint32_t iovcnt; bool data_from_pool; @@ -385,8 +386,7 @@ 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); + struct spdk_nvmf_transport *transport); int spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req, struct spdk_nvmf_transport_poll_group *group, struct spdk_nvmf_transport *transport, diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 38d2d4cfd..ff798a9c0 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -1712,7 +1712,7 @@ spdk_nvmf_rdma_request_fill_iovs(struct spdk_nvmf_rdma_transport *rtransport, return rc; err_exit: - spdk_nvmf_request_free_buffers(req, &rgroup->group, &rtransport->transport, num_buffers); + spdk_nvmf_request_free_buffers(req, &rgroup->group, &rtransport->transport); memset(wr->sg_list, 0, sizeof(wr->sg_list[0]) * wr->num_sge); wr->num_sge = 0; req->iovcnt = 0; @@ -1813,7 +1813,7 @@ nvmf_rdma_request_fill_iovs_multi_sgl(struct spdk_nvmf_rdma_transport *rtranspor return 0; err_exit: - spdk_nvmf_request_free_buffers(req, &rgroup->group, &rtransport->transport, num_buffers); + spdk_nvmf_request_free_buffers(req, &rgroup->group, &rtransport->transport); nvmf_rdma_request_free_data(rdma_req, rtransport); return rc; } @@ -1962,8 +1962,7 @@ nvmf_rdma_request_free(struct spdk_nvmf_rdma_request *rdma_req, if (rdma_req->req.data_from_pool) { rgroup = rqpair->poller->group; - spdk_nvmf_request_free_buffers(&rdma_req->req, &rgroup->group, &rtransport->transport, - rdma_req->req.iovcnt); + spdk_nvmf_request_free_buffers(&rdma_req->req, &rgroup->group, &rtransport->transport); } nvmf_rdma_request_free_data(rdma_req, rtransport); rdma_req->req.length = 0; diff --git a/lib/nvmf/tcp.c b/lib/nvmf/tcp.c index b37417b48..794f3591e 100644 --- a/lib/nvmf/tcp.c +++ b/lib/nvmf/tcp.c @@ -2677,8 +2677,7 @@ spdk_nvmf_tcp_req_process(struct spdk_nvmf_tcp_transport *ttransport, case TCP_REQUEST_STATE_COMPLETED: spdk_trace_record(TRACE_TCP_REQUEST_STATE_COMPLETED, 0, 0, (uintptr_t)tcp_req, 0); if (tcp_req->req.data_from_pool) { - spdk_nvmf_request_free_buffers(&tcp_req->req, group, &ttransport->transport, - tcp_req->req.iovcnt); + spdk_nvmf_request_free_buffers(&tcp_req->req, group, &ttransport->transport); } tcp_req->req.length = 0; tcp_req->req.iovcnt = 0; diff --git a/lib/nvmf/transport.c b/lib/nvmf/transport.c index d7856502c..3f852a350 100644 --- a/lib/nvmf/transport.c +++ b/lib/nvmf/transport.c @@ -368,12 +368,11 @@ spdk_nvmf_transport_poll_group_free_stat(struct spdk_nvmf_transport *transport, 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) + struct spdk_nvmf_transport *transport) { uint32_t i; - for (i = 0; i < num_buffers; i++) { + for (i = 0; i < req->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], @@ -386,6 +385,7 @@ spdk_nvmf_request_free_buffers(struct spdk_nvmf_request *req, req->buffers[i] = NULL; req->iov[i].iov_len = 0; } + req->num_buffers = 0; req->data_from_pool = false; } @@ -400,15 +400,18 @@ spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req, while (i < num_buffers) { if (!(STAILQ_EMPTY(&group->buf_cache))) { group->buf_cache_count--; - req->buffers[i] = STAILQ_FIRST(&group->buf_cache); + req->buffers[req->num_buffers] = STAILQ_FIRST(&group->buf_cache); STAILQ_REMOVE_HEAD(&group->buf_cache, link); - assert(req->buffers[i] != NULL); + assert(req->buffers[req->num_buffers] != NULL); + req->num_buffers++; i++; } else { - if (spdk_mempool_get_bulk(transport->data_buf_pool, &req->buffers[i], + if (spdk_mempool_get_bulk(transport->data_buf_pool, + &req->buffers[req->num_buffers], num_buffers - i)) { goto err_exit; } + req->num_buffers += num_buffers - i; i += num_buffers - i; } } @@ -416,6 +419,6 @@ spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req, return 0; err_exit: - spdk_nvmf_request_free_buffers(req, group, transport, i); + spdk_nvmf_request_free_buffers(req, group, transport); return -ENOMEM; } diff --git a/test/unit/lib/nvmf/rdma.c/rdma_ut.c b/test/unit/lib/nvmf/rdma.c/rdma_ut.c index 6ebcd8127..4d8dc4a04 100644 --- a/test/unit/lib/nvmf/rdma.c/rdma_ut.c +++ b/test/unit/lib/nvmf/rdma.c/rdma_ut.c @@ -82,12 +82,11 @@ DEFINE_STUB(spdk_nvmf_request_get_dif_ctx, bool, (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) + struct spdk_nvmf_transport *transport) { uint32_t i; - for (i = 0; i < num_buffers; i++) { + for (i = 0; i < req->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], @@ -100,6 +99,7 @@ spdk_nvmf_request_free_buffers(struct spdk_nvmf_request *req, req->buffers[i] = NULL; req->iov[i].iov_len = 0; } + req->num_buffers = 0; req->data_from_pool = false; } @@ -114,14 +114,17 @@ spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req, while (i < num_buffers) { if (!(STAILQ_EMPTY(&group->buf_cache))) { group->buf_cache_count--; - req->buffers[i] = STAILQ_FIRST(&group->buf_cache); + req->buffers[req->num_buffers] = STAILQ_FIRST(&group->buf_cache); STAILQ_REMOVE_HEAD(&group->buf_cache, link); + req->num_buffers++; i++; } else { - if (spdk_mempool_get_bulk(transport->data_buf_pool, &req->buffers[i], + if (spdk_mempool_get_bulk(transport->data_buf_pool, + &req->buffers[req->num_buffers], num_buffers - i)) { goto err_exit; } + req->num_buffers += num_buffers - i; i += num_buffers - i; } } @@ -129,7 +132,7 @@ spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req, return 0; err_exit: - spdk_nvmf_request_free_buffers(req, group, transport, i); + spdk_nvmf_request_free_buffers(req, group, transport); return -ENOMEM; } @@ -168,6 +171,8 @@ static void reset_nvmf_rdma_request(struct spdk_nvmf_rdma_request *rdma_req) rdma_req->data.wr.sg_list[i].length = 0; rdma_req->data.wr.sg_list[i].lkey = 0; } + rdma_req->req.iovcnt = 0; + rdma_req->req.num_buffers = 0; } static void diff --git a/test/unit/lib/nvmf/tcp.c/tcp_ut.c b/test/unit/lib/nvmf/tcp.c/tcp_ut.c index eacbccf79..75ec759de 100644 --- a/test/unit/lib/nvmf/tcp.c/tcp_ut.c +++ b/test/unit/lib/nvmf/tcp.c/tcp_ut.c @@ -175,7 +175,7 @@ DEFINE_STUB(spdk_nvmf_request_get_buffers, DEFINE_STUB_V(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)); + struct spdk_nvmf_transport *transport)); DEFINE_STUB(spdk_sock_get_optimal_sock_group, int,