linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Wei Yang <richardw.yang@linux.intel.com>
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	[thread overview]
Message-ID: <20200120030415.15925-5-richardw.yang@linux.intel.com> (raw)
In-Reply-To: <20200120030415.15925-1-richardw.yang@linux.intel.com>

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 <richardw.yang@linux.intel.com>
---
 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);
 }
 
-- 
2.17.1


  parent reply	other threads:[~2020-01-20  3:04 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-20  3:04 [Patch v2 0/4] mm/page_alloc.c: cleanup on check page Wei Yang
2020-01-20  3:04 ` [Patch v2 1/4] mm: enable dump several reasons for __dump_page() Wei Yang
2020-01-20  6:12   ` Anshuman Khandual
2020-01-20  8:55     ` Wei Yang
2020-01-21  5:20       ` Anshuman Khandual
2020-01-22  0:58         ` Wei Yang
2020-01-26  2:44         ` Wei Yang
2020-01-20  3:04 ` [Patch v2 2/4] mm/page_alloc.c: bad_[reason|flags] is not necessary when PageHWPoison Wei Yang
2020-01-20  6:28   ` Anshuman Khandual
2020-01-20 12:13     ` Wei Yang
2020-01-20 10:17   ` Michal Hocko
2020-01-20 12:20   ` David Hildenbrand
2020-01-20  3:04 ` [Patch v2 3/4] mm/page_alloc.c: pass all bad reasons to bad_page() Wei Yang
2020-01-20  6:33   ` Anshuman Khandual
2020-01-20 12:33     ` Wei Yang
2020-01-20 10:22   ` Michal Hocko
2020-01-20 12:19     ` David Hildenbrand
2020-01-21  1:49       ` Wei Yang
2020-01-21  6:08     ` Anshuman Khandual
2020-01-21  8:47       ` Michal Hocko
2020-01-20  3:04 ` Wei Yang [this message]
2020-01-20  6:43   ` [Patch v2 4/4] mm/page_alloc.c: extract commom part to check page Anshuman Khandual
2020-01-20 12:36     ` Wei Yang
2020-01-21  4:49       ` Anshuman Khandual
2020-01-22  1:00         ` Wei Yang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200120030415.15925-5-richardw.yang@linux.intel.com \
    --to=richardw.yang@linux.intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=rientjes@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).