• Gerald Schaefer's avatar
    mm/hugetlb: clear compound_mapcount when freeing gigantic pages · c8cc708a
    Gerald Schaefer authored
    While working on s390 support for gigantic hugepages I ran into the
    following "Bad page state" warning when freeing gigantic pages:
    
      BUG: Bad page state in process bash  pfn:580001
      page:000003d116000040 count:0 mapcount:0 mapping:ffffffff00000000 index:0x0
      flags: 0x7fffc0000000000()
      page dumped because: non-NULL mapping
    
    This is because page->compound_mapcount, which is part of a union with
    page->mapping, is initialized with -1 in prep_compound_gigantic_page(),
    and not cleared again during destroy_compound_gigantic_page().  Fix this
    by clearing the compound_mapcount in destroy_compound_gigantic_page()
    before clearing compound_head.
    
    Interestingly enough, the warning will not show up on x86_64, although
    this should not be architecture specific.  Apparently there is an
    endianness issue, combined with the fact that the union contains both a
    64 bit ->mapping pointer and a 32 bit atomic_t ->compound_mapcount as
    members.  The resulting bogus page->mapping on x86_64 therefore contains
    00000000ffffffff instead of ffffffff00000000 on s390, which will falsely
    trigger the PageAnon() check in free_pages_prepare() because
    page->mapping & PAGE_MAPPING_ANON is true on little-endian architectures
    like x86_64 in this case (the page is not compound anymore,
    ->compound_head was already cleared before).  As a result, page->mapping
    will be cleared before doing the checks in free_pages_check().
    
    Not sure if the bogus "PageAnon() returning true" on x86_64 for the
    first tail page of a gigantic page (at this stage) has other theoretical
    implications, but they would also be fixed with this patch.
    
    Link: http://lkml.kernel.org/r/1466612719-5642-1-git-send-email-gerald.schaefer@de.ibm.comSigned-off-by: default avatarGerald Schaefer <gerald.schaefer@de.ibm.com>
    Reviewed-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
    Cc: Luiz Capitulino <lcapitulino@redhat.com>
    Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Hillf Danton <hillf.zj@alibaba-inc.com>
    Cc: "Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
    Cc: "Aneesh Kumar K . V" <aneesh.kumar@linux.vnet.ibm.com>
    Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    c8cc708a
hugetlb.c 120 KB