All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wei Yang <richardw.yang@linux.intel.com>
To: David Rientjes <rientjes@google.com>
Cc: Wei Yang <richardw.yang@linux.intel.com>,
	akpm@linux-foundation.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/4] mm/page_alloc.c: extract commom part to check page
Date: Mon, 20 Jan 2020 08:33:59 +0800	[thread overview]
Message-ID: <20200120003359.GB26292@richard> (raw)
In-Reply-To: <alpine.DEB.2.21.2001191401240.43388@chino.kir.corp.google.com>

On Sun, Jan 19, 2020 at 02:06:18PM -0800, David Rientjes wrote:
>On Sun, 19 Jan 2020, Wei Yang wrote:
>
>> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
>> index d047bf7d8fd4..8cd06729169f 100644
>> --- a/mm/page_alloc.c
>> +++ b/mm/page_alloc.c
>> @@ -1025,13 +1025,9 @@ static inline bool page_expected_state(struct page *page,
>>  	return true;
>>  }
>>  
>> -static void free_pages_check_bad(struct page *page)
>> +static inline const char *__check_page(struct page *page)
>>  {
>> -	const char *bad_reason;
>> -	unsigned long bad_flags;
>> -
>> -	bad_reason = NULL;
>> -	bad_flags = 0;
>> +	const char *bad_reason = NULL;
>>  
>>  	if (unlikely(atomic_read(&page->_mapcount) != -1))
>>  		bad_reason = "nonzero mapcount";
>> @@ -1039,14 +1035,23 @@ static void free_pages_check_bad(struct page *page)
>>  		bad_reason = "non-NULL mapping";
>>  	if (unlikely(page_ref_count(page) != 0))
>>  		bad_reason = "nonzero _refcount";
>> -	if (unlikely(page->flags & PAGE_FLAGS_CHECK_AT_FREE)) {
>> -		bad_reason = "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";
>>  #endif
>> +	return bad_reason;
>> +}
>> +
>> +static void free_pages_check_bad(struct page *page)
>> +{
>> +	const char *bad_reason = NULL;
>> +	unsigned long bad_flags = 0;
>> +
>> +	bad_reason = __check_page(page);
>> +	if (unlikely(page->flags & PAGE_FLAGS_CHECK_AT_FREE)) {
>> +		bad_reason = "PAGE_FLAGS_CHECK_AT_FREE flag(s) set";
>> +		bad_flags = PAGE_FLAGS_CHECK_AT_FREE;
>> +	}
>>  	bad_page(page, bad_reason, bad_flags);
>>  }
>>  
>> @@ -2044,12 +2049,7 @@ static void check_new_page_bad(struct page *page)
>>  	const char *bad_reason = NULL;
>>  	unsigned long bad_flags = 0;
>>  
>> -	if (unlikely(atomic_read(&page->_mapcount) != -1))
>> -		bad_reason = "nonzero mapcount";
>> -	if (unlikely(page->mapping != NULL))
>> -		bad_reason = "non-NULL mapping";
>> -	if (unlikely(page_ref_count(page) != 0))
>> -		bad_reason = "nonzero _refcount";
>> +	bad_reason = __check_page(page);
>>  	if (unlikely(page->flags & __PG_HWPOISON)) {
>>  		bad_reason = "HWPoisoned (hardware-corrupted)";
>>  		bad_flags = __PG_HWPOISON;
>> @@ -2061,10 +2061,6 @@ static void check_new_page_bad(struct page *page)
>>  		bad_reason = "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";
>> -#endif
>>  	bad_page(page, bad_reason, bad_flags);
>>  }
>>  
>
>I think this is compounding a previous problem in these functions: these 
>are all "if" clauses, not "else if" clauses so they are presumably ordered 
>based on least significant to most significant (we only see the last 
>bad_reason that we find).  For the page->mem_cgroup check, this leaves 
>bad_flags set but it doesn't match bad_reason.
>

I have thought about this. And curious about the order of those reasons.

>Could you instead fix the problem with these functions so that we actually 
>list *all* the problems with the page rather than only the last 
>conditional that is true?

Sure, thanks for the suggestion.

-- 
Wei Yang
Help you, Help me

  reply	other threads:[~2020-01-20  0:36 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-19 13:14 [PATCH 0/4] mm/page_alloc.c: cleanup on check page Wei Yang
2020-01-19 13:14 ` [PATCH 1/4] mm/page_alloc.c: extract commom part to " Wei Yang
2020-01-19 22:06   ` David Rientjes
2020-01-19 22:06     ` David Rientjes
2020-01-20  0:33     ` Wei Yang [this message]
2020-01-19 13:14 ` [PATCH 2/4] mm/page_alloc.c: rename free_pages_check_bad() to check_free_page_bad() Wei Yang
2020-01-19 22:07   ` David Rientjes
2020-01-19 22:07     ` David Rientjes
2020-01-20  0:36     ` Wei Yang
2020-01-19 13:14 ` [PATCH 3/4] mm/page_alloc.c: rename free_pages_check() to check_free_page() Wei Yang
2020-01-19 13:14 ` [PATCH 4/4] mm/page_alloc.c: bad_[reason|flags] is not necessary when PageHWPoison Wei Yang
2020-01-19 22:07   ` David Rientjes
2020-01-19 22:07     ` David Rientjes

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=20200120003359.GB26292@richard \
    --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 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.