Received: by 2002:a05:6a10:9afc:0:0:0:0 with SMTP id t28csp1641307pxm; Fri, 4 Mar 2022 00:10:10 -0800 (PST) X-Google-Smtp-Source: ABdhPJwq8tSYrczaM5/+rGO7HRd2cxFN+T6GSZGnp1Un1p2jC65O+wD7uNF6ZR0/2Jtgm5eLwImd X-Received: by 2002:a17:902:9682:b0:14e:fe33:64af with SMTP id n2-20020a170902968200b0014efe3364afmr39864623plp.160.1646381410151; Fri, 04 Mar 2022 00:10:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1646381410; cv=none; d=google.com; s=arc-20160816; b=L7Hj+Og4BccDEgTnLb5YMm4UvWoA3rWC0TRMxc6xAb1WpPlP9Wpu0ydH4dBbjGXqpD R1JTvF4wm2S4J1V/s9ksoF8bd//ICHLz9H0PI+FzDyJExAgw7iKDCcIis0Cn8vyAAbuA 8eS89SlVX4E0Gn6p4x51XsAKAXJfn2s+rdFKVg+asEg4eHf/7ev9QIMy2YrWG4RYGetV RhCH2fvmJ5JJl6cc2nx4IthmOgdQc3aC7mw1ABM5zwKLY0IAl052Q5Nt5u/55hBVKmE4 NeghjOrJze9AEFgARFrxLi8pen1kKeBeiJaCLkq8zcbiud9fG6OJdQ5t/dVfh7Cg+ARo Vrtw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=FWhW+YEtKAt25AZygKvKKjc7akmRR9ol+ClTeEq3Lbo=; b=SOG9tIJGsIMGTfpD/nTXvM1VlxPQrkL5mp112XKY1RmTMzZXL838YyXnNds4BpMqT3 WGCYEEUfLl13CX1mC13BUct0G1zYdlJCByMGl6fS7iNUDlGxRJKRy5XNPWG1pwunyVQV 3YhDK9fUcrCKFKqI25a1Gk/mR1+Ka3E1vAN4NfPGfGryloW/lIVsFqhKtbm72hHNkbGO vWOnX/HDJC0iQcWfktVtJHPqWILKR9bLs+r28a64kFi8PMiIzLZSDVYVzEowATaVfvoB 88gLuOOXs5G8SVWoszoCqCu7D7A/2VDIXxfm1bcmml1UiGSARBv8lidymOSJgKqJDAXF wr7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=IhaK1MCd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id b14-20020a170902d50e00b00150948d9c1esi4393219plg.109.2022.03.04.00.09.42; Fri, 04 Mar 2022 00:10:10 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=IhaK1MCd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234935AbiCCUJI (ORCPT + 99 others); Thu, 3 Mar 2022 15:09:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47302 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231293AbiCCUJE (ORCPT ); Thu, 3 Mar 2022 15:09:04 -0500 Received: from mail-ed1-x52f.google.com (mail-ed1-x52f.google.com [IPv6:2a00:1450:4864:20::52f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 01BFC49F14 for ; Thu, 3 Mar 2022 12:08:17 -0800 (PST) Received: by mail-ed1-x52f.google.com with SMTP id w3so8047711edu.8 for ; Thu, 03 Mar 2022 12:08:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=FWhW+YEtKAt25AZygKvKKjc7akmRR9ol+ClTeEq3Lbo=; b=IhaK1MCdFibrxiiYKMWtxOQzMJqlKexiy9nkBZphPO+tGMURXU9zv4kgOB1YX/UDOu qpzrrPE9/7Is64Tjw6dlXCGMAF6f6T9iLHFyT9wOu9pCFt4d2pifgRFSUvgD4rCbKnzo /YFQZuFmiGSVbJn09/1DxaNZ6h8T3uVRsAzNegiGma6nyvPuu2BGdxdcyAGMqitMzE1t RaONLcn5rEW1y3b05XCvt9G4f5/zFG0Bic1zEN+ANymJXXPLNFwlNSSkH6DnPrdTCEp4 dQ51ai1gVWIV9AXbmYGEKdQAsX+kKsXXekH8UN9lIWCnueTyFpPa35IB3T2EgGbxZRTp XiTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=FWhW+YEtKAt25AZygKvKKjc7akmRR9ol+ClTeEq3Lbo=; b=PR/TBiudLnAleX7pA0RbAQ2VOW3Ml0VcHUSJanWwD+xs279qLl4Tql1Hjx7nOWDx74 pFbrIqyC2VctZz3Vm50eEltB2NHF4/QlXPyIwJAGFCtjcIrD85J8x4Hjs7rPIT+ZU6+b pvEdaO19r6ohhAKOuXC8B5y4YuyTEm8K6yFKZ83dnePYj1S9kL6CMGYv8EA/viXp1Z5I K2GuQLqFGu9hIXil1DDl4Vb5cMgJ5/jc7w0fRLuuddvajnYrPz9skoFXT2opzBVksiaQ Lp/PE1DhhWCdjGPyJFK9CaKIcq/BwF/AtFZqsFiRkWm6/0Kwz1j8yXlbkkbfmQqwOgSz IinQ== X-Gm-Message-State: AOAM530ZTdkEnfUxey/OoqBEWSXHjm1QWq6IUcKnlhnmMT6LDR6URbNl +XPpQbUxgKhqfSD8E8ci5qfLTOWyJkyO/b9ieeFWayrs X-Received: by 2002:aa7:d78e:0:b0:415:d787:6226 with SMTP id s14-20020aa7d78e000000b00415d7876226mr5146631edq.121.1646338096463; Thu, 03 Mar 2022 12:08:16 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Yang Shi Date: Thu, 3 Mar 2022 12:08:04 -0800 Message-ID: Subject: Re: [PATCH mmotm] mm/thp: fix NR_FILE_MAPPED accounting in page_*_file_rmap() To: Hugh Dickins Cc: Andrew Morton , "Kirill A. Shutemov" , Linux Kernel Mailing List , Linux MM Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Mar 2, 2022 at 5:46 PM Hugh Dickins wrote: > > NR_FILE_MAPPED accounting in mm/rmap.c (for /proc/meminfo "Mapped" and > /proc/vmstat "nr_mapped" and the memcg's memory.stat "mapped_file") is > slightly flawed for file or shmem huge pages. > > It is well thought out, and looks convincing, but there's a racy case > when the careful counting in page_remove_file_rmap() (without page lock) > gets discarded. So that in a workload like two "make -j20" kernel builds > under memory pressure, with cc1 on hugepage text, "Mapped" can easily > grow by a spurious 5MB or more on each iteration, ending up implausibly > bigger than most other numbers in /proc/meminfo. And, hypothetically, > might grow to the point of seriously interfering in mm/vmscan.c's > heuristics, which do take NR_FILE_MAPPED into some consideration. > > Fixed by moving the __mod_lruvec_page_state() down to where it will not > be missed before return (and I've grown a bit tired of that oft-repeated > but-not-everywhere comment on the __ness: it gets lost in the move here). > > Does page_add_file_rmap() need the same change? I suspect not, because > page lock is held in all relevant cases, and its skipping case looks safe; > but it's much easier to be sure, if we do make the same change. > > Fixes: dd78fedde4b9 ("rmap: support file thp") > Signed-off-by: Hugh Dickins Reviewed-by: Yang Shi > --- > If this were thought serious enough to backport (I don't feel strongly, > but it is something I keep in my own trees), it needs a little more care > near "out", because the mm/munlock series has removed some action there. > > mm/rmap.c | 31 ++++++++++++++----------------- > 1 file changed, 14 insertions(+), 17 deletions(-) > > --- a/mm/rmap.c > +++ b/mm/rmap.c > @@ -1238,14 +1238,14 @@ void page_add_new_anon_rmap(struct page *page, > void page_add_file_rmap(struct page *page, > struct vm_area_struct *vma, bool compound) > { > - int i, nr = 1; > + int i, nr = 0; > > VM_BUG_ON_PAGE(compound && !PageTransHuge(page), page); > lock_page_memcg(page); > if (compound && PageTransHuge(page)) { > int nr_pages = thp_nr_pages(page); > > - for (i = 0, nr = 0; i < nr_pages; i++) { > + for (i = 0; i < nr_pages; i++) { > if (atomic_inc_and_test(&page[i]._mapcount)) > nr++; > } > @@ -1262,11 +1262,12 @@ void page_add_file_rmap(struct page *page, > VM_WARN_ON_ONCE(!PageLocked(page)); > SetPageDoubleMap(compound_head(page)); > } > - if (!atomic_inc_and_test(&page->_mapcount)) > - goto out; > + if (atomic_inc_and_test(&page->_mapcount)) > + nr++; > } > - __mod_lruvec_page_state(page, NR_FILE_MAPPED, nr); > out: > + if (nr) > + __mod_lruvec_page_state(page, NR_FILE_MAPPED, nr); > unlock_page_memcg(page); > > mlock_vma_page(page, vma, compound); > @@ -1274,7 +1275,7 @@ void page_add_file_rmap(struct page *page, > > static void page_remove_file_rmap(struct page *page, bool compound) > { > - int i, nr = 1; > + int i, nr = 0; > > VM_BUG_ON_PAGE(compound && !PageHead(page), page); > > @@ -1289,12 +1290,12 @@ static void page_remove_file_rmap(struct page *page, bool compound) > if (compound && PageTransHuge(page)) { > int nr_pages = thp_nr_pages(page); > > - for (i = 0, nr = 0; i < nr_pages; i++) { > + for (i = 0; i < nr_pages; i++) { > if (atomic_add_negative(-1, &page[i]._mapcount)) > nr++; > } > if (!atomic_add_negative(-1, compound_mapcount_ptr(page))) > - return; > + goto out; > if (PageSwapBacked(page)) > __mod_lruvec_page_state(page, NR_SHMEM_PMDMAPPED, > -nr_pages); > @@ -1302,16 +1303,12 @@ static void page_remove_file_rmap(struct page *page, bool compound) > __mod_lruvec_page_state(page, NR_FILE_PMDMAPPED, > -nr_pages); > } else { > - if (!atomic_add_negative(-1, &page->_mapcount)) > - return; > + if (atomic_add_negative(-1, &page->_mapcount)) > + nr++; > } > - > - /* > - * We use the irq-unsafe __{inc|mod}_lruvec_page_state because > - * these counters are not modified in interrupt context, and > - * pte lock(a spinlock) is held, which implies preemption disabled. > - */ > - __mod_lruvec_page_state(page, NR_FILE_MAPPED, -nr); > +out: > + if (nr) > + __mod_lruvec_page_state(page, NR_FILE_MAPPED, -nr); > } > > static void page_remove_anon_compound_rmap(struct page *page)