Commit cbb2864a authored by Dave Chinner's avatar Dave Chinner Committed by Ben Myers

xfs: add pluging for bulkstat readahead

I was running some tests on bulkstat on CRC enabled filesystems when
I noticed that all the IO being issued was 8k in size, regardless of
the fact taht we are issuing sequential 8k buffers for inodes
clusters. The IO size should be 16k for 256 byte inodes, and 32k for
512 byte inodes, but this wasn't happening.

blktrace showed that there was an explict plug and unplug happening
around each readahead IO from _xfs_buf_ioapply, and the unplug was
causing the IO to be issued immediately. Hence no opportunity was
being given to the elevator to merge adjacent readahead requests and
dispatch them as a single IO.

Add plugging around the inode chunk readahead dispatch loop in
bulkstat to ensure that we don't unplug the queue between adjacent
inode buffer readahead IOs and so we get fewer, larger IO requests
hitting the storage subsystem for bulkstat.
Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarMark Tinguely <tinguely@sgi.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent 80a40498
...@@ -383,11 +383,13 @@ xfs_bulkstat( ...@@ -383,11 +383,13 @@ xfs_bulkstat(
* Also start read-ahead now for this chunk. * Also start read-ahead now for this chunk.
*/ */
if (r.ir_freecount < XFS_INODES_PER_CHUNK) { if (r.ir_freecount < XFS_INODES_PER_CHUNK) {
struct blk_plug plug;
/* /*
* Loop over all clusters in the next chunk. * Loop over all clusters in the next chunk.
* Do a readahead if there are any allocated * Do a readahead if there are any allocated
* inodes in that cluster. * inodes in that cluster.
*/ */
blk_start_plug(&plug);
agbno = XFS_AGINO_TO_AGBNO(mp, r.ir_startino); agbno = XFS_AGINO_TO_AGBNO(mp, r.ir_startino);
for (chunkidx = 0; for (chunkidx = 0;
chunkidx < XFS_INODES_PER_CHUNK; chunkidx < XFS_INODES_PER_CHUNK;
...@@ -399,6 +401,7 @@ xfs_bulkstat( ...@@ -399,6 +401,7 @@ xfs_bulkstat(
agbno, nbcluster, agbno, nbcluster,
&xfs_inode_buf_ops); &xfs_inode_buf_ops);
} }
blk_finish_plug(&plug);
irbp->ir_startino = r.ir_startino; irbp->ir_startino = r.ir_startino;
irbp->ir_freecount = r.ir_freecount; irbp->ir_freecount = r.ir_freecount;
irbp->ir_free = r.ir_free; irbp->ir_free = r.ir_free;
......
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