• Kirill A. Shutemov's avatar
    thp, mm: avoid PageUnevictable on active/inactive lru lists · e180cf80
    Kirill A. Shutemov authored
    active/inactive lru lists can contain unevicable pages (i.e.  ramfs pages
    that have been placed on the LRU lists when first allocated), but these
    pages must not have PageUnevictable set - otherwise shrink_[in]active_list
    goes crazy:
    
    kernel BUG at /home/space/kas/git/public/linux-next/mm/vmscan.c:1122!
    
    1090 static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
    1091                 struct lruvec *lruvec, struct list_head *dst,
    1092                 unsigned long *nr_scanned, struct scan_control *sc,
    1093                 isolate_mode_t mode, enum lru_list lru)
    1094 {
    ...
    1108                 switch (__isolate_lru_page(page, mode)) {
    1109                 case 0:
    ...
    1116                 case -EBUSY:
    ...
    1121                 default:
    1122                         BUG();
    1123                 }
    1124         }
    ...
    1130 }
    
    __isolate_lru_page() returns EINVAL for PageUnevictable(page).
    
    For lru_add_page_tail(), it means we should not set PageUnevictable()
    for tail pages unless we're sure that it will go to LRU_UNEVICTABLE.
    Let's just copy PG_active and PG_unevictable from head page in
    __split_huge_page_refcount(), it will simplify lru_add_page_tail().
    
    This will fix one more bug in lru_add_page_tail(): if
    page_evictable(page_tail) is false and PageLRU(page) is true, page_tail
    will go to the same lru as page, but nobody cares to sync page_tail
    active/inactive state with page.  So we can end up with inactive page on
    active lru.  The patch will fix it as well since we copy PG_active from
    head page.
    Signed-off-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Acked-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e180cf80
swap.c 23.9 KB