• Gerald Schaefer's avatar
    mm/hugetlb: clear compound_nr before freeing gigantic pages · ba9c1201
    Gerald Schaefer authored
    Commit 1378a5ee ("mm: store compound_nr as well as compound_order")
    added compound_nr counter to first tail struct page, overlaying with
    page->mapping.  The overlay itself is fine, but while freeing gigantic
    hugepages via free_contig_range(), a "bad page" check will trigger for
    non-NULL page->mapping on the first tail page:
    
      BUG: Bad page state in process bash  pfn:380001
      page:00000000c35f0856 refcount:0 mapcount:0 mapping:00000000126b68aa index:0x0 pfn:0x380001
      aops:0x0
      flags: 0x3ffff00000000000()
      raw: 3ffff00000000000 0000000000000100 0000000000000122 0000000100000000
      raw: 0000000000000000 0000000000000000 ffffffff00000000 0000000000000000
      page dumped because: non-NULL mapping
      Modules linked in:
      CPU: 6 PID: 616 Comm: bash Not tainted 5.10.0-rc7-next-20201208 #1
      Hardware name: IBM 3906 M03 703 (LPAR)
      Call Trace:
        show_stack+0x6e/0xe8
        dump_stack+0x90/0xc8
        bad_page+0xd6/0x130
        free_pcppages_bulk+0x26a/0x800
        free_unref_page+0x6e/0x90
        free_contig_range+0x94/0xe8
        update_and_free_page+0x1c4/0x2c8
        free_pool_huge_page+0x11e/0x138
        set_max_huge_pages+0x228/0x300
        nr_hugepages_store_common+0xb8/0x130
        kernfs_fop_write+0xd2/0x218
        vfs_write+0xb0/0x2b8
        ksys_write+0xac/0xe0
        system_call+0xe6/0x288
      Disabling lock debugging due to kernel taint
    
    This is because only the compound_order is cleared in
    destroy_compound_gigantic_page(), and compound_nr is set to
    1U << order == 1 for order 0 in set_compound_order(page, 0).
    
    Fix this by explicitly clearing compound_nr for first tail page after
    calling set_compound_order(page, 0).
    
    Link: https://lkml.kernel.org/r/20201208182813.66391-2-gerald.schaefer@linux.ibm.com
    Fixes: 1378a5ee ("mm: store compound_nr as well as compound_order")
    Signed-off-by: default avatarGerald Schaefer <gerald.schaefer@linux.ibm.com>
    Reviewed-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
    Cc: Heiko Carstens <hca@linux.ibm.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Christian Borntraeger <borntraeger@de.ibm.com>
    Cc: <stable@vger.kernel.org>	[5.9+]
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ba9c1201
hugetlb.c 155 KB