diff mbox series

[1/8] block: tidy up the bio full checks in bio_add_hw_page

Message ID 20230512133901.1053543-2-hch@lst.de (mailing list archive)
State New, archived
Headers show
Series [1/8] block: tidy up the bio full checks in bio_add_hw_page | expand

Commit Message

Christoph Hellwig May 12, 2023, 1:38 p.m. UTC
bio_add_hw_page already checks if the number of bytes trying to be added
even fit into max_hw_sectors limit of the queue.   Remove the call to
bio_full and just do a check for the smaller of the number of segments
in the bio and the queue max segments limit, and do this cheap check
before the more expensive gap to previous check.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 block/bio.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

Comments

Jinyoung Choi May 17, 2023, 7:18 a.m. UTC | #1
Hi, Christoph.

>@@ -1014,6 +1014,10 @@ int bio_add_hw_page(struct request_queue *q, struct bio *bio,
>                 if (bio_try_merge_hw_seg(q, bio, page, len, offset, same_page))
>                         return len;

>+                if (bio->bi_vcnt >=
>+                    min(bio->bi_max_vecs, queue_max_segments(q)))
>+                        return 0;
>+
>                 /*
>                  * If the queue doesn't support SG gaps and adding this segment
>                  * would create a gap, disallow it.
>@@ -1023,12 +1027,6 @@ int bio_add_hw_page(struct request_queue *q, struct bio *bio,
>                         return 0;
>         }

>-        if (bio_full(bio, len))
>-                return 0;
>-
>-        if (bio->bi_vcnt >= queue_max_segments(q))
>-                return 0;
>-
>         bvec_set_page(&bio->bi_io_vec[bio->bi_vcnt], page, len, offset);
>         bio->bi_vcnt++;
>         bio->bi_iter.bi_size += len;
>-- 
>2.39.2

If the wrong bi_max_vecs is set in bio_init(e.g. bi_max_vec = 0),
I think we need a code to defend against page_add.
If modified in this way, it may be added to bvec normally and
cause inconsistency in the information of bio.

Best Regards,
Jinyoung.
diff mbox series

Patch

diff --git a/block/bio.c b/block/bio.c
index 043944fd46ebbc..1528ca0f3df6dc 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1014,6 +1014,10 @@  int bio_add_hw_page(struct request_queue *q, struct bio *bio,
 		if (bio_try_merge_hw_seg(q, bio, page, len, offset, same_page))
 			return len;
 
+		if (bio->bi_vcnt >=
+		    min(bio->bi_max_vecs, queue_max_segments(q)))
+			return 0;
+
 		/*
 		 * If the queue doesn't support SG gaps and adding this segment
 		 * would create a gap, disallow it.
@@ -1023,12 +1027,6 @@  int bio_add_hw_page(struct request_queue *q, struct bio *bio,
 			return 0;
 	}
 
-	if (bio_full(bio, len))
-		return 0;
-
-	if (bio->bi_vcnt >= queue_max_segments(q))
-		return 0;
-
 	bvec_set_page(&bio->bi_io_vec[bio->bi_vcnt], page, len, offset);
 	bio->bi_vcnt++;
 	bio->bi_iter.bi_size += len;