xfs: plug directory buffer readahead
authorDave Chinner <dchinner@redhat.com>
Thu, 27 Jun 2013 06:04:47 +0000 (16:04 +1000)
committerBen Myers <bpm@sgi.com>
Thu, 27 Jun 2013 18:27:24 +0000 (13:27 -0500)
Similar to bulkstat inode chunk readahead, we need to plug directory
data buffer readahead during getdents to ensure that we can merge
adjacent readahead requests and sort out of order requests optimally
before they are dispatched. This improves the readahead efficiency
and reduces the IO load it generates as the IO patterns are
significantly better for both contiguous and fragmented directories.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Mark Tinguely <tinguely@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
fs/xfs/xfs_dir2_leaf.c

index da71a1819d780cd35bd9817fd89deabd5feb3eb7..bb22aac9fc01afa7384ac4972ac868d5d51f2d09 100644 (file)
@@ -1108,6 +1108,7 @@ xfs_dir2_leaf_readbuf(
        struct xfs_mount        *mp = dp->i_mount;
        struct xfs_buf          *bp = *bpp;
        struct xfs_bmbt_irec    *map = mip->map;
+       struct blk_plug         plug;
        int                     error = 0;
        int                     length;
        int                     i;
@@ -1236,6 +1237,7 @@ xfs_dir2_leaf_readbuf(
        /*
         * Do we need more readahead?
         */
+       blk_start_plug(&plug);
        for (mip->ra_index = mip->ra_offset = i = 0;
             mip->ra_want > mip->ra_current && i < mip->map_blocks;
             i += mp->m_dirblkfsbs) {
@@ -1287,6 +1289,7 @@ xfs_dir2_leaf_readbuf(
                        }
                }
        }
+       blk_finish_plug(&plug);
 
 out:
        *bpp = bp;