lkml.org 
[lkml]   [2009]   [Apr]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 41/58] block: revert part of 18ce3751ccd488c78d3827e9f6bf54e6322676fb
    2.6.27-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Jens Axboe <jens.axboe@oracle.com>

    commit 78f707bfc723552e8309b7c38a8d0cc51012e813 upstream.

    The above commit added WRITE_SYNC and switched various places to using
    that for committing writes that will be waited upon immediately after
    submission. However, this causes a performance regression with AS and CFQ
    for ext3 at least, since sync_dirty_buffer() will submit some writes with
    WRITE_SYNC while ext3 has sumitted others dependent writes without the sync
    flag set. This causes excessive anticipation/idling in the IO scheduler
    because sync and async writes get interleaved, causing a big performance
    regression for the below test case (which is meant to simulate sqlite
    like behaviour).

    ---- test case ----

    int main(int argc, char **argv)
    {

    int fdes, i;
    FILE *fp;
    struct timeval start;
    struct timeval end;
    struct timeval res;

    gettimeofday(&start, NULL);
    for (i=0; i<ROWS; i++) {
    fp = fopen("test_file", "a");
    fprintf(fp, "Some Text Data\n");
    fdes = fileno(fp);
    fsync(fdes);
    fclose(fp);
    }
    gettimeofday(&end, NULL);

    timersub(&end, &start, &res);
    fprintf(stdout, "time to write %d lines is %ld(msec)\n", ROWS,
    (res.tv_sec*1000000 + res.tv_usec)/1000);

    return 0;
    }

    -------------------

    Thanks to Sean.White@APCC.com for tracking down this performance
    regression and providing a test case.

    Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    fs/buffer.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/fs/buffer.c
    +++ b/fs/buffer.c
    @@ -3042,7 +3042,7 @@ int sync_dirty_buffer(struct buffer_head
    if (test_clear_buffer_dirty(bh)) {
    get_bh(bh);
    bh->b_end_io = end_buffer_write_sync;
    - ret = submit_bh(WRITE_SYNC, bh);
    + ret = submit_bh(WRITE, bh);
    wait_on_buffer(bh);
    if (buffer_eopnotsupp(bh)) {
    clear_buffer_eopnotsupp(bh);



    \
     
     \ /
      Last update: 2009-04-30 00:39    [W:0.022 / U:148.272 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site