* Re: [PATCH 2/2] iomap: simplify iomap_add_to_ioend
[not found] ` <20210720084320.184877-2-hch@lst.de>
@ 2021-07-20 12:10 ` Matthew Wilcox
2021-07-20 12:16 ` Christoph Hellwig
0 siblings, 1 reply; 2+ messages in thread
From: Matthew Wilcox @ 2021-07-20 12:10 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: linux-xfs, linux-fsdevel, linux-block
On Tue, Jul 20, 2021 at 10:43:20AM +0200, Christoph Hellwig wrote:
> Now that the outstanding writes are counted in bytes, there is no need
> to use the low-level __bio_try_merge_page API, we can switch back to
> always using bio_add_page and simply iomap_add_to_ioend again.
These two callers were the only external users of __bio_try_merge_page(),
so it can now be made static to block/bio.c.
From f3599f22b9e107c7a6cb0ace813ca505843316ce Mon Sep 17 00:00:00 2001
From: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Date: Tue, 20 Jul 2021 08:04:29 -0400
Subject: [PATCH] block: Make __bio_try_merge_page static
iomap was the only external user of __bio_try_merge_page(). Make it
static (and move it above a caller so it doesn't need to be declared
in advance).
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
block/bio.c | 77 ++++++++++++++++++++++-----------------------
include/linux/bio.h | 2 --
2 files changed, 38 insertions(+), 41 deletions(-)
diff --git a/block/bio.c b/block/bio.c
index 1fab762e079b..d36a4d3d3cd5 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -709,6 +709,44 @@ static inline bool page_is_mergeable(const struct bio_vec *bv,
return (bv->bv_page + bv_end / PAGE_SIZE) == (page + off / PAGE_SIZE);
}
+/**
+ * __bio_try_merge_page - try appending data to an existing bvec.
+ * @bio: destination bio
+ * @page: start page to add
+ * @len: length of the data to add
+ * @off: offset of the data relative to @page
+ * @same_page: return if the segment has been merged inside the same page
+ *
+ * Try to add the data at @page + @off to the last bvec of @bio. This is a
+ * useful optimisation for file systems with a block size smaller than the
+ * page size.
+ *
+ * Warn if (@len, @off) crosses pages in case that @same_page is true.
+ *
+ * Return %true on success or %false on failure.
+ */
+static bool __bio_try_merge_page(struct bio *bio, struct page *page,
+ unsigned int len, unsigned int off, bool *same_page)
+{
+ if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED)))
+ return false;
+
+ if (bio->bi_vcnt > 0) {
+ struct bio_vec *bv = &bio->bi_io_vec[bio->bi_vcnt - 1];
+
+ if (page_is_mergeable(bv, page, len, off, same_page)) {
+ if (bio->bi_iter.bi_size > UINT_MAX - len) {
+ *same_page = false;
+ return false;
+ }
+ bv->bv_len += len;
+ bio->bi_iter.bi_size += len;
+ return true;
+ }
+ }
+ return false;
+}
+
/*
* Try to merge a page into a segment, while obeying the hardware segment
* size limit. This is not for normal read/write bios, but for passthrough
@@ -840,45 +878,6 @@ int bio_add_zone_append_page(struct bio *bio, struct page *page,
}
EXPORT_SYMBOL_GPL(bio_add_zone_append_page);
-/**
- * __bio_try_merge_page - try appending data to an existing bvec.
- * @bio: destination bio
- * @page: start page to add
- * @len: length of the data to add
- * @off: offset of the data relative to @page
- * @same_page: return if the segment has been merged inside the same page
- *
- * Try to add the data at @page + @off to the last bvec of @bio. This is a
- * useful optimisation for file systems with a block size smaller than the
- * page size.
- *
- * Warn if (@len, @off) crosses pages in case that @same_page is true.
- *
- * Return %true on success or %false on failure.
- */
-bool __bio_try_merge_page(struct bio *bio, struct page *page,
- unsigned int len, unsigned int off, bool *same_page)
-{
- if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED)))
- return false;
-
- if (bio->bi_vcnt > 0) {
- struct bio_vec *bv = &bio->bi_io_vec[bio->bi_vcnt - 1];
-
- if (page_is_mergeable(bv, page, len, off, same_page)) {
- if (bio->bi_iter.bi_size > UINT_MAX - len) {
- *same_page = false;
- return false;
- }
- bv->bv_len += len;
- bio->bi_iter.bi_size += len;
- return true;
- }
- }
- return false;
-}
-EXPORT_SYMBOL_GPL(__bio_try_merge_page);
-
/**
* __bio_add_page - add page(s) to a bio in a new segment
* @bio: destination bio
diff --git a/include/linux/bio.h b/include/linux/bio.h
index 2203b686e1f0..c779e0e3140a 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -467,8 +467,6 @@ extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *,
unsigned int, unsigned int);
int bio_add_zone_append_page(struct bio *bio, struct page *page,
unsigned int len, unsigned int offset);
-bool __bio_try_merge_page(struct bio *bio, struct page *page,
- unsigned int len, unsigned int off, bool *same_page);
void __bio_add_page(struct bio *bio, struct page *page,
unsigned int len, unsigned int off);
int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter);
--
2.30.2
^ permalink raw reply related [flat|nested] 2+ messages in thread