Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp159154pxb; Tue, 10 Nov 2020 23:43:49 -0800 (PST) X-Google-Smtp-Source: ABdhPJxwiPbGcxOAkTE2dEhEeRAcxu8NCXcwENXRiQxj/hSwZ1Leu2SOghekGyzkQ0unFPgSfDi6 X-Received: by 2002:aa7:db48:: with SMTP id n8mr26192430edt.123.1605080629076; Tue, 10 Nov 2020 23:43:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605080629; cv=none; d=google.com; s=arc-20160816; b=rpRAfKzuYaqF733129R2vQViU4wTLo/oznZcX33MWzm8WsGthh/1oPbRNXCc2X956V vvK2LMx7OITgDIB7traTSv+RcC2wLe0UTpXPGjQtA9Yi9PO9rOtDdQPOcDRYH1IuNAX7 hD5v4RCBy6NEStMf2fR+t0LJYUpDJOs6fW4p3fghyxOxjKL2LFx/KheQ1RrOdnReIZZX ea12FL5wt0Am2GlFhPYKtcOZl1oy3RANuNrSY7cxKCjTFDbcpVEqYeVgIicgkm6JOJ5/ C8LChNJbU63PwdHA4NO8yVK0JyF/egekGMqoknVqcFAi1zgyMaqfQgy1oTZeBtp30EJW KlbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent:references:message-id :in-reply-to:subject:cc:to:from:date:dkim-signature; bh=mDvH6OSBbzyVCoxpj+jRSF1gIjRVsvCyNLrBtPFpWYQ=; b=plVsqkSoHyChpCL8rzxsShPPBjfJ8UAlEpR/CiLqZPgXh6RI3xW/rCmZegSJDdxjyF oimuFGAk6dnJJ6BWNhCdBT+LOe5sP3KmfAolWXxneOh3attFNPAplabG/wmNogkN7YgP BryikHTSU8wXEvqU0VDCchAOm46bzNbn1lYtmyqxWzKZYLhsRT2hza4QCQ0blEPd4Bcm trQLmVkNOnWgvspk1QkH27R3feiN+MAW10wPuWV0Zqavpee4eacwd3OJjx5t+ybMM/VP bM3Ohm/rBGV3+gMkAAqO6AozLPmm9VobJ0TbWlfRtw0nkeLus9zv0l2e8Wkmxrfwvgyv XVKA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="XwLW/dm2"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w5si94331edt.245.2020.11.10.23.43.24; Tue, 10 Nov 2020 23:43:49 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="XwLW/dm2"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726036AbgKKHl5 (ORCPT + 99 others); Wed, 11 Nov 2020 02:41:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53436 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725916AbgKKHl5 (ORCPT ); Wed, 11 Nov 2020 02:41:57 -0500 Received: from mail-ot1-x342.google.com (mail-ot1-x342.google.com [IPv6:2607:f8b0:4864:20::342]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EEB4BC0613D4 for ; Tue, 10 Nov 2020 23:41:56 -0800 (PST) Received: by mail-ot1-x342.google.com with SMTP id k3so1281113otp.12 for ; Tue, 10 Nov 2020 23:41:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:from:to:cc:subject:in-reply-to:message-id:references :user-agent:mime-version; bh=mDvH6OSBbzyVCoxpj+jRSF1gIjRVsvCyNLrBtPFpWYQ=; b=XwLW/dm2fkNO4NNgVz1CcrM/+4th1lp0Jt1bmAwnUZGl5dzjKemMasbPgwGnm7sQkg /PwXw9SmI+nYdxKqcd1DcJmG+OC6tv+/684uyIJnF5bYkgBz1J4Pd7XPZo0diSb6YqZT 6i7lJbk2dzaAogV6yRKFpbSWLUwZZ26EgXioV654U6SiWxCY0kfRq9bCvmkfJk1g1Rq/ yptFOUeq1uRAUi2CdvOUt/xavBHdVg7LLBhjyZTVVa/qAuIyzosmWgKaxwLu24+W3BAi DBDDEVugLoEVZNqTylkB7ei6iYsePtTj7jhWn5yAR6P/l0GMD6S8sEHGHd8Mgeu6afRl ZA4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version; bh=mDvH6OSBbzyVCoxpj+jRSF1gIjRVsvCyNLrBtPFpWYQ=; b=G/nnKePKRzoMX9bnJdUfLmbPbvN7YYCNbHRMujmGhJuA9MpG64K4xtLDq4+9W/nvxf D57XXeO5shgFTPEj390kdsDTCqOszuE5LGxVG6u1IbwcIIKKr5ej2xU6GM93Cok3NrwZ D7uSSCostJWQSyPM5M5/RwWJx6NBdkkmbtLDEkPjTCWzYy2w6N1e4lLtPvXe0ULOZYzN JN3ScmhHAzZgudAKkq9fVigZWNJ9Osg90QLwzSDA+ClU7IUwOCNLGQMSJQeE7cgyHLUq rNdqTauuvL6o8jEGd3t5Pp7fpl5sabxkdVPCPoJ1Vf0IP/qc7sWDP0sxAi217bNnN+M0 WToQ== X-Gm-Message-State: AOAM533zOVQggqPucHPEjBTAOTx1PoOQWaU+sl+cK8ngSAU8VkfmOYx3 ixTwpWDArN6H9gHrML4eYqvnlA== X-Received: by 2002:a9d:6647:: with SMTP id q7mr17517045otm.196.1605080515950; Tue, 10 Nov 2020 23:41:55 -0800 (PST) Received: from eggly.attlocal.net (172-10-233-147.lightspeed.sntcca.sbcglobal.net. [172.10.233.147]) by smtp.gmail.com with ESMTPSA id 2sm276688oir.40.2020.11.10.23.41.53 (version=TLS1 cipher=ECDHE-ECDSA-AES128-SHA bits=128/128); Tue, 10 Nov 2020 23:41:55 -0800 (PST) Date: Tue, 10 Nov 2020 23:41:52 -0800 (PST) From: Hugh Dickins X-X-Sender: hugh@eggly.anvils To: Alex Shi cc: Andrew Morton , mgorman@techsingularity.net, tj@kernel.org, hughd@google.com, khlebnikov@yandex-team.ru, daniel.m.jordan@oracle.com, willy@infradead.org, hannes@cmpxchg.org, lkp@intel.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, shakeelb@google.com, iamjoonsoo.kim@lge.com, richard.weiyang@gmail.com, kirill@shutemov.name, alexander.duyck@gmail.com, rong.a.chen@intel.com, mhocko@suse.com, vdavydov.dev@gmail.com, shy828301@gmail.com, Minchan Kim Subject: Re: [PATCH v21 06/19] mm/rmap: stop store reordering issue on page->mapping In-Reply-To: Message-ID: References: <1604566549-62481-1-git-send-email-alex.shi@linux.alibaba.com> <1604566549-62481-7-git-send-email-alex.shi@linux.alibaba.com> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 6 Nov 2020, Alex Shi wrote: > > updated for comments change from Johannes > > > From 2fd278b1ca6c3e260ad249808b62f671d8db5a7b Mon Sep 17 00:00:00 2001 > From: Alex Shi > Date: Thu, 5 Nov 2020 11:38:24 +0800 > Subject: [PATCH v21 06/19] mm/rmap: stop store reordering issue on > page->mapping > > Hugh Dickins and Minchan Kim observed a long time issue which > discussed here, but actully the mentioned fix missed. > https://lore.kernel.org/lkml/20150504031722.GA2768@blaptop/ > 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 > a 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." > > Signed-off-by: Alex Shi > Cc: Johannes Weiner > Cc: Andrew Morton > Cc: Hugh Dickins Acked-by: Hugh Dickins Many thanks to Johannes for spotting my falsehood in the next patch, and to Alex for making it true with this patch. As I just remarked against the v20, I do have some more of these WRITE_ONCEs, but consider them merely theoretical: so please don't let me hold this series up. Andrew, I am hoping that Alex's v21 will appear in the next mmotm? Thanks, Hugh > Cc: Matthew Wilcox > Cc: Minchan Kim > Cc: Vladimir Davydov > Cc: linux-kernel@vger.kernel.org > Cc: linux-mm@kvack.org > --- > mm/rmap.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/mm/rmap.c b/mm/rmap.c > index 1b84945d655c..380c6b9956c2 100644 > --- a/mm/rmap.c > +++ b/mm/rmap.c > @@ -1054,8 +1054,14 @@ static void __page_set_anon_rmap(struct page *page, > if (!exclusive) > anon_vma = anon_vma->root; > > + /* > + * page_idle does a lockless/optimistic rmap scan on page->mapping. > + * Make sure the compiler doesn't split the stores of anon_vma and > + * the PAGE_MAPPING_ANON type identifier, otherwise the rmap code > + * could mistake the mapping for a struct address_space and crash. > + */ > anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON; > - page->mapping = (struct address_space *) anon_vma; > + WRITE_ONCE(page->mapping, (struct address_space *) anon_vma); > page->index = linear_page_index(vma, address); > } > > -- > 1.8.3.1