lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 0883/1157] block/bio: remove duplicate append pages code
    Date
    From: Keith Busch <kbusch@kernel.org>

    [ Upstream commit c58c0074c54c2e2bb3bb0d5a4d8896bb660cc8bc ]

    The getting pages setup for zone append and normal IO are identical. Use
    common code for each.

    Signed-off-by: Keith Busch <kbusch@kernel.org>
    Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Link: https://lore.kernel.org/r/20220610195830.3574005-3-kbusch@fb.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    block/bio.c | 102 ++++++++++++++++++++++------------------------------
    1 file changed, 42 insertions(+), 60 deletions(-)

    diff --git a/block/bio.c b/block/bio.c
    index d9ff51fc457e..ee5fe1bb015e 100644
    --- a/block/bio.c
    +++ b/block/bio.c
    @@ -1159,6 +1159,37 @@ static void bio_put_pages(struct page **pages, size_t size, size_t off)
    put_page(pages[i]);
    }

    +static int bio_iov_add_page(struct bio *bio, struct page *page,
    + unsigned int len, unsigned int offset)
    +{
    + bool same_page = false;
    +
    + if (!__bio_try_merge_page(bio, page, len, offset, &same_page)) {
    + if (WARN_ON_ONCE(bio_full(bio, len)))
    + return -EINVAL;
    + __bio_add_page(bio, page, len, offset);
    + return 0;
    + }
    +
    + if (same_page)
    + put_page(page);
    + return 0;
    +}
    +
    +static int bio_iov_add_zone_append_page(struct bio *bio, struct page *page,
    + unsigned int len, unsigned int offset)
    +{
    + struct request_queue *q = bdev_get_queue(bio->bi_bdev);
    + bool same_page = false;
    +
    + if (bio_add_hw_page(q, bio, page, len, offset,
    + queue_max_zone_append_sectors(q), &same_page) != len)
    + return -EINVAL;
    + if (same_page)
    + put_page(page);
    + return 0;
    +}
    +
    #define PAGE_PTRS_PER_BVEC (sizeof(struct bio_vec) / sizeof(struct page *))

    /**
    @@ -1177,7 +1208,6 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
    unsigned short entries_left = bio->bi_max_vecs - bio->bi_vcnt;
    struct bio_vec *bv = bio->bi_io_vec + bio->bi_vcnt;
    struct page **pages = (struct page **)bv;
    - bool same_page = false;
    ssize_t size, left;
    unsigned len, i;
    size_t offset;
    @@ -1186,7 +1216,7 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
    * Move page array up in the allocated memory for the bio vecs as far as
    * possible so that we can start filling biovecs from the beginning
    * without overwriting the temporary page array.
    - */
    + */
    BUILD_BUG_ON(PAGE_PTRS_PER_BVEC < 2);
    pages += entries_left * (PAGE_PTRS_PER_BVEC - 1);

    @@ -1196,18 +1226,18 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)

    for (left = size, i = 0; left > 0; left -= len, i++) {
    struct page *page = pages[i];
    + int ret;

    len = min_t(size_t, PAGE_SIZE - offset, left);
    + if (bio_op(bio) == REQ_OP_ZONE_APPEND)
    + ret = bio_iov_add_zone_append_page(bio, page, len,
    + offset);
    + else
    + ret = bio_iov_add_page(bio, page, len, offset);

    - if (__bio_try_merge_page(bio, page, len, offset, &same_page)) {
    - if (same_page)
    - put_page(page);
    - } else {
    - if (WARN_ON_ONCE(bio_full(bio, len))) {
    - bio_put_pages(pages + i, left, offset);
    - return -EINVAL;
    - }
    - __bio_add_page(bio, page, len, offset);
    + if (ret) {
    + bio_put_pages(pages + i, left, offset);
    + return ret;
    }
    offset = 0;
    }
    @@ -1216,51 +1246,6 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
    return 0;
    }

    -static int __bio_iov_append_get_pages(struct bio *bio, struct iov_iter *iter)
    -{
    - unsigned short nr_pages = bio->bi_max_vecs - bio->bi_vcnt;
    - unsigned short entries_left = bio->bi_max_vecs - bio->bi_vcnt;
    - struct request_queue *q = bdev_get_queue(bio->bi_bdev);
    - unsigned int max_append_sectors = queue_max_zone_append_sectors(q);
    - struct bio_vec *bv = bio->bi_io_vec + bio->bi_vcnt;
    - struct page **pages = (struct page **)bv;
    - ssize_t size, left;
    - unsigned len, i;
    - size_t offset;
    - int ret = 0;
    -
    - /*
    - * Move page array up in the allocated memory for the bio vecs as far as
    - * possible so that we can start filling biovecs from the beginning
    - * without overwriting the temporary page array.
    - */
    - BUILD_BUG_ON(PAGE_PTRS_PER_BVEC < 2);
    - pages += entries_left * (PAGE_PTRS_PER_BVEC - 1);
    -
    - size = iov_iter_get_pages(iter, pages, LONG_MAX, nr_pages, &offset);
    - if (unlikely(size <= 0))
    - return size ? size : -EFAULT;
    -
    - for (left = size, i = 0; left > 0; left -= len, i++) {
    - struct page *page = pages[i];
    - bool same_page = false;
    -
    - len = min_t(size_t, PAGE_SIZE - offset, left);
    - if (bio_add_hw_page(q, bio, page, len, offset,
    - max_append_sectors, &same_page) != len) {
    - bio_put_pages(pages + i, left, offset);
    - ret = -EINVAL;
    - break;
    - }
    - if (same_page)
    - put_page(page);
    - offset = 0;
    - }
    -
    - iov_iter_advance(iter, size - left);
    - return ret;
    -}
    -
    /**
    * bio_iov_iter_get_pages - add user or kernel pages to a bio
    * @bio: bio to add pages to
    @@ -1295,10 +1280,7 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
    }

    do {
    - if (bio_op(bio) == REQ_OP_ZONE_APPEND)
    - ret = __bio_iov_append_get_pages(bio, iter);
    - else
    - ret = __bio_iov_iter_get_pages(bio, iter);
    + ret = __bio_iov_iter_get_pages(bio, iter);
    } while (!ret && iov_iter_count(iter) && !bio_full(bio, 0));

    /* don't account direct I/O as memory stall */
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-09-17 16:27    [W:2.204 / U:3.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site