Commit 38c8e618 authored by Miquel van Smoorenburg's avatar Miquel van Smoorenburg Committed by Linus Torvalds

do_mpage_readpage(): don't submit lots of small bios on boundary

While tracing I/O patterns with blktrace (a great tool) a few weeks ago I
identified a minor issue in fs/mpage.c

As the comment above mpage_readpages() says, a fs's get_block function
will set BH_Boundary when it maps a block just before a block for which
extra I/O is required.

Since get_block() can map a range of pages, for all these pages the
BH_Boundary flag will be set.  But we only need to push what I/O we have
accumulated at the last block of this range.

This makes do_mpage_readpage() send out the largest possible bio instead
of a bunch of page-sized ones in the BH_Boundary case.
Signed-off-by: default avatarMiquel van Smoorenburg <mikevs@xs4all.net>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 75aa1994
...@@ -308,7 +308,10 @@ do_mpage_readpage(struct bio *bio, struct page *page, unsigned nr_pages, ...@@ -308,7 +308,10 @@ do_mpage_readpage(struct bio *bio, struct page *page, unsigned nr_pages,
goto alloc_new; goto alloc_new;
} }
if (buffer_boundary(map_bh) || (first_hole != blocks_per_page)) relative_block = block_in_file - *first_logical_block;
nblocks = map_bh->b_size >> blkbits;
if ((buffer_boundary(map_bh) && relative_block == nblocks) ||
(first_hole != blocks_per_page))
bio = mpage_bio_submit(READ, bio); bio = mpage_bio_submit(READ, bio);
else else
*last_block_in_bio = blocks[blocks_per_page - 1]; *last_block_in_bio = blocks[blocks_per_page - 1];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment