• Kirill A. Shutemov's avatar
    mempolicy: do not try to queue pages from !vma_migratable() · 77bf45e7
    Kirill A. Shutemov authored
    Maybe I miss some point, but I don't see a reason why we try to queue
    pages from non migratable VMAs.
    
    This testcase steps on VM_BUG_ON_PAGE() in isolate_lru_page():
    
        #include <fcntl.h>
        #include <unistd.h>
        #include <stdio.h>
        #include <sys/mman.h>
        #include <numaif.h>
    
        #define SIZE 0x2000
    
        int foo;
    
        int main()
        {
            int fd;
            char *p;
            unsigned long mask = 2;
    
            fd = open("/dev/sg0", O_RDWR);
            p = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
            /* Faultin pages */
            foo = p[0] + p[0x1000];
            mbind(p, SIZE, MPOL_BIND, &mask, 4, MPOL_MF_MOVE | MPOL_MF_STRICT);
            return 0;
        }
    
    The only case when we can queue pages from such VMA is MPOL_MF_STRICT
    plus MPOL_MF_MOVE or MPOL_MF_MOVE_ALL for VMA which has pages on LRU,
    but gfp mask is not sutable for migaration (see mapping_gfp_mask() check
    in vma_migratable()).  That's looks like a bug to me.
    
    Let's filter out non-migratable vma at start of queue_pages_test_walk()
    and go to queue_pages_pte_range() only if MPOL_MF_MOVE or
    MPOL_MF_MOVE_ALL flag is set.
    Signed-off-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Signed-off-by: default avatarDmitry Vyukov <dvyukov@google.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    77bf45e7
mempolicy.c 71.2 KB