From patchwork Mon Jan 20 03:04:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Yang X-Patchwork-Id: 11340931 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AC26B921 for ; Mon, 20 Jan 2020 03:04:28 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 7A6F120730 for ; Mon, 20 Jan 2020 03:04:28 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7A6F120730 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 604A26B059B; Sun, 19 Jan 2020 22:04:27 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 58F856B059C; Sun, 19 Jan 2020 22:04:27 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 430BC6B059D; Sun, 19 Jan 2020 22:04:27 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0201.hostedemail.com [216.40.44.201]) by kanga.kvack.org (Postfix) with ESMTP id 2D69B6B059B for ; Sun, 19 Jan 2020 22:04:27 -0500 (EST) Received: from smtpin27.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with SMTP id A701C181AC9CC for ; Mon, 20 Jan 2020 03:04:26 +0000 (UTC) X-FDA: 76396519332.27.rings12_43d453fb70e47 X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,richardw.yang@linux.intel.com,:akpm@linux-foundation.org:richardw.yang@linux.intel.com:linux-kernel@vger.kernel.org::rientjes@google.com,RULES_HIT:30045:30054:30056:30070,0,RBL:192.55.52.93:@linux.intel.com:.lbl8.mailshell.net-62.18.0.100 64.95.201.95,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fn,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:33,LUA_SUMMARY:none X-HE-Tag: rings12_43d453fb70e47 X-Filterd-Recvd-Size: 3690 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by imf20.hostedemail.com (Postfix) with ESMTP for ; Mon, 20 Jan 2020 03:04:25 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jan 2020 19:04:24 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,340,1574150400"; d="scan'208";a="306802495" Received: from richard.sh.intel.com (HELO localhost) ([10.239.159.54]) by orsmga001.jf.intel.com with ESMTP; 19 Jan 2020 19:04:22 -0800 From: Wei Yang To: akpm@linux-foundation.org, richardw.yang@linux.intel.com Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, rientjes@google.com Subject: [Patch v2 1/4] mm: enable dump several reasons for __dump_page() Date: Mon, 20 Jan 2020 11:04:12 +0800 Message-Id: <20200120030415.15925-2-richardw.yang@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200120030415.15925-1-richardw.yang@linux.intel.com> References: <20200120030415.15925-1-richardw.yang@linux.intel.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: This is a preparation to dump all reasons during check page. Signed-off-by: Wei Yang --- include/linux/mmdebug.h | 2 +- mm/debug.c | 11 ++++++----- mm/page_alloc.c | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/include/linux/mmdebug.h b/include/linux/mmdebug.h index 2ad72d2c8cc5..f0a612db8bae 100644 --- a/include/linux/mmdebug.h +++ b/include/linux/mmdebug.h @@ -10,7 +10,7 @@ struct vm_area_struct; struct mm_struct; extern void dump_page(struct page *page, const char *reason); -extern void __dump_page(struct page *page, const char *reason); +extern void __dump_page(struct page *page, int num, const char **reason); void dump_vma(const struct vm_area_struct *vma); void dump_mm(const struct mm_struct *mm); diff --git a/mm/debug.c b/mm/debug.c index 0461df1207cb..a8ac6f951f9f 100644 --- a/mm/debug.c +++ b/mm/debug.c @@ -42,11 +42,11 @@ const struct trace_print_flags vmaflag_names[] = { {0, NULL} }; -void __dump_page(struct page *page, const char *reason) +void __dump_page(struct page *page, int num, const char **reason) { struct address_space *mapping; bool page_poisoned = PagePoisoned(page); - int mapcount; + int mapcount, i; /* * If struct page is poisoned don't access Page*() functions as that @@ -97,8 +97,9 @@ void __dump_page(struct page *page, const char *reason) sizeof(unsigned long), page, sizeof(struct page), false); - if (reason) - pr_warn("page dumped because: %s\n", reason); + pr_warn("page dumped because:\n"); + for (i = 0; i < num; i++) + pr_warn("\t%s\n", reason[i]); #ifdef CONFIG_MEMCG if (!page_poisoned && page->mem_cgroup) @@ -108,7 +109,7 @@ void __dump_page(struct page *page, const char *reason) void dump_page(struct page *page, const char *reason) { - __dump_page(page, reason); + __dump_page(page, 1, &reason); dump_page_owner(page); } EXPORT_SYMBOL(dump_page); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index d047bf7d8fd4..0cf6218aaba7 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -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, reason); + __dump_page(page, 1, &reason); bad_flags &= page->flags; if (bad_flags) pr_alert("bad because of flags: %#lx(%pGp)\n", From patchwork Mon Jan 20 03:04:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Yang X-Patchwork-Id: 11340933 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C852F921 for ; Mon, 20 Jan 2020 03:04:30 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id AC9B1206D7 for ; Mon, 20 Jan 2020 03:04:30 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AC9B1206D7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 4F41A6B059D; Sun, 19 Jan 2020 22:04:28 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 476A16B059E; Sun, 19 Jan 2020 22:04:28 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1E8046B059F; Sun, 19 Jan 2020 22:04:28 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0067.hostedemail.com [216.40.44.67]) by kanga.kvack.org (Postfix) with ESMTP id EAD906B059D for ; Sun, 19 Jan 2020 22:04:27 -0500 (EST) Received: from smtpin18.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with SMTP id 85C3E180AD811 for ; Mon, 20 Jan 2020 03:04:27 +0000 (UTC) X-FDA: 76396519374.18.train93_43f571671bf48 X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,richardw.yang@linux.intel.com,:akpm@linux-foundation.org:richardw.yang@linux.intel.com:linux-kernel@vger.kernel.org::rientjes@google.com,RULES_HIT:30054,0,RBL:192.55.52.93:@linux.intel.com:.lbl8.mailshell.net-62.18.0.100 64.95.201.95,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fn,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:25,LUA_SUMMARY:none X-HE-Tag: train93_43f571671bf48 X-Filterd-Recvd-Size: 2136 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by imf20.hostedemail.com (Postfix) with ESMTP for ; Mon, 20 Jan 2020 03:04:26 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jan 2020 19:04:26 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,340,1574150400"; d="scan'208";a="306802502" Received: from richard.sh.intel.com (HELO localhost) ([10.239.159.54]) by orsmga001.jf.intel.com with ESMTP; 19 Jan 2020 19:04:24 -0800 From: Wei Yang To: akpm@linux-foundation.org, richardw.yang@linux.intel.com Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, rientjes@google.com Subject: [Patch v2 2/4] mm/page_alloc.c: bad_[reason|flags] is not necessary when PageHWPoison Date: Mon, 20 Jan 2020 11:04:13 +0800 Message-Id: <20200120030415.15925-3-richardw.yang@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200120030415.15925-1-richardw.yang@linux.intel.com> References: <20200120030415.15925-1-richardw.yang@linux.intel.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000502, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Since function returns directly, bad_[reason|flags] is not used any where. This is a following cleanup for commit e570f56cccd21 ("mm: check_new_page_bad() directly returns in __PG_HWPOISON case") Signed-off-by: Wei Yang Acked-by: David Rientjes Acked-by: Michal Hocko Reviewed-by: David Hildenbrand --- mm/page_alloc.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 0cf6218aaba7..a43b9d2482f2 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2051,8 +2051,6 @@ static void check_new_page_bad(struct page *page) if (unlikely(page_ref_count(page) != 0)) bad_reason = "nonzero _refcount"; if (unlikely(page->flags & __PG_HWPOISON)) { - bad_reason = "HWPoisoned (hardware-corrupted)"; - bad_flags = __PG_HWPOISON; /* Don't complain about hwpoisoned pages */ page_mapcount_reset(page); /* remove PageBuddy */ return; From patchwork Mon Jan 20 03:04:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Yang X-Patchwork-Id: 11340935 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AFD7B14B7 for ; Mon, 20 Jan 2020 03:04:32 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 86BDA206D7 for ; Mon, 20 Jan 2020 03:04:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 86BDA206D7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 9FCB86B059F; Sun, 19 Jan 2020 22:04:30 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 985C56B05A0; Sun, 19 Jan 2020 22:04:30 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 826406B05A1; Sun, 19 Jan 2020 22:04:30 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0222.hostedemail.com [216.40.44.222]) by kanga.kvack.org (Postfix) with ESMTP id 60B5F6B059F for ; Sun, 19 Jan 2020 22:04:30 -0500 (EST) Received: from smtpin06.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with SMTP id 0A7DD180AD811 for ; Mon, 20 Jan 2020 03:04:30 +0000 (UTC) X-FDA: 76396519500.06.lip44_445362305cb0d X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,richardw.yang@linux.intel.com,:akpm@linux-foundation.org:richardw.yang@linux.intel.com:linux-kernel@vger.kernel.org::rientjes@google.com,RULES_HIT:30036:30045:30054:30056:30090,0,RBL:192.55.52.93:@linux.intel.com:.lbl8.mailshell.net-62.18.0.100 64.95.201.95,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fn,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:23,LUA_SUMMARY:none X-HE-Tag: lip44_445362305cb0d X-Filterd-Recvd-Size: 6125 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by imf37.hostedemail.com (Postfix) with ESMTP for ; Mon, 20 Jan 2020 03:04:29 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jan 2020 19:04:28 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,340,1574150400"; d="scan'208";a="306802521" Received: from richard.sh.intel.com (HELO localhost) ([10.239.159.54]) by orsmga001.jf.intel.com with ESMTP; 19 Jan 2020 19:04:26 -0800 From: Wei Yang To: akpm@linux-foundation.org, richardw.yang@linux.intel.com Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, rientjes@google.com Subject: [Patch v2 3/4] mm/page_alloc.c: pass all bad reasons to bad_page() Date: Mon, 20 Jan 2020 11:04:14 +0800 Message-Id: <20200120030415.15925-4-richardw.yang@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200120030415.15925-1-richardw.yang@linux.intel.com> References: <20200120030415.15925-1-richardw.yang@linux.intel.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Now we can pass all bad reasons to __dump_page(). 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); } /* From patchwork Mon Jan 20 03:04:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Yang X-Patchwork-Id: 11340937 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DE26E14B4 for ; Mon, 20 Jan 2020 03:04:34 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id B1DD920684 for ; Mon, 20 Jan 2020 03:04:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B1DD920684 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id D306F6B05A0; Sun, 19 Jan 2020 22:04:31 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id C6D8D6B05A2; Sun, 19 Jan 2020 22:04:31 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AC05F6B05A3; Sun, 19 Jan 2020 22:04:31 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0210.hostedemail.com [216.40.44.210]) by kanga.kvack.org (Postfix) with ESMTP id 8F3DD6B05A0 for ; Sun, 19 Jan 2020 22:04:31 -0500 (EST) Received: from smtpin06.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with SMTP id 345E92DFC for ; Mon, 20 Jan 2020 03:04:31 +0000 (UTC) X-FDA: 76396519542.06.wash59_447f90edc4810 X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,richardw.yang@linux.intel.com,:akpm@linux-foundation.org:richardw.yang@linux.intel.com:linux-kernel@vger.kernel.org::rientjes@google.com,RULES_HIT:30029:30046:30054:30070,0,RBL:192.55.52.93:@linux.intel.com:.lbl8.mailshell.net-62.18.0.100 64.95.201.95,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fn,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:24,LUA_SUMMARY:none X-HE-Tag: wash59_447f90edc4810 X-Filterd-Recvd-Size: 5565 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by imf37.hostedemail.com (Postfix) with ESMTP for ; Mon, 20 Jan 2020 03:04:30 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jan 2020 19:04:30 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,340,1574150400"; d="scan'208";a="306802525" Received: from richard.sh.intel.com (HELO localhost) ([10.239.159.54]) by orsmga001.jf.intel.com with ESMTP; 19 Jan 2020 19:04:28 -0800 From: Wei Yang To: akpm@linux-foundation.org, richardw.yang@linux.intel.com Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, rientjes@google.com Subject: [Patch v2 4/4] mm/page_alloc.c: extract commom part to check page Date: Mon, 20 Jan 2020 11:04:15 +0800 Message-Id: <20200120030415.15925-5-richardw.yang@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200120030415.15925-1-richardw.yang@linux.intel.com> References: <20200120030415.15925-1-richardw.yang@linux.intel.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: During free and new page, we did some check on the status of page struct. There is some common part, just extract them. Besides this, this patch also rename two functions to keep the name convention, since free_pages_check_bad/free_pages_check are counterparts of check_new_page_bad/check_new_page. Signed-off-by: Wei Yang --- mm/page_alloc.c | 49 ++++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a7b793c739fc..7f23cc836f90 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1025,36 +1025,44 @@ static inline bool page_expected_state(struct page *page, return true; } -static void free_pages_check_bad(struct page *page) +static inline int __check_page(struct page *page, int nr, + const char **bad_reason) { - const char *bad_reason[5]; - unsigned long bad_flags = 0; - int nr = 0; - if (unlikely(atomic_read(&page->_mapcount) != -1)) bad_reason[nr++] = "nonzero mapcount"; if (unlikely(page->mapping != NULL)) bad_reason[nr++] = "non-NULL mapping"; if (unlikely(page_ref_count(page) != 0)) bad_reason[nr++] = "nonzero _refcount"; - if (unlikely(page->flags & PAGE_FLAGS_CHECK_AT_FREE)) { - 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[nr++] = "page still charged to cgroup"; #endif + + return nr; +} + +static void check_free_page_bad(struct page *page) +{ + const char *bad_reason[5]; + unsigned long bad_flags = 0; + int nr = 0; + + nr = __check_page(page, nr, bad_reason); + if (unlikely(page->flags & PAGE_FLAGS_CHECK_AT_FREE)) { + bad_reason[nr++] = "PAGE_FLAGS_CHECK_AT_FREE flag(s) set"; + bad_flags = PAGE_FLAGS_CHECK_AT_FREE; + } bad_page(page, nr, bad_reason, bad_flags); } -static inline int free_pages_check(struct page *page) +static inline int check_free_page(struct page *page) { if (likely(page_expected_state(page, PAGE_FLAGS_CHECK_AT_FREE))) return 0; /* Something has gone sideways, find it */ - free_pages_check_bad(page); + check_free_page_bad(page); return 1; } @@ -1145,7 +1153,7 @@ static __always_inline bool free_pages_prepare(struct page *page, for (i = 1; i < (1 << order); i++) { if (compound) bad += free_tail_pages_check(page, page + i); - if (unlikely(free_pages_check(page + i))) { + if (unlikely(check_free_page(page + i))) { bad++; continue; } @@ -1157,7 +1165,7 @@ static __always_inline bool free_pages_prepare(struct page *page, if (memcg_kmem_enabled() && PageKmemcg(page)) __memcg_kmem_uncharge(page, order); if (check_free) - bad += free_pages_check(page); + bad += check_free_page(page); if (bad) return false; @@ -1204,7 +1212,7 @@ static bool free_pcp_prepare(struct page *page) static bool bulkfree_pcp_prepare(struct page *page) { if (debug_pagealloc_enabled_static()) - return free_pages_check(page); + return check_free_page(page); else return false; } @@ -1225,7 +1233,7 @@ static bool free_pcp_prepare(struct page *page) static bool bulkfree_pcp_prepare(struct page *page) { - return free_pages_check(page); + return check_free_page(page); } #endif /* CONFIG_DEBUG_VM */ @@ -2048,12 +2056,7 @@ static void check_new_page_bad(struct page *page) unsigned long bad_flags = 0; int nr = 0; - if (unlikely(atomic_read(&page->_mapcount) != -1)) - bad_reason[nr++] = "nonzero mapcount"; - if (unlikely(page->mapping != NULL)) - bad_reason[nr++] = "non-NULL mapping"; - if (unlikely(page_ref_count(page) != 0)) - bad_reason[nr++] = "nonzero _refcount"; + nr = __check_page(page, nr, bad_reason); if (unlikely(page->flags & __PG_HWPOISON)) { /* Don't complain about hwpoisoned pages */ page_mapcount_reset(page); /* remove PageBuddy */ @@ -2063,10 +2066,6 @@ static void check_new_page_bad(struct page *page) 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[nr++] = "page still charged to cgroup"; -#endif bad_page(page, 1, bad_reason, bad_flags); }