Skip to content
  • Kirill A. Shutemov's avatar
    mm: avoid tail page refcounting on non-THP compound pages · 8d63d99a
    Kirill A. Shutemov authored
    
    
    THP uses tail page refcounting to be able to split huge pages at any time.
     Tail page refcounting is not needed for other users of compound pages and
    it's harmful because of overhead.
    
    We try to exclude non-THP pages from tail page refcounting using
    __compound_tail_refcounted() check.  It excludes most common non-THP
    compound pages: SL*B and hugetlb, but it doesn't catch rest of __GFP_COMP
    users -- drivers.
    
    And it's not only about overhead.
    
    Drivers might want to use compound pages to get refcounting semantics
    suitable for mapping high-order pages to userspace.  But tail page
    refcounting breaks it.
    
    Tail page refcounting uses ->_mapcount in tail pages to store GUP pins on
    them.  It means GUP pins would affect page_mapcount() for tail pages.
    It's not a problem for THP, because it never maps tail pages.  But unlike
    THP, drivers map parts of compound pages with PTEs and it makes
    page_mapcount() be called for tail pages.
    
    In particular, GUP pins would shift PSS up and affect /proc/kpagecount for
    such pages.  But, I'm not aware about anything which can lead to crash or
    other serious misbehaviour.
    
    Since currently all THP pages are anonymous and all drivers pages are not,
    we can fix the __compound_tail_refcounted() check by requiring PageAnon()
    to enable tail page refcounting.
    
    Signed-off-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Acked-by: default avatarHugh Dickins <hughd@google.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    8d63d99a