Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp2990913pxx; Sun, 1 Nov 2020 18:20:17 -0800 (PST) X-Google-Smtp-Source: ABdhPJyb5ErtykZgWP0U4kboBEzG1OhIRv/fqHKPv6mUjACj9CTsA7ZHGZMMx40mDdFoFCvZl/n/ X-Received: by 2002:a17:906:134e:: with SMTP id x14mr13481431ejb.173.1604283617437; Sun, 01 Nov 2020 18:20:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604283617; cv=none; d=google.com; s=arc-20160816; b=czRd69D/sxfqZDGWlns4usMCWkf7QxLbG1ABV0sIgvA2nTguWzi9SIqAfQr3kJ3fsy BuEBgzNnsD0iOcYGLn3EI0S1/E1zdGEhZ7ROJ3BSeRNR6jn4wnxNOvfCrZPtCRIYQfim ROrGiTFxPlTimFY4l4wCbtH88g7OkMKOGjDMGPc06P+F5POJUv6rLTx+ZnLmEpkrjQrT MCF0y/VAKlXOV4M6OTXDOF3+DrNUUKkUkdWdHwrOoP2rMRrDboqAGZefVSinCv6jro0m 3WDknLkOVgcvpJbyDZUUx+tYDBaEa9LaTKoir7KhAwAfvdcgzFfp50y43BxjtDbKaiNJ Sq3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=xHzBg+tRgNVAMEF+RqyZmrVszo9LrFZ+w7UmD4GIHK4=; b=w/e0pp36u3k2DB8IJe8ReVunx1Y1m57NjMiwHOumi6LeiYnpInkCyiT+63Z4HkaVlE ve0riM3jfcPfwTthtz9sHapSqpbXZ/7Rei4O4CX7BWabdbDeWOfteG3YV5M/kskANEzT PIvKJOgadtcsWnyXObUwtqbrs5i3R3JtdQzBFeU8NFSo1hPBKdLCKPcBp72Lkes4Cua7 qxIMSrZubW0V1kvn+1z1KFXdNNDfvUsnAUrD+NDJac4CU9tJPhECCIR0ReBzkaHmBtYb krjD6lNTTPTMX3AfZFs3afhuMZ/NnP+psJzATn1zd2TfaWshQyXP5IjJcl59Uj7We4X/ a6lQ== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id x18si10910421ejd.242.2020.11.01.18.19.55; Sun, 01 Nov 2020 18:20:17 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727737AbgKBCRw (ORCPT + 99 others); Sun, 1 Nov 2020 21:17:52 -0500 Received: from out30-42.freemail.mail.aliyun.com ([115.124.30.42]:50292 "EHLO out30-42.freemail.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727517AbgKBCRr (ORCPT ); Sun, 1 Nov 2020 21:17:47 -0500 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R461e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01e01424;MF=alex.shi@linux.alibaba.com;NM=1;PH=DS;RN=8;SR=0;TI=SMTPD_---0UDrT9AM_1604283462; Received: from aliy80.localdomain(mailfrom:alex.shi@linux.alibaba.com fp:SMTPD_---0UDrT9AM_1604283462) by smtp.aliyun-inc.com(127.0.0.1); Mon, 02 Nov 2020 10:17:43 +0800 From: Alex Shi To: akpm@linux-foundation.org, hannes@cmpxchg.org, lkp@intel.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, cgroups@vger.kernel.org Cc: Michal Hocko , Vladimir Davydov Subject: [PATCH 2/2] mm/memcg: warning on !memcg after readahead page charged Date: Mon, 2 Nov 2020 10:17:16 +0800 Message-Id: <1604283436-18880-3-git-send-email-alex.shi@linux.alibaba.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1604283436-18880-1-git-send-email-alex.shi@linux.alibaba.com> References: <1604283436-18880-1-git-send-email-alex.shi@linux.alibaba.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add VM_WARN_ON_ONCE_PAGE() macro. Since readahead page is charged on memcg too, in theory we don't have to check this exception now. Before safely remove them all, add a warning for the unexpected !memcg. Signed-off-by: Alex Shi Acked-by: Michal Hocko Acked-by: Hugh Dickins Acked-by: Johannes Weiner Cc: Johannes Weiner Cc: Michal Hocko Cc: Vladimir Davydov Cc: Andrew Morton Cc: cgroups@vger.kernel.org Cc: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org --- include/linux/mmdebug.h | 13 +++++++++++++ mm/memcontrol.c | 11 ++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/include/linux/mmdebug.h b/include/linux/mmdebug.h index 2ad72d2c8cc5..5d0767cb424a 100644 --- a/include/linux/mmdebug.h +++ b/include/linux/mmdebug.h @@ -37,6 +37,18 @@ BUG(); \ } \ } while (0) +#define VM_WARN_ON_ONCE_PAGE(cond, page) ({ \ + static bool __section(".data.once") __warned; \ + int __ret_warn_once = !!(cond); \ + \ + if (unlikely(__ret_warn_once && !__warned)) { \ + dump_page(page, "VM_WARN_ON_ONCE_PAGE(" __stringify(cond)")");\ + __warned = true; \ + WARN_ON(1); \ + } \ + unlikely(__ret_warn_once); \ +}) + #define VM_WARN_ON(cond) (void)WARN_ON(cond) #define VM_WARN_ON_ONCE(cond) (void)WARN_ON_ONCE(cond) #define VM_WARN_ONCE(cond, format...) (void)WARN_ONCE(cond, format) @@ -48,6 +60,7 @@ #define VM_BUG_ON_MM(cond, mm) VM_BUG_ON(cond) #define VM_WARN_ON(cond) BUILD_BUG_ON_INVALID(cond) #define VM_WARN_ON_ONCE(cond) BUILD_BUG_ON_INVALID(cond) +#define VM_WARN_ON_ONCE_PAGE(cond, page) BUILD_BUG_ON_INVALID(cond) #define VM_WARN_ONCE(cond, format...) BUILD_BUG_ON_INVALID(cond) #define VM_WARN(cond, format...) BUILD_BUG_ON_INVALID(cond) #endif diff --git a/mm/memcontrol.c b/mm/memcontrol.c index ec13fe4ed407..e46b9f9501c2 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1350,10 +1350,7 @@ struct lruvec *mem_cgroup_page_lruvec(struct page *page, struct pglist_data *pgd } memcg = page->mem_cgroup; - /* - * Swapcache readahead pages are added to the LRU - and - * possibly migrated - before they are charged. - */ + VM_WARN_ON_ONCE_PAGE(!memcg, page); if (!memcg) memcg = root_mem_cgroup; @@ -6979,8 +6976,8 @@ void mem_cgroup_migrate(struct page *oldpage, struct page *newpage) if (newpage->mem_cgroup) return; - /* Swapcache readahead pages can get replaced before being charged */ memcg = oldpage->mem_cgroup; + VM_WARN_ON_ONCE_PAGE(!memcg, oldpage); if (!memcg) return; @@ -7180,7 +7177,7 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry) memcg = page->mem_cgroup; - /* Readahead page, never charged */ + VM_WARN_ON_ONCE_PAGE(!memcg, page); if (!memcg) return; @@ -7247,7 +7244,7 @@ int mem_cgroup_try_charge_swap(struct page *page, swp_entry_t entry) memcg = page->mem_cgroup; - /* Readahead page, never charged */ + VM_WARN_ON_ONCE_PAGE(!memcg, page); if (!memcg) return 0; -- 1.8.3.1