nvmf: Hold number of allocated buffers in struct spdk_nvmf_request
This patch makes multi SGL case possible to call spdk_nvmf_request_get_buffers() per WR. This patch has an unrelated fix to clear req->iovcnt in reset_nvmf_rdma_request() in UT. We can do the fix in a separate patch but include it in this patch because it is very small. Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Change-Id: If6e5af0505fb199c95ef5d0522b579242a7cef29 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/468942 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Alexey Marchuk <alexeymar@mellanox.com> Reviewed-by: Seth Howell <seth.howell@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
410455e40b
commit
79945ef0ed
@ -1483,7 +1483,7 @@ spdk_nvmf_fc_request_free(struct spdk_nvmf_fc_request *fc_req)
|
|||||||
|
|
||||||
/* Release IO buffers */
|
/* Release IO buffers */
|
||||||
if (fc_req->req.data_from_pool) {
|
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.data = NULL;
|
||||||
fc_req->req.iovcnt = 0;
|
fc_req->req.iovcnt = 0;
|
||||||
|
@ -213,6 +213,7 @@ struct spdk_nvmf_request {
|
|||||||
union nvmf_h2c_msg *cmd;
|
union nvmf_h2c_msg *cmd;
|
||||||
union nvmf_c2h_msg *rsp;
|
union nvmf_c2h_msg *rsp;
|
||||||
void *buffers[NVMF_REQ_MAX_BUFFERS];
|
void *buffers[NVMF_REQ_MAX_BUFFERS];
|
||||||
|
uint32_t num_buffers;
|
||||||
struct iovec iov[NVMF_REQ_MAX_BUFFERS];
|
struct iovec iov[NVMF_REQ_MAX_BUFFERS];
|
||||||
uint32_t iovcnt;
|
uint32_t iovcnt;
|
||||||
bool data_from_pool;
|
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,
|
void spdk_nvmf_request_free_buffers(struct spdk_nvmf_request *req,
|
||||||
struct spdk_nvmf_transport_poll_group *group,
|
struct spdk_nvmf_transport_poll_group *group,
|
||||||
struct spdk_nvmf_transport *transport,
|
struct spdk_nvmf_transport *transport);
|
||||||
uint32_t num_buffers);
|
|
||||||
int spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req,
|
int spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req,
|
||||||
struct spdk_nvmf_transport_poll_group *group,
|
struct spdk_nvmf_transport_poll_group *group,
|
||||||
struct spdk_nvmf_transport *transport,
|
struct spdk_nvmf_transport *transport,
|
||||||
|
@ -1712,7 +1712,7 @@ spdk_nvmf_rdma_request_fill_iovs(struct spdk_nvmf_rdma_transport *rtransport,
|
|||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
err_exit:
|
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);
|
memset(wr->sg_list, 0, sizeof(wr->sg_list[0]) * wr->num_sge);
|
||||||
wr->num_sge = 0;
|
wr->num_sge = 0;
|
||||||
req->iovcnt = 0;
|
req->iovcnt = 0;
|
||||||
@ -1813,7 +1813,7 @@ nvmf_rdma_request_fill_iovs_multi_sgl(struct spdk_nvmf_rdma_transport *rtranspor
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_exit:
|
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);
|
nvmf_rdma_request_free_data(rdma_req, rtransport);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -1962,8 +1962,7 @@ nvmf_rdma_request_free(struct spdk_nvmf_rdma_request *rdma_req,
|
|||||||
if (rdma_req->req.data_from_pool) {
|
if (rdma_req->req.data_from_pool) {
|
||||||
rgroup = rqpair->poller->group;
|
rgroup = rqpair->poller->group;
|
||||||
|
|
||||||
spdk_nvmf_request_free_buffers(&rdma_req->req, &rgroup->group, &rtransport->transport,
|
spdk_nvmf_request_free_buffers(&rdma_req->req, &rgroup->group, &rtransport->transport);
|
||||||
rdma_req->req.iovcnt);
|
|
||||||
}
|
}
|
||||||
nvmf_rdma_request_free_data(rdma_req, rtransport);
|
nvmf_rdma_request_free_data(rdma_req, rtransport);
|
||||||
rdma_req->req.length = 0;
|
rdma_req->req.length = 0;
|
||||||
|
@ -2677,8 +2677,7 @@ spdk_nvmf_tcp_req_process(struct spdk_nvmf_tcp_transport *ttransport,
|
|||||||
case TCP_REQUEST_STATE_COMPLETED:
|
case TCP_REQUEST_STATE_COMPLETED:
|
||||||
spdk_trace_record(TRACE_TCP_REQUEST_STATE_COMPLETED, 0, 0, (uintptr_t)tcp_req, 0);
|
spdk_trace_record(TRACE_TCP_REQUEST_STATE_COMPLETED, 0, 0, (uintptr_t)tcp_req, 0);
|
||||||
if (tcp_req->req.data_from_pool) {
|
if (tcp_req->req.data_from_pool) {
|
||||||
spdk_nvmf_request_free_buffers(&tcp_req->req, group, &ttransport->transport,
|
spdk_nvmf_request_free_buffers(&tcp_req->req, group, &ttransport->transport);
|
||||||
tcp_req->req.iovcnt);
|
|
||||||
}
|
}
|
||||||
tcp_req->req.length = 0;
|
tcp_req->req.length = 0;
|
||||||
tcp_req->req.iovcnt = 0;
|
tcp_req->req.iovcnt = 0;
|
||||||
|
@ -368,12 +368,11 @@ spdk_nvmf_transport_poll_group_free_stat(struct spdk_nvmf_transport *transport,
|
|||||||
void
|
void
|
||||||
spdk_nvmf_request_free_buffers(struct spdk_nvmf_request *req,
|
spdk_nvmf_request_free_buffers(struct spdk_nvmf_request *req,
|
||||||
struct spdk_nvmf_transport_poll_group *group,
|
struct spdk_nvmf_transport_poll_group *group,
|
||||||
struct spdk_nvmf_transport *transport,
|
struct spdk_nvmf_transport *transport)
|
||||||
uint32_t num_buffers)
|
|
||||||
{
|
{
|
||||||
uint32_t i;
|
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) {
|
if (group->buf_cache_count < group->buf_cache_size) {
|
||||||
STAILQ_INSERT_HEAD(&group->buf_cache,
|
STAILQ_INSERT_HEAD(&group->buf_cache,
|
||||||
(struct spdk_nvmf_transport_pg_cache_buf *)req->buffers[i],
|
(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->buffers[i] = NULL;
|
||||||
req->iov[i].iov_len = 0;
|
req->iov[i].iov_len = 0;
|
||||||
}
|
}
|
||||||
|
req->num_buffers = 0;
|
||||||
req->data_from_pool = false;
|
req->data_from_pool = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -400,15 +400,18 @@ spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req,
|
|||||||
while (i < num_buffers) {
|
while (i < num_buffers) {
|
||||||
if (!(STAILQ_EMPTY(&group->buf_cache))) {
|
if (!(STAILQ_EMPTY(&group->buf_cache))) {
|
||||||
group->buf_cache_count--;
|
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);
|
STAILQ_REMOVE_HEAD(&group->buf_cache, link);
|
||||||
assert(req->buffers[i] != NULL);
|
assert(req->buffers[req->num_buffers] != NULL);
|
||||||
|
req->num_buffers++;
|
||||||
i++;
|
i++;
|
||||||
} else {
|
} 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)) {
|
num_buffers - i)) {
|
||||||
goto err_exit;
|
goto err_exit;
|
||||||
}
|
}
|
||||||
|
req->num_buffers += num_buffers - i;
|
||||||
i += num_buffers - i;
|
i += num_buffers - i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -416,6 +419,6 @@ spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_exit:
|
err_exit:
|
||||||
spdk_nvmf_request_free_buffers(req, group, transport, i);
|
spdk_nvmf_request_free_buffers(req, group, transport);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
@ -82,12 +82,11 @@ DEFINE_STUB(spdk_nvmf_request_get_dif_ctx, bool, (struct spdk_nvmf_request *req,
|
|||||||
void
|
void
|
||||||
spdk_nvmf_request_free_buffers(struct spdk_nvmf_request *req,
|
spdk_nvmf_request_free_buffers(struct spdk_nvmf_request *req,
|
||||||
struct spdk_nvmf_transport_poll_group *group,
|
struct spdk_nvmf_transport_poll_group *group,
|
||||||
struct spdk_nvmf_transport *transport,
|
struct spdk_nvmf_transport *transport)
|
||||||
uint32_t num_buffers)
|
|
||||||
{
|
{
|
||||||
uint32_t i;
|
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) {
|
if (group->buf_cache_count < group->buf_cache_size) {
|
||||||
STAILQ_INSERT_HEAD(&group->buf_cache,
|
STAILQ_INSERT_HEAD(&group->buf_cache,
|
||||||
(struct spdk_nvmf_transport_pg_cache_buf *)req->buffers[i],
|
(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->buffers[i] = NULL;
|
||||||
req->iov[i].iov_len = 0;
|
req->iov[i].iov_len = 0;
|
||||||
}
|
}
|
||||||
|
req->num_buffers = 0;
|
||||||
req->data_from_pool = false;
|
req->data_from_pool = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,14 +114,17 @@ spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req,
|
|||||||
while (i < num_buffers) {
|
while (i < num_buffers) {
|
||||||
if (!(STAILQ_EMPTY(&group->buf_cache))) {
|
if (!(STAILQ_EMPTY(&group->buf_cache))) {
|
||||||
group->buf_cache_count--;
|
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);
|
STAILQ_REMOVE_HEAD(&group->buf_cache, link);
|
||||||
|
req->num_buffers++;
|
||||||
i++;
|
i++;
|
||||||
} else {
|
} 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)) {
|
num_buffers - i)) {
|
||||||
goto err_exit;
|
goto err_exit;
|
||||||
}
|
}
|
||||||
|
req->num_buffers += num_buffers - i;
|
||||||
i += num_buffers - i;
|
i += num_buffers - i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,7 +132,7 @@ spdk_nvmf_request_get_buffers(struct spdk_nvmf_request *req,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_exit:
|
err_exit:
|
||||||
spdk_nvmf_request_free_buffers(req, group, transport, i);
|
spdk_nvmf_request_free_buffers(req, group, transport);
|
||||||
return -ENOMEM;
|
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].length = 0;
|
||||||
rdma_req->data.wr.sg_list[i].lkey = 0;
|
rdma_req->data.wr.sg_list[i].lkey = 0;
|
||||||
}
|
}
|
||||||
|
rdma_req->req.iovcnt = 0;
|
||||||
|
rdma_req->req.num_buffers = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -175,7 +175,7 @@ DEFINE_STUB(spdk_nvmf_request_get_buffers,
|
|||||||
|
|
||||||
DEFINE_STUB_V(spdk_nvmf_request_free_buffers,
|
DEFINE_STUB_V(spdk_nvmf_request_free_buffers,
|
||||||
(struct spdk_nvmf_request *req, struct spdk_nvmf_transport_poll_group *group,
|
(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,
|
DEFINE_STUB(spdk_sock_get_optimal_sock_group,
|
||||||
int,
|
int,
|
||||||
|
Loading…
Reference in New Issue
Block a user