From: Bart Van Assche <bvanassche@acm.org>
To: Jens Axboe <axboe@kernel.dk>
Cc: linux-block@vger.kernel.org, Christoph Hellwig <hch@lst.de>,
Bart Van Assche <bvanassche@acm.org>,
Ming Lei <ming.lei@redhat.com>, Keith Busch <kbusch@kernel.org>
Subject: [PATCH 07/10] block: Add support for segments smaller than the page size
Date: Wed, 19 Oct 2022 15:23:21 -0700 [thread overview]
Message-ID: <20221019222324.362705-8-bvanassche@acm.org> (raw)
In-Reply-To: <20221019222324.362705-1-bvanassche@acm.org>
Add the necessary checks in the bio splitting code for splitting bios
into segments smaller than the page size.
Cc: Christoph Hellwig <hch@lst.de>
Cc: Ming Lei <ming.lei@redhat.com>
Cc: Keith Busch <kbusch@kernel.org>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
block/blk-merge.c | 6 ++++--
block/blk.h | 3 ++-
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/block/blk-merge.c b/block/blk-merge.c
index 35a8f75cc45d..7badfbed09fc 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -294,7 +294,8 @@ static struct bio *bio_split_rw(struct bio *bio, const struct queue_limits *lim,
if (nsegs < lim->max_segments &&
bytes + bv.bv_len <= max_bytes &&
bv.bv_offset + bv.bv_len <= PAGE_SIZE) {
- nsegs++;
+ /* single-page bvec optimization */
+ nsegs += blk_segments(lim, bv.bv_len);
bytes += bv.bv_len;
} else {
if (bvec_split_segs(lim, &bv, &nsegs, &bytes,
@@ -531,7 +532,8 @@ static int __blk_bios_map_sg(struct request_queue *q, struct bio *bio,
__blk_segment_map_sg_merge(q, &bvec, &bvprv, sg))
goto next_bvec;
- if (bvec.bv_offset + bvec.bv_len <= PAGE_SIZE)
+ if (bvec.bv_offset + bvec.bv_len <= PAGE_SIZE &&
+ bvec.bv_len <= q->limits.max_segment_size)
nsegs += __blk_bvec_map_sg(bvec, sglist, sg);
else
nsegs += blk_bvec_map_sg(q, &bvec, sglist, sg);
diff --git a/block/blk.h b/block/blk.h
index 342ba7d86e87..04328211ae3b 100644
--- a/block/blk.h
+++ b/block/blk.h
@@ -312,7 +312,7 @@ static inline bool bio_may_exceed_limits(struct bio *bio,
}
/*
- * All drivers must accept single-segments bios that are <= PAGE_SIZE.
+ * Check whether bio splitting should be performed.
* This is a quick and dirty check that relies on the fact that
* bi_io_vec[0] is always valid if a bio has data. The check might
* lead to occasional false negatives when bios are cloned, but compared
@@ -320,6 +320,7 @@ static inline bool bio_may_exceed_limits(struct bio *bio,
* doesn't matter anyway.
*/
return lim->chunk_sectors || bio->bi_vcnt != 1 ||
+ bio->bi_io_vec->bv_len > lim->max_segment_size ||
bio->bi_io_vec->bv_len + bio->bi_io_vec->bv_offset > PAGE_SIZE;
}
next prev parent reply other threads:[~2022-10-19 22:24 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-19 22:23 [PATCH 00/10] Support DMA segments smaller than the page size Bart Van Assche
2022-10-19 22:23 ` [PATCH 01/10] block: Remove request.write_hint Bart Van Assche
2022-10-21 1:59 ` Ming Lei
2022-10-19 22:23 ` [PATCH 02/10] block: Constify most queue limits pointers Bart Van Assche
2022-10-21 2:01 ` Ming Lei
2022-10-19 22:23 ` [PATCH 03/10] block: Micro-optimize get_max_segment_size() Bart Van Assche
2022-10-21 2:17 ` Ming Lei
2022-10-19 22:23 ` [PATCH 04/10] block: Add support for small segments in blk_rq_map_user_iov() Bart Van Assche
2022-10-19 22:23 ` [PATCH 05/10] block: Introduce QUEUE_FLAG_SUB_PAGE_SEGMENTS Bart Van Assche
2022-10-19 22:23 ` [PATCH 06/10] block: Fix the number of segment calculations Bart Van Assche
2022-11-01 17:23 ` Bart Van Assche
2022-11-02 1:22 ` Ming Lei
2022-11-03 19:32 ` Bart Van Assche
2022-10-19 22:23 ` Bart Van Assche [this message]
2022-10-19 22:23 ` [PATCH 08/10] scsi: core: Set the SUB_PAGE_SEGMENTS request queue flag Bart Van Assche
2022-10-19 22:23 ` [PATCH 09/10] scsi_debug: Support configuring the maximum segment size Bart Van Assche
2022-10-19 22:23 ` [PATCH 10/10] null_blk: " Bart Van Assche
2022-10-20 23:13 ` Damien Le Moal
2022-10-20 23:34 ` Bart Van Assche
2022-10-20 23:39 ` Damien Le Moal
2022-10-21 0:39 ` Bart Van Assche
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221019222324.362705-8-bvanassche@acm.org \
--to=bvanassche@acm.org \
--cc=axboe@kernel.dk \
--cc=hch@lst.de \
--cc=kbusch@kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=ming.lei@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.