diff options
| author | Christoph Hellwig <hch@lst.de> | 2025-05-12 06:23:54 +0200 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2025-05-13 12:09:32 -0600 |
| commit | 77fd359b6dfdba58f476d5c17097bab024af9467 (patch) | |
| tree | afdb4ff91f77371e22b9c0c5cb2bb6da063d1ace /block/blk.h | |
| parent | d1ba22ab2becc8bf84d466791b970905abe99b23 (diff) | |
block: remove the same_page output argument to bvec_try_merge_page
bvec_try_merge_page currently returns if the added page fragment is
within the same page as the last page in the last current bio_vec.
This information is used by __bio_iov_iter_get_pages so that we always
have a single folio pin per page even when the page is split over
multiple __bio_iov_iter_get_pages calls.
Threading this through the entire lowlevel add page to bio logic is
annoying and inefficient and leads to less code sharing than otherwise
possible. Instead add code to __bio_iov_iter_get_pages that checks if
the bio_vecs did not change and thus a merge into the last segment must
have happened, and if there is an offset into the page for the currently
added fragment, because if yes we must have already had a previous
fragment of the same page in the last bio_vec. While this is still a bit
ugly, it keeps the logic in the one place that needs it and allows for
more code sharing.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20250512042354.514329-1-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk.h')
| -rw-r--r-- | block/blk.h | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/block/blk.h b/block/blk.h index 21af4f0c4c00..4f9d64bf1f0e 100644 --- a/block/blk.h +++ b/block/blk.h @@ -103,8 +103,7 @@ struct bio_vec *bvec_alloc(mempool_t *pool, unsigned short *nr_vecs, void bvec_free(mempool_t *pool, struct bio_vec *bv, unsigned short nr_vecs); bool bvec_try_merge_hw_page(struct request_queue *q, struct bio_vec *bv, - struct page *page, unsigned len, unsigned offset, - bool *same_page); + struct page *page, unsigned len, unsigned offset); static inline bool biovec_phys_mergeable(struct request_queue *q, struct bio_vec *vec1, struct bio_vec *vec2) |
