• Josef Bacik's avatar
    Btrfs: stop using write_one_page · 1728366e
    Josef Bacik authored
    While looking for a performance regression a user was complaining about, I
    noticed that we had a regression with the varmail test of filebench.  This was
    introduced by
    
    0d10ee2e
    
    which keeps us from calling writepages in writepage.  This is a correct change,
    however it happens to help the varmail test because we write out in larger
    chunks.  This is largly to do with how we write out dirty pages for each
    transaction.  If you run filebench with
    
    load varmail
    set $dir=/mnt/btrfs-test
    run 60
    
    prior to this patch you would get ~1420 ops/second, but with the patch you get
    ~1200 ops/second.  This is a 16% decrease.  So since we know the range of dirty
    pages we want to write out, don't write out in one page chunks, write out in
    ranges.  So to do this we call filemap_fdatawrite_range() on the range of bytes.
    Then we convert the DIRTY extents to NEED_WAIT extents.  When we then call
    btrfs_wait_marked_extents() we only have to filemap_fdatawait_range() on that
    range and clear the NEED_WAIT extents.  This doesn't get us back to our original
    speeds, but I've been seeing ~1380 ops/second, which is a <5% regression as
    opposed to a >15% regression.  That is acceptable given that the original commit
    greatly reduces our latency to begin with.  Thanks,
    Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
    1728366e
transaction.c 36.1 KB