• Mingming Cao's avatar
    [PATCH] ext3_get_blocks: Mapping multiple blocks at a once · 89747d36
    Mingming Cao authored
    Currently ext3_get_block() only maps or allocates one block at a time.  This
    is quite inefficient for sequential IO workload.
    I have posted a early implements a simply multiple block map and allocation
    with current ext3.  The basic idea is allocating the 1st block in the existing
    way, and attempting to allocate the next adjacent blocks on a best effort
    basis.  More description about the implementation could be found here:
    The following the latest version of the patch: break the original patch into 5
    patches, re-worked some logicals, and fixed some bugs.  The break ups are:
     [patch 1] Adding map multiple blocks at a time in ext3_get_blocks()
     [patch 2] Extend ext3_get_blocks() to support multiple block allocation
     [patch 3] Implement multiple block allocation in ext3-try-to-allocate
     (called via ext3_new_block()).
     [patch 4] Proper accounting updates in ext3_new_blocks()
     [patch 5] Adjust reservation window size properly (by the given number
     of blocks to allocate) before block allocation to increase the
     possibility of allocating multiple blocks in a single call.
    Tests done so far includes fsx,tiobench and dbench.  The following numbers
    collected from Direct IO tests (1G file creation/read) shows the system time
    have been greatly reduced (more than 50% on my 8 cpu system) with the patches.
     1G file DIO write:
     	2.6.15		2.6.15+patches
     real    0m31.275s	0m31.161s
     user    0m0.000s	0m0.000s
     sys     0m3.384s	0m0.564s
     1G file DIO read:
     	2.6.15		2.6.15+patches
     real    0m30.733s	0m30.624s
     user    0m0.000s	0m0.004s
     sys     0m0.748s	0m0.380s
    Some previous test we did on buffered IO with using multiple blocks allocation
    and delayed allocation shows noticeable improvement on throughput and system
    This patch:
    Add support of mapping multiple blocks in one call.
    This is useful for DIO reads and re-writes (where blocks are already
    allocated), also is in line with Christoph's proposal of using getblocks() in
    mpage_readpage() or mpage_readpages().
    Signed-off-by: default avatarMingming Cao <cmm@us.ibm.com>
    Cc: Badari Pulavarty <pbadari@us.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>