• Vlastimil Babka's avatar
    mm, proc: reduce cost of /proc/pid/smaps for shmem mappings · 6a15a370
    Vlastimil Babka authored
    The previous patch has improved swap accounting for shmem mapping, which
    however made /proc/pid/smaps more expensive for shmem mappings, as we
    consult the radix tree for each pte_none entry, so the overal complexity
    is O(n*log(n)).
    
    We can reduce this significantly for mappings that cannot contain COWed
    pages, because then we can either use the statistics tha shmem object
    itself tracks (if the mapping contains the whole object, or the swap
    usage of the whole object is zero), or use the radix tree iterator,
    which is much more effective than repeated find_get_entry() calls.
    
    This patch therefore introduces a function shmem_swap_usage(vma) and
    makes /proc/pid/smaps use it when possible.  Only for writable private
    mappings of shmem objects (i.e.  tmpfs files) with the shmem object
    itself (partially) swapped outwe have to resort to the find_get_entry()
    approach.
    
    Hopefully such mappings are relatively uncommon.
    
    To demonstrate the diference, I have measured this on a process that
    creates a 2GB mapping and dirties single pages with a stride of 2MB, and
    time how long does it take to cat /proc/pid/smaps of this process 100
    times.
    
    Private writable mapping of a /dev/shm/file (the most complex case):
    
    real    0m3.831s
    user    0m0.180s
    sys     0m3.212s
    
    Shared mapping of an almost full mapping of a partially swapped /dev/shm/file
    (which needs to employ the radix tree iterator).
    
    real    0m1.351s
    user    0m0.096s
    sys     0m0.768s
    
    Same, but with /dev/shm/file not swapped (so no radix tree walk needed)
    
    real    0m0.935s
    user    0m0.128s
    sys     0m0.344s
    
    Private anonymous mapping:
    
    real    0m0.949s
    user    0m0.116s
    sys     0m0.348s
    
    The cost is now much closer to the private anonymous mapping case, unless
    the shmem mapping is private and writable.
    Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6a15a370
shmem_fs.h 2.87 KB