Skip to content
  • Kirill A. Shutemov's avatar
    mm: fix false-positive warning on exit due mm_nr_pmds(mm) · b30fe6c7
    Kirill A. Shutemov authored
    
    
    The problem is that we check nr_ptes/nr_pmds in exit_mmap() which happens
    *before* pgd_free().  And if an arch does pte/pmd allocation in
    pgd_alloc() and frees them in pgd_free() we see offset in counters by the
    time of the checks.
    
    We tried to workaround this by offsetting expected counter value according
    to FIRST_USER_ADDRESS for both nr_pte and nr_pmd in exit_mmap().  But it
    doesn't work in some cases:
    
    1. ARM with LPAE enabled also has non-zero USER_PGTABLES_CEILING, but
       upper addresses occupied with huge pmd entries, so the trick with
       offsetting expected counter value will get really ugly: we will have
       to apply it nr_pmds, but not nr_ptes.
    
    2. Metag has non-zero FIRST_USER_ADDRESS, but doesn't do allocation
       pte/pmd page tables allocation in pgd_alloc(), just setup a pgd entry
       which is allocated at boot and shared accross all processes.
    
    The proposal is to move the check to check_mm() which happens *after*
    pgd_free() and do proper accounting during pgd_alloc() and pgd_free()
    which would bring counters to zero if nothing leaked.
    
    Signed-off-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Reported-by: default avatarTyler Baker <tyler.baker@linaro.org>
    Tested-by: default avatarTyler Baker <tyler.baker@linaro.org>
    Tested-by: default avatarNishanth Menon <nm@ti.com>
    Cc: Russell King <linux@arm.linux.org.uk>
    Cc: James Hogan <james.hogan@imgtec.com>
    Cc: Guan Xuetao <gxt@mprc.pku.edu.cn>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    b30fe6c7