Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp2409937ybl; Mon, 20 Jan 2020 02:23:20 -0800 (PST) X-Google-Smtp-Source: APXvYqybYGTQOTIZWdJmdUKMcZLHcHnjFV1BENI3ApAnhVK89QR8m5J8fKx7EJDiDzgSoXx3MM4j X-Received: by 2002:aca:ec4d:: with SMTP id k74mr11798003oih.64.1579515800687; Mon, 20 Jan 2020 02:23:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579515800; cv=none; d=google.com; s=arc-20160816; b=tR+3QqlTSV5B/59bHJgGD78NXeY31Yo4xIOApPByup2x2+OrrM8C9Bn9l01pP7PmN7 FALQSZhxwoqPAZE113+dpYpZLOLKHLkvw2VohfbTX8aZALHkzAwI8U5bCS3YCglRFFer HCqx1rW8tyQoTY3NiM/H6dFNbK2BBOCFlG9Y2psZrldxp4qDQwIsGryw2Fhnte6dtaiW Z4TQLsR9uEFz1UmyFR3Tiboo3BEDsoaqdoPaFhcuq0N8PUDgSiGUGwdpLmzFwapPhY/1 3wXK51pRPpIQr6vXqAvlORkxHAYx/NE+MXgWMeQ+95DPeGz/krKyw2ii4XXefPUkSMDl S5cg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=cbm5di5vXHtzwgB8Y6nBPj8ah0P3MuQdgmNtWPBOPP4=; b=jEDajCld9m0qw69ou9d7gdpHxSF5wpw+/qWwgnG80v8b7Ovbaruo/piuY5CuajsEGM VPiz9+39t/aPwHQUJ3uo554lL7BtarUvCwoMB4IZynpy/N/uPwmX2lz9KZ3n8JMkVJ82 Oz5dqSpKe++zLie+zorz7veZTxSFpbMG9nv2IojaL1YAejSK2Dy6FGXUST/s0Z6c0buD QJnx1h2fgJIxFUpnV24redFeARsa1mnWmq7UwcqTd2MuZcDT/sU03xdZiZKiyVAsyNTh mQwLcs+GZoeH0CGS4V7I5M/Ehem3JsZyl1q15zJLILJAhBKLYp3b726oaifOS+TGznw0 YLUw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l25si19715116otn.69.2020.01.20.02.23.08; Mon, 20 Jan 2020 02:23:20 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726650AbgATKWE (ORCPT + 99 others); Mon, 20 Jan 2020 05:22:04 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:36982 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726130AbgATKWE (ORCPT ); Mon, 20 Jan 2020 05:22:04 -0500 Received: by mail-wm1-f68.google.com with SMTP id f129so14113028wmf.2 for ; Mon, 20 Jan 2020 02:22:02 -0800 (PST) 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:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=cbm5di5vXHtzwgB8Y6nBPj8ah0P3MuQdgmNtWPBOPP4=; b=cifplJrmxCLeoQOHj1nyYB12kR9m0Br7hTSQvmpOUpi6g9EgAS5Aq6BJuwS20bo4l+ w6kmCtWLRig9YtQx3b+3nz2CA51ULYfU69skZy44JyrKxPtre2rq/i+jw2tZw/kI9Vll aoBn9FHlnskWe1g2ptLPsSgy2WUzFH62/ymNUA3zF1Fm81kmdVv3o9sCdhQiANNqOrLx 8puEyuDlATyG2tjvADTTxjFYOhoA9LlQqgdVHDGC9pWN4Ws289qYmJjpz0YzqXjNHdRr /Lk7Y5VBXsmf9reD/UysCipfG9wc2xl9vUg0vvshzRhgBv2oqvujAufMjW25d+6Xfl90 TuFQ== X-Gm-Message-State: APjAAAX44J2QvaMXPLVYgpT+PEQlnuhYUlk8i6wg2YFNMlo8WxGdo0mz 8UX3U/AZbjZB9j70056EtAk= X-Received: by 2002:a7b:c38c:: with SMTP id s12mr17740668wmj.96.1579515721753; Mon, 20 Jan 2020 02:22:01 -0800 (PST) Received: from localhost (prg-ext-pat.suse.com. [213.151.95.130]) by smtp.gmail.com with ESMTPSA id n189sm329608wme.33.2020.01.20.02.22.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Jan 2020 02:22:01 -0800 (PST) Date: Mon, 20 Jan 2020 11:22:00 +0100 From: Michal Hocko To: Wei Yang Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, rientjes@google.com Subject: Re: [Patch v2 3/4] mm/page_alloc.c: pass all bad reasons to bad_page() Message-ID: <20200120102200.GW18451@dhcp22.suse.cz> References: <20200120030415.15925-1-richardw.yang@linux.intel.com> <20200120030415.15925-4-richardw.yang@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200120030415.15925-4-richardw.yang@linux.intel.com> User-Agent: Mutt/1.12.2 (2019-09-21) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon 20-01-20 11:04:14, Wei Yang wrote: > Now we can pass all bad reasons to __dump_page(). And we do we want to do that? The dump of the page will tell us the whole story so a single and the most important reason sounds like a better implementation. The code is also more subtle because each caller of the function has to be aware of how many reasons there might be. Not to mention that you need a room for 5 pointers on the stack and this and page allocator might be called from deeper call chains. > Signed-off-by: Wei Yang > --- > mm/page_alloc.c | 52 ++++++++++++++++++++++++++----------------------- > 1 file changed, 28 insertions(+), 24 deletions(-) > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index a43b9d2482f2..a7b793c739fc 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -609,7 +609,7 @@ static inline int __maybe_unused bad_range(struct zone *zone, struct page *page) > } > #endif > > -static void bad_page(struct page *page, const char *reason, > +static void bad_page(struct page *page, int nr, const char **reason, > unsigned long bad_flags) > { > static unsigned long resume; > @@ -638,7 +638,7 @@ static void bad_page(struct page *page, const char *reason, > > pr_alert("BUG: Bad page state in process %s pfn:%05lx\n", > current->comm, page_to_pfn(page)); > - __dump_page(page, 1, &reason); > + __dump_page(page, nr, reason); > bad_flags &= page->flags; > if (bad_flags) > pr_alert("bad because of flags: %#lx(%pGp)\n", > @@ -1027,27 +1027,25 @@ static inline bool page_expected_state(struct page *page, > > static void free_pages_check_bad(struct page *page) > { > - const char *bad_reason; > - unsigned long bad_flags; > - > - bad_reason = NULL; > - bad_flags = 0; > + const char *bad_reason[5]; > + unsigned long bad_flags = 0; > + int nr = 0; > > if (unlikely(atomic_read(&page->_mapcount) != -1)) > - bad_reason = "nonzero mapcount"; > + bad_reason[nr++] = "nonzero mapcount"; > if (unlikely(page->mapping != NULL)) > - bad_reason = "non-NULL mapping"; > + bad_reason[nr++] = "non-NULL mapping"; > if (unlikely(page_ref_count(page) != 0)) > - bad_reason = "nonzero _refcount"; > + bad_reason[nr++] = "nonzero _refcount"; > if (unlikely(page->flags & PAGE_FLAGS_CHECK_AT_FREE)) { > - bad_reason = "PAGE_FLAGS_CHECK_AT_FREE flag(s) set"; > + bad_reason[nr++] = "PAGE_FLAGS_CHECK_AT_FREE flag(s) set"; > bad_flags = PAGE_FLAGS_CHECK_AT_FREE; > } > #ifdef CONFIG_MEMCG > if (unlikely(page->mem_cgroup)) > - bad_reason = "page still charged to cgroup"; > + bad_reason[nr++] = "page still charged to cgroup"; > #endif > - bad_page(page, bad_reason, bad_flags); > + bad_page(page, nr, bad_reason, bad_flags); > } > > static inline int free_pages_check(struct page *page) > @@ -1062,6 +1060,7 @@ static inline int free_pages_check(struct page *page) > > static int free_tail_pages_check(struct page *head_page, struct page *page) > { > + const char *reason; > int ret = 1; > > /* > @@ -1078,7 +1077,8 @@ static int free_tail_pages_check(struct page *head_page, struct page *page) > case 1: > /* the first tail page: ->mapping may be compound_mapcount() */ > if (unlikely(compound_mapcount(page))) { > - bad_page(page, "nonzero compound_mapcount", 0); > + reason = "nonzero compound_mapcount"; > + bad_page(page, 1, &reason, 0); > goto out; > } > break; > @@ -1090,17 +1090,20 @@ static int free_tail_pages_check(struct page *head_page, struct page *page) > break; > default: > if (page->mapping != TAIL_MAPPING) { > - bad_page(page, "corrupted mapping in tail page", 0); > + reason = "corrupted mapping in tail page"; > + bad_page(page, 1, &reason, 0); > goto out; > } > break; > } > if (unlikely(!PageTail(page))) { > - bad_page(page, "PageTail not set", 0); > + reason = "PageTail not set"; > + bad_page(page, 1, &reason, 0); > goto out; > } > if (unlikely(compound_head(page) != head_page)) { > - bad_page(page, "compound_head not consistent", 0); > + reason = "compound_head not consistent"; > + bad_page(page, 1, &reason, 0); > goto out; > } > ret = 0; > @@ -2041,29 +2044,30 @@ static inline void expand(struct zone *zone, struct page *page, > > static void check_new_page_bad(struct page *page) > { > - const char *bad_reason = NULL; > + const char *bad_reason[5]; > unsigned long bad_flags = 0; > + int nr = 0; > > if (unlikely(atomic_read(&page->_mapcount) != -1)) > - bad_reason = "nonzero mapcount"; > + bad_reason[nr++] = "nonzero mapcount"; > if (unlikely(page->mapping != NULL)) > - bad_reason = "non-NULL mapping"; > + bad_reason[nr++] = "non-NULL mapping"; > if (unlikely(page_ref_count(page) != 0)) > - bad_reason = "nonzero _refcount"; > + bad_reason[nr++] = "nonzero _refcount"; > if (unlikely(page->flags & __PG_HWPOISON)) { > /* Don't complain about hwpoisoned pages */ > page_mapcount_reset(page); /* remove PageBuddy */ > return; > } > if (unlikely(page->flags & PAGE_FLAGS_CHECK_AT_PREP)) { > - bad_reason = "PAGE_FLAGS_CHECK_AT_PREP flag set"; > + bad_reason[nr++] = "PAGE_FLAGS_CHECK_AT_PREP flag set"; > bad_flags = PAGE_FLAGS_CHECK_AT_PREP; > } > #ifdef CONFIG_MEMCG > if (unlikely(page->mem_cgroup)) > - bad_reason = "page still charged to cgroup"; > + bad_reason[nr++] = "page still charged to cgroup"; > #endif > - bad_page(page, bad_reason, bad_flags); > + bad_page(page, 1, bad_reason, bad_flags); > } > > /* > -- > 2.17.1 > -- Michal Hocko SUSE Labs