Skip to content
  • Hugh Dickins's avatar
    mm: fix page_vma_mapped_walk() for ksm pages · d75450ff
    Hugh Dickins authored
    Doug Smythies reports oops with KSM in this backtrace, I've been seeing
    the same:
    
      page_vma_mapped_walk+0xe6/0x5b0
      page_referenced_one+0x91/0x1a0
      rmap_walk_ksm+0x100/0x190
      rmap_walk+0x4f/0x60
      page_referenced+0x149/0x170
      shrink_active_list+0x1c2/0x430
      shrink_node_memcg+0x67a/0x7a0
      shrink_node+0xe1/0x320
      kswapd+0x34b/0x720
    
    Just as observed in commit 4b0ece6f ("mm: migrate: fix
    remove_migration_pte() for ksm pages"), you cannot use page->index
    calculations on ksm pages.
    
    page_vma_mapped_walk() is relying on __vma_address(), where a ksm page
    can lead it off the end of the page table, and into whatever nonsense is
    in the next page, ending as an oops inside check_pte()'s pte_page().
    
    KSM tells page_vma_mapped_walk() exactly where to look for the page, it
    does not need any page->index calculation: and that's so also for all
    the normal and file and anon pages - just not for THPs and their
    subpages.  Get out early in most cases: instead of a PageKsm test, move
    down the earlier not-THP-page test, as suggested by Kirill.
    
    I'm also slightly worried that this loop can stray into other vmas, so
    added a vm_end test to prevent surprises; though I have not imagined
    anything worse than a very contrived case, in which a page mlocked in
    the next vma might be reclaimed because it is not mlocked in this vma.
    
    Fixes: ace71a19 ("mm: introduce page_vma_mapped_walk()")
    Link: http://lkml.kernel.org/r/alpine.LSU.2.11.1704031104400.1118@eggly.anvils
    
    
    Signed-off-by: default avatarHugh Dickins <hughd@google.com>
    Reported-by: default avatarDoug Smythies <dsmythies@telus.net>
    Tested-by: default avatarDoug Smythies <dsmythies@telus.net>
    Reviewed-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d75450ff