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: Christoph Hellwig <hch@lst.de> Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Reviewed-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk> (cherry picked from commit ecd7fba0ade1d6d8d49d320df9caf96922a376b2) (cherry picked from commit 272d2ea22b0e3da786a506896e36d3a586e6c252) (cherry picked from commit 83ff0aa1cc08c329feb0748c575810b3ce8c0077) (cherry picked from commit d0dc27fcc3f57d556ce4468a060e54f25c7b91b0) (cherry picked from commit 847a30a99fc4b11c9e6cf2ec049ca20a6da9c769) (cherry picked from commit 3799ad215edeb9276c4d16150a33de916cfa4ea1) (cherry picked from commit ee8f417b3276049e4f0bbadf4c4524f071de2361)
This commit is contained in:
parent
f6172ea41b
commit
8ae63d0654
1 changed files with 6 additions and 14 deletions
|
@ -241,6 +241,7 @@ struct target_core_file_cmd {
|
|||
unsigned long len;
|
||||
struct se_cmd *cmd;
|
||||
struct kiocb iocb;
|
||||
struct bio_vec bvecs[];
|
||||
};
|
||||
|
||||
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,
|
|||
struct target_core_file_cmd *aio_cmd;
|
||||
struct iov_iter iter = {};
|
||||
struct scatterlist *sg;
|
||||
struct bio_vec *bvec;
|
||||
ssize_t len = 0;
|
||||
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)
|
||||
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) {
|
||||
bvec[i].bv_page = sg_page(sg);
|
||||
bvec[i].bv_len = sg->length;
|
||||
bvec[i].bv_offset = sg->offset;
|
||||
aio_cmd->bvecs[i].bv_page = sg_page(sg);
|
||||
aio_cmd->bvecs[i].bv_len = sg->length;
|
||||
aio_cmd->bvecs[i].bv_offset = sg->offset;
|
||||
|
||||
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->len = len;
|
||||
|
@ -307,8 +301,6 @@ fd_execute_rw_aio(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
|
|||
else
|
||||
ret = call_read_iter(file, &aio_cmd->iocb, &iter);
|
||||
|
||||
kfree(bvec);
|
||||
|
||||
if (ret != -EIOCBQUEUED)
|
||||
cmd_rw_aio_complete(&aio_cmd->iocb, ret, 0);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue