From: Wei Yang <richardw.yang@linux.intel.com>
To: Anshuman Khandual <anshuman.khandual@arm.com>
Cc: Wei Yang <richardw.yang@linux.intel.com>,
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()
Date: Mon, 20 Jan 2020 20:33:43 +0800 [thread overview]
Message-ID: <20200120123343.GD18028@richard> (raw)
In-Reply-To: <d234b84b-b735-09f2-d7f1-e048fb9a3f87@arm.com>
On Mon, Jan 20, 2020 at 12:03:20PM +0530, Anshuman Khandual wrote:
>
>
>On 01/20/2020 08:34 AM, Wei Yang wrote:
>> Now we can pass all bad reasons to __dump_page().
>>
>> Signed-off-by: Wei Yang <richardw.yang@linux.intel.com>
>> ---
>> 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];
>
>s/5/NR_BAD_PAGE_REASONS
>
>
>> + 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];
>
>s/5/NR_BAD_PAGE_REASONS
>
>> 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);
>This should be 'nr' here instead ?
>
Thanks, I missed this one.
>> }
>>
>> /*
>>
--
Wei Yang
Help you, Help me
next prev parent reply other threads:[~2020-01-20 12:33 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 [this message]
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 ` [Patch v2 4/4] mm/page_alloc.c: extract commom part to check page Wei Yang
2020-01-20 6:43 ` 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=20200120123343.GD18028@richard \
--to=richardw.yang@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=anshuman.khandual@arm.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.