• Alex Shi's avatar
    mm/swap.c: serialize memcg changes in pagevec_lru_move_fn · fc574c23
    Alex Shi authored
    Hugh Dickins' found a memcg change bug on original version: If we want to
    change the pgdat->lru_lock to memcg's lruvec lock, we have to serialize
    mem_cgroup_move_account during pagevec_lru_move_fn.  The possible bad
    scenario would like:
    
    	cpu 0					cpu 1
    lruvec = mem_cgroup_page_lruvec()
    					if (!isolate_lru_page())
    						mem_cgroup_move_account
    
    spin_lock_irqsave(&lruvec->lru_lock <== wrong lock.
    
    So we need TestClearPageLRU to block isolate_lru_page(), that serializes
    the memcg change.  and then removing the PageLRU check in move_fn callee
    as the consequence.
    
    __pagevec_lru_add_fn() is different from the others, because the pages it
    deals with are, by definition, not yet on the lru.  TestClearPageLRU is
    not needed and would not work, so __pagevec_lru_add() goes its own way.
    
    Link: https://lkml.kernel.org/r/1604566549-62481-17-git-send-email-alex.shi@linux.alibaba.comReported-by: default avatarHugh Dickins <hughd@google.com>
    Signed-off-by: default avatarAlex Shi <alex.shi@linux.alibaba.com>
    Acked-by: default avatarHugh Dickins <hughd@google.com>
    Acked-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Cc: Alexander Duyck <alexander.duyck@gmail.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
    Cc: "Chen, Rong A" <rong.a.chen@intel.com>
    Cc: Daniel Jordan <daniel.m.jordan@oracle.com>
    Cc: "Huang, Ying" <ying.huang@intel.com>
    Cc: Jann Horn <jannh@google.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Kirill A. Shutemov <kirill@shutemov.name>
    Cc: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
    Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Mika Penttilä <mika.penttila@nextfour.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Cc: Yang Shi <yang.shi@linux.alibaba.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    fc574c23
swap.c 33 KB