[lkml]   [2010]   [Mar]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[042/116] readahead: add blk_run_backing_dev
    2.6.32-stable review patch.  If anyone has any objections, please let us know.


    From: Hisashi Hifumi <>

    commit 65a80b4c61f5b5f6eb0f5669c8fb120893bfb388 upstream.

    I added blk_run_backing_dev on page_cache_async_readahead so readahead I/O
    is unpluged to improve throughput on especially RAID environment.

    The normal case is, if page N become uptodate at time T(N), then T(N) <=
    T(N+1) holds. With RAID (and NFS to some degree), there is no strict
    ordering, the data arrival time depends on runtime status of individual
    disks, which breaks that formula. So in do_generic_file_read(), just
    after submitting the async readahead IO request, the current page may well
    be uptodate, so the page won't be locked, and the block device won't be
    implicitly unplugged:

    if (PageReadahead(page))
    if (!PageUptodate(page))
    goto page_not_up_to_date;

    Therefore explicit unplugging can help.

    Following is the test result with dd.

    #dd if=testdir/testfile of=/dev/null bs=16384

    1048576+0 records in
    1048576+0 records out
    17179869184 bytes (17 GB) copied, 224.182 seconds, 76.6 MB/s

    1048576+0 records in
    1048576+0 records out
    17179869184 bytes (17 GB) copied, 206.465 seconds, 83.2 MB/s

    (7Disks RAID-0 Array)

    1054976+0 records in
    1054976+0 records out
    17284726784 bytes (17 GB) copied, 212.233 seconds, 81.4 MB/s

    1054976+0 records out
    17284726784 bytes (17 GB) copied, 198.878 seconds, 86.9 MB/s

    (7Disks RAID-5 Array)

    The patch was found to improve performance with the SCST scsi target
    driver. See

    [ unbust comment layout]
    [ "fix" CONFIG_BLOCK=n]
    Signed-off-by: Hisashi Hifumi <>
    Acked-by: Wu Fengguang <>
    Cc: Jens Axboe <>
    Cc: KOSAKI Motohiro <>
    Tested-by: Ronald <>
    Cc: Bart Van Assche <>
    Cc: Vladislav Bolkhovitin <>
    Cc: Randy Dunlap <>
    Signed-off-by: Andrew Morton <>
    Signed-off-by: Linus Torvalds <>
    Signed-off-by: Greg Kroah-Hartman <>

    mm/readahead.c | 12 ++++++++++++
    1 file changed, 12 insertions(+)

    --- a/mm/readahead.c
    +++ b/mm/readahead.c
    @@ -553,5 +553,17 @@ page_cache_async_readahead(struct addres

    /* do read-ahead */
    ondemand_readahead(mapping, ra, filp, true, offset, req_size);
    +#ifdef CONFIG_BLOCK
    + /*
    + * Normally the current page is !uptodate and lock_page() will be
    + * immediately called to implicitly unplug the device. However this
    + * is not always true for RAID conifgurations, where data arrives
    + * not strictly in their submission order. In this case we need to
    + * explicitly kick off the IO.
    + */
    + if (PageUptodate(page))
    + blk_run_backing_dev(mapping->backing_dev_info, NULL);

     \ /
      Last update: 2010-03-31 01:21    [W:5.325 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site