Commit ecd7fba0 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

target/file: allocate the bvec array as part of struct target_core_file_cmd

This saves one memory allocation, and ensures the bvecs aren't freed
before the AIO completion.  This will allow the lower level code to be
optimized so that it can avoid allocating another bvec array.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Reviewed-by: default avatarMing Lei <ming.lei@redhat.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 0cf41e5e
...@@ -241,6 +241,7 @@ struct target_core_file_cmd { ...@@ -241,6 +241,7 @@ struct target_core_file_cmd {
unsigned long len; unsigned long len;
struct se_cmd *cmd; struct se_cmd *cmd;
struct kiocb iocb; struct kiocb iocb;
struct bio_vec bvecs[];
}; };
static void cmd_rw_aio_complete(struct kiocb *iocb, long ret, long ret2) static void cmd_rw_aio_complete(struct kiocb *iocb, long ret, long ret2)
...@@ -268,29 +269,22 @@ fd_execute_rw_aio(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, ...@@ -268,29 +269,22 @@ fd_execute_rw_aio(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
struct target_core_file_cmd *aio_cmd; struct target_core_file_cmd *aio_cmd;
struct iov_iter iter = {}; struct iov_iter iter = {};
struct scatterlist *sg; struct scatterlist *sg;
struct bio_vec *bvec;
ssize_t len = 0; ssize_t len = 0;
int ret = 0, i; int ret = 0, i;
aio_cmd = kmalloc(sizeof(struct target_core_file_cmd), GFP_KERNEL); aio_cmd = kmalloc(struct_size(aio_cmd, bvecs, sgl_nents), GFP_KERNEL);
if (!aio_cmd) if (!aio_cmd)
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
bvec = kcalloc(sgl_nents, sizeof(struct bio_vec), GFP_KERNEL);
if (!bvec) {
kfree(aio_cmd);
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
}
for_each_sg(sgl, sg, sgl_nents, i) { for_each_sg(sgl, sg, sgl_nents, i) {
bvec[i].bv_page = sg_page(sg); aio_cmd->bvecs[i].bv_page = sg_page(sg);
bvec[i].bv_len = sg->length; aio_cmd->bvecs[i].bv_len = sg->length;
bvec[i].bv_offset = sg->offset; aio_cmd->bvecs[i].bv_offset = sg->offset;
len += sg->length; len += sg->length;
} }
iov_iter_bvec(&iter, is_write, bvec, sgl_nents, len); iov_iter_bvec(&iter, is_write, aio_cmd->bvecs, sgl_nents, len);
aio_cmd->cmd = cmd; aio_cmd->cmd = cmd;
aio_cmd->len = len; aio_cmd->len = len;
...@@ -307,8 +301,6 @@ fd_execute_rw_aio(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, ...@@ -307,8 +301,6 @@ fd_execute_rw_aio(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
else else
ret = call_read_iter(file, &aio_cmd->iocb, &iter); ret = call_read_iter(file, &aio_cmd->iocb, &iter);
kfree(bvec);
if (ret != -EIOCBQUEUED) if (ret != -EIOCBQUEUED)
cmd_rw_aio_complete(&aio_cmd->iocb, ret, 0); cmd_rw_aio_complete(&aio_cmd->iocb, ret, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment