• MinChan Kim's avatar
    mm: fix mlocked page counter mismatch · 508b9f8e
    MinChan Kim authored
    When I tested following program, I found that the mlocked counter
    is strange.  It cannot free some mlocked pages.
    
    It is because try_to_unmap_file() doesn't check real
    page mappings in vmas.
    
    That is because the goal of an address_space for a file is to find all
    processes into which the file's specific interval is mapped.  It is
    related to the file's interval, not to pages.
    
    Even if the page isn't really mapped by the vma, it returns SWAP_MLOCK
    since the vma has VM_LOCKED, then calls try_to_mlock_page.  After this the
    mlocked counter is increased again.
    
    COWed anon page in a file-backed vma could be a such case.  This patch
    resolves it.
    
    -- my test program --
    
    int main()
    {
           mlockall(MCL_CURRENT);
           return 0;
    }
    
    -- before --
    
    root@barrios-target-linux:~# cat /proc/meminfo | egrep 'Mlo|Unev'
    Unevictable:           0 kB
    Mlocked:               0 kB
    
    -- after --
    
    root@barrios-target-linux:~# cat /proc/meminfo | egrep 'Mlo|Unev'
    Unevictable:           8 kB
    Mlocke...
    508b9f8e
rmap.c 34.2 KB