lkml.org 
[lkml]   [2021]   [Jan]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH v3 4/7] target/file: allocate the bvec array as part of struct target_core_file_cmd
    On Sat, Jan 09, 2021 at 04:03:00PM +0000, Pavel Begunkov wrote:
    > From: Christoph Hellwig <hch@lst.de>
    >
    > 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>
    > ---
    > drivers/target/target_core_file.c | 20 ++++++--------------
    > 1 file changed, 6 insertions(+), 14 deletions(-)
    >
    > diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c
    > index b0cb5b95e892..cce455929778 100644
    > --- a/drivers/target/target_core_file.c
    > +++ b/drivers/target/target_core_file.c
    > @@ -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);
    >
    > --
    > 2.24.0
    >

    Reviewed-by: Ming Lei <ming.lei@redhat.com>

    --
    Ming

    \
     
     \ /
      Last update: 2021-01-11 03:57    [W:5.123 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site