• Naoya Horiguchi's avatar
    mm: thp: introduce separate TTU flag for thp freezing · b5ff8161
    Naoya Horiguchi authored
    TTU_MIGRATION is used to convert pte into migration entry until thp
    split completes.  This behavior conflicts with thp migration added later
    patches, so let's introduce a new TTU flag specifically for freezing.
    
    try_to_unmap() is used both for thp split (via freeze_page()) and page
    migration (via __unmap_and_move()).  In freeze_page(), ttu_flag given
    for head page is like below (assuming anonymous thp):
    
        (TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS | TTU_RMAP_LOCKED | \
         TTU_MIGRATION | TTU_SPLIT_HUGE_PMD)
    
    and ttu_flag given for tail pages is:
    
        (TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS | TTU_RMAP_LOCKED | \
         TTU_MIGRATION)
    
    __unmap_and_move() calls try_to_unmap() with ttu_flag:
    
        (TTU_MIGRATION | TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS)
    
    Now I'm trying to insert a branch for thp migration at the top of
    try_to_unmap_one() like below
    
    static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
                           unsigned long address, void *arg)
      {
              ...
              /* PMD-mapped THP migration entry */
              if (!pvmw.pte && (flags & TTU_MIGRATION)) {
                  if (!PageAnon(page))
                      continue;
    
                  set_pmd_migration_entry(&pvmw, page);
                  continue;
              }
    	  ...
      }
    
    so try_to_unmap() for tail pages called by thp split can go into thp
    migration code path (which converts *pmd* into migration entry), while
    the expectation is to freeze thp (which converts *pte* into migration
    entry.)
    
    I detected this failure as a "bad page state" error in a testcase where
    split_huge_page() is called from queue_pages_pte_range().
    
    Link: http://lkml.kernel.org/r/20170717193955.20207-4-zi.yan@sent.comSigned-off-by: default avatarNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Signed-off-by: default avatarZi Yan <zi.yan@cs.rutgers.edu>
    Acked-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Anshuman Khandual <khandual@linux.vnet.ibm.com>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: David Nellans <dnellans@nvidia.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    b5ff8161
rmap.c 49.9 KB