• Hugh Dickins's avatar
    Fix sys_remap_file_pages BUG at highmem.c:15! · 16abfa08
    Hugh Dickins authored
    Gurudas Pai reports kernel BUG at arch/i386/mm/highmem.c:15! below
    sys_remap_file_pages, while running Oracle database test on x86 in 6GB
    RAM: kunmap thinks we're in_interrupt because the preempt count has
    wrapped.
    
    That's because __do_fault expected to unmap page_table, but one of its
    two callers do_nonlinear_fault already unmapped it: let do_linear_fault
    unmap it first too, and then there's no need to pass the page_table arg
    down.
    
    Why have we been so slow to notice this? Probably through forgetting
    that the mapping_cap_account_dirty test means that sys_remap_file_pages
    nowadays only goes the full nonlinear vma route on a few memory-backed
    filesystems like ramfs, tmpfs and hugetlbfs.
    
    [ It also depends on CONFIG_HIGHPTE, so it becomes even harder to
      trigger in practice. Many who have need of large memory have probably
      migrated to x86-64..
    
      Problem introduced by commit d0217ac0
      ("mm: fault feedback #1")                -- Linus ]
    Signed-off-by: default avatarHugh Dickins <hugh@veritas.com>
    Cc: gurudas pai <gurudas.pai@oracle.com>
    Cc: Nick Piggin <nickpiggin@yahoo.com.au>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    16abfa08
memory.c 76.1 KB