• Jan Kara's avatar
    direct-io: fix boundary block handling · 092c8d46
    Jan Kara authored
    When we read/write a file sequentially, we will read/write not only the
    data blocks but also the indirect blocks that may not be physically
    adjacent to the data blocks.  So filesystems set the BH_Boundary flag to
    submit the previous I/O before reading/writing an indirect block.
    However the generic direct IO code mishandles buffer_boundary(), setting
    sdio->boundary before each submit_page_section() call which results in
    sending only one page bios as underlying code thinks this page is the last
    in the contiguous extent.  So fix the problem by setting sdio->boundary
    only if the current page is really the last one in the mapped extent.
    With this patch and "direct-io: submit bio after boundary buffer is added
    to it" I've measured about 10% throughput improvement of direct IO reads
    on ext3 with SATA harddrive (from 90 MB/s to 100 MB/s).  With ramdisk, the
    improvement was about 3-fold (from 350 MB/s to 1.2 GB/s).  For other
    filesystems (such as ext4), the improvements won't be as visible because
    the frequency of BH_Boundary flag being set is much smaller.
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Reported-by: default avatarKazuya Mio <k-mio@sx.jp.nec.com>
    Tested-by: default avatarKazuya Mio <k-mio@sx.jp.nec.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
direct-io.c 37.4 KB