• Mel Gorman's avatar
    mm: filemap: avoid unnecessary calls to lock_page when waiting for IO to complete during a read · ebded027
    Mel Gorman authored
    In the generic read paths the kernel looks up a page in the page cache
    and if it's up to date, it is used.  If not, the page lock is acquired
    to wait for IO to complete and then check the page.  If multiple
    processes are waiting on IO, they all serialise against the lock and
    duplicate the checks.  This is unnecessary.
    
    The page lock in itself does not give any guarantees to the callers
    about the page state as it can be immediately truncated or reclaimed
    after the page is unlocked.  It's sufficient to wait_on_page_locked and
    then continue if the page is up to date on wakeup.
    
    It is possible that a truncated but up-to-date page is returned but the
    reference taken during read prevents it disappearing underneath the
    caller and the data is still valid if PageUptodate.
    
    The overall impact is small as even if processes serialise on the lock,
    the lock section is tiny once the IO is complete.  Profiles indicated
    that unlock_page and friends are generally a tiny portion of a
    read-intensive workload.  An artificial test was created that had
    instances of dd access a cache-cold file on an ext4 filesystem and
    measure how long the read took.
    
    paralleldd
                                        4.4.0                 4.4.0
                                      vanilla             avoidlock
    Amean    Elapsd-1          5.28 (  0.00%)        5.15 (  2.50%)
    Amean    Elapsd-4          5.29 (  0.00%)        5.17 (  2.12%)
    Amean    Elapsd-7          5.28 (  0.00%)        5.18 (  1.78%)
    Amean    Elapsd-12         5.20 (  0.00%)        5.33 ( -2.50%)
    Amean    Elapsd-21         5.14 (  0.00%)        5.21 ( -1.41%)
    Amean    Elapsd-30         5.30 (  0.00%)        5.12 (  3.38%)
    Amean    Elapsd-48         5.78 (  0.00%)        5.42 (  6.21%)
    Amean    Elapsd-79         6.78 (  0.00%)        6.62 (  2.46%)
    Amean    Elapsd-110        9.09 (  0.00%)        8.99 (  1.15%)
    Amean    Elapsd-128       10.60 (  0.00%)       10.43 (  1.66%)
    
    The impact is small but intuitively, it makes sense to avoid unnecessary
    calls to lock_page.
    Signed-off-by: default avatarMel Gorman <mgorman@techsingularity.net>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Cc: Hugh Dickins <hughd@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ebded027
filemap.c 76.5 KB