On 05/01/2021 19:43, Pavel Begunkov wrote: > blk_bio_segment_split() is very heavy, but the current fast path covers > only one-segment under PAGE_SIZE bios. Add another one by estimating an > upper bound of sectors a bio can contain. > > One restricting factor here is queue_max_segment_size(), which it > compare against full iter size to not dig into bvecs. By default it's > 64KB, and so for requests under 64KB, but for those falling under the > conditions it's much faster. > > Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> > --- > block/blk-merge.c | 29 +++++++++++++++++++++++++---- > 1 file changed, 25 insertions(+), 4 deletions(-) > [...] > > - return __blk_bio_segment_split(q, bio, bs, nr_segs); > + q_max_sectors = get_max_io_size(q, bio); > + if (!queue_virt_boundary(q) && bio_segs < queue_max_segments(q) && > + bio->bi_iter.bi_size <= queue_max_segment_size(q)) { I think I miss a seg_boundary_mask check here. Any insights how to skip it? Or why it's 2^31-1 by default, but not say ((unsigned long)-1)? -- Pavel Begunkov