• Hugh Dickins's avatar
    mm/munlock: add lru_add_drain() to fix memcg_stat_test · ece369c7
    Hugh Dickins authored
    Mike reports that LTP memcg_stat_test usually leads to
    
      memcg_stat_test 3 TINFO: Test unevictable with MAP_LOCKED
      memcg_stat_test 3 TINFO: Running memcg_process --mmap-lock1 -s 135168
      memcg_stat_test 3 TINFO: Warming up pid: 3460
      memcg_stat_test 3 TINFO: Process is still here after warm up: 3460
      memcg_stat_test 3 TFAIL: unevictable is 122880, 135168 expected
    
    but may also lead to
    
      memcg_stat_test 4 TINFO: Test unevictable with mlock
      memcg_stat_test 4 TINFO: Running memcg_process --mmap-lock2 -s 135168
      memcg_stat_test 4 TINFO: Warming up pid: 4271
      memcg_stat_test 4 TINFO: Process is still here after warm up: 4271
      memcg_stat_test 4 TFAIL: unevictable is 122880, 135168 expected
    
    or both.  A wee bit flaky.
    
    follow_page_pte() used to have an lru_add_drain() per each page mlocked,
    and the test came to rely on accurate stats.  The pagevec to be drained
    is different now, but still covered by lru_add_drain(); and, never mind
    the test, I believe it's in everyone's interest that a bulk faulting
    interface like populate_vma_page_range() or faultin_vma_page_range()
    should drain its local pagevecs at the end, to save others sometimes
    needing the much more expensive lru_add_drain_all().
    
    This does not absolutely guarantee exact stats - the mlocking task can
    be migrated between CPUs as it proceeds - but it's good enough and the
    tests pass.
    
    Link: https://lkml.kernel.org/r/47f6d39c-a075-50cb-1cfb-26dd957a48af@google.com
    Fixes: b67bf49c ("mm/munlock: delete FOLL_MLOCK and FOLL_POPULATE")
    Signed-off-by: default avatarHugh Dickins <hughd@google.com>
    Reported-by: default avatarMike Galbraith <efault@gmx.de>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ece369c7
gup.c 84.3 KB