• Alex Shi's avatar
    mm/rmap: stop store reordering issue on page->mapping · 16f5e707
    Alex Shi authored
    Hugh Dickins and Minchan Kim observed a long time issue which discussed
    here, but actully the mentioned fix in
    
      https://lore.kernel.org/lkml/20150504031722.GA2768@blaptop/
    
    was missed.
    
    The store reordering may cause problem in the scenario:
    
    	CPU 0						CPU1
       do_anonymous_page
    	page_add_new_anon_rmap()
    	  page->mapping = anon_vma + PAGE_MAPPING_ANON
    	lru_cache_add_inactive_or_unevictable()
    	  spin_lock(lruvec->lock)
    	  SetPageLRU()
    	  spin_unlock(lruvec->lock)
    						/* idletacking judged it as LRU
    						 * page so pass the page in
    						 * page_idle_clear_pte_refs
    						 */
    						page_idle_clear_pte_refs
    						  rmap_walk
    						    if PageAnon(page)
    
    Johannes give detailed examples how the store reordering could cause
    trouble: "The concern is the SetPageLRU may get reorder before
    'page->mapping' setting, That would make CPU 1 will observe at
    page->mapping after observing PageLRU set on the page.
    
    1. anon_vma + PAGE_MAPPING_ANON
    
       That's the in-order scenario and is fine.
    
    2. NULL
    
       That's possible if the page->mapping store gets reordered to occur
       after SetPageLRU. That's fine too because we check for it.
    
    3. anon_vma without the PAGE_MAPPING_ANON bit
    
       That would be a problem and could lead to all kinds of undesirable
       behavior including crashes and data corruption.
    
       Is it possible? AFAICT the compiler is allowed to tear the store to
       page->mapping and I don't see anything that would prevent it.
    
    That said, I also don't see how the reader testing PageLRU under the
    lru_lock would prevent that in the first place.  AFAICT we need that
    WRITE_ONCE() around the page->mapping assignment."
    
    [alex.shi@linux.alibaba.com: updated for comments change from Johannes]
      Link: https://lkml.kernel.org/r/e66ef2e5-c74c-6498-e8b3-56c37b9d2d15@linux.alibaba.com
    
    Link: https://lkml.kernel.org/r/1604566549-62481-7-git-send-email-alex.shi@linux.alibaba.com
    
    Signed-off-by: default avatarAlex Shi <alex.shi@linux.alibaba.com>
    Acked-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Acked-by: default avatarHugh Dickins <hughd@google.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
    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: 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: Shakeel Butt <shakeelb@google.com>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    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>
    16f5e707
rmap.c 55.6 KB