Skip to contentSkip to conversation

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

PATCH New Miquel van Smoorenburg 1 participant 1 message Oct 23, 2008 VFS

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 do_mpage_readpage: don't submit lots of small bios on boundary

(not really sure who to put in the Cc list here)

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

[PATCH] do_mpage_readpage: don't submit lots of small bios on boundary

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.

fs/mpage.c +4 -1
diff -ruN linux-2.6.26.5.orig/fs/mpage.c linux-2.6.26.5/fs/mpage.c
@@ -307,7 +307,10 @@
 		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);
 	else
 		*last_block_in_bio = blocks[blocks_per_page - 1];