linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Christoffer Dall <cdall@cs.columbia.edu>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: linux-mm <linux-mm@kvack.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Will Deacon <Will.Deacon@arm.com>,
	Steve Capper <Steve.Capper@arm.com>,
	"kvmarm@lists.cs.columbia.edu" <kvmarm@lists.cs.columbia.edu>,
	Andrea Arcangeli <aarcange@redhat.com>,
	"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
	Christoph Lameter <cl@linux.com>
Subject: Re: PageHead macro broken?
Date: Mon, 24 Dec 2012 14:55:37 -0500	[thread overview]
Message-ID: <CAEDV+gL=N3LzAD-xqvU-4KnJOWBoi8ZRXiAaWxokkr06KtgYvA@mail.gmail.com> (raw)
In-Reply-To: <CA+55aFxb63WMysJ-HQbam_JH05Bqp=XhrzokrSM-yvoaAzPASg@mail.gmail.com>

On Mon, Dec 24, 2012 at 2:21 PM, Linus Torvalds
<torvalds@linux-foundation.org> wrote:
> On Mon, Dec 24, 2012 at 10:53 AM, Christoffer Dall
> <cdall@cs.columbia.edu> wrote:
>>
>> I think I may have found an issue with the PageHead macro, which
>> returns true for tail compound pages when CONFIG_PAGEFLAGS_EXTENDED is
>> not defined.
>
> Hmm. Your patch *looks* obviously correct, in that it actually makes
> the code match the comment just above it. And making PageHead() test
> just the "compound" flag (and thus a tail-page would trigger it too)
> sounds wrong. But I join you in the "let's check the expected
> semantics with the people who use it" chorus.
>
> The fact that it fixes a problem on KVM/ARM is obviously another good sign.
>
> At the same time, I wonder why it hasn't shown up as a problem on
> x86-32. On x86-64 PAGEFLAGS_EXTENDED is always true, but afaik, it
> should be possible to trigger this on 32-bit architectures if you just
> have SPARSEMEM && !SPARSEMEM_VMEMMAP.
>
> And SPARSEMEM on x86-32 is enabled with NUMA or EXPERIMENTAL set. And
> afaik, x86-32 never has SPARSEMEM_VMEMMAP. So this should not be a
> very uncommon setup.

That's exactly why I was hesitant with just sending this out as a
patch. Then on the other hand, bugs from this problem *might* be so
subtle that it was simply not noticed.

>
> Added Andrea and Kirill to the Cc, since most of the *uses* of
> PageHead() in the generic VM code are attributed to either of them
> according to "git blame". Left the rest of the email quoted for the
> new participants.. Also, you seem to have used Christoph's old SGI
> email address that I don't think is in use any more.

Yep, just grabbed the e-mail from the commit that introduced the
problem, wasn't aware of the address change. Sorry about that.

Oh, and merry christmas :)

-Christoffer

>
> ---
>> I'm not sure however, if this indeed is the intended behavior and I'm
>> missing something overall. In any case, the below patch is a proposed
>> fix, which does fix a bug showing up on KVM/ARM with huge pages.
>>
>> Your input would be greatly appreciated.
>>
>> From: Christoffer Dall <cdall@cs.columbia.edu>
>> Date: Fri, 21 Dec 2012 13:03:50 -0500
>> Subject: [PATCH] mm: Fix PageHead when !CONFIG_PAGEFLAGS_EXTENDED
>>
>> Unfortunately with !CONFIG_PAGEFLAGS_EXTENDED, (!PageHead) is false, and
>> (PageHead) is true, for tail pages.  If this is indeed the intended
>> behavior, which I doubt because it breaks cache cleaning on some ARM
>> systems, then the nomenclature is highly problematic.
>>
>> This patch makes sure PageHead is only true for head pages and PageTail
>> is only true for tail pages, and neither is true for non-compound pages.
>>
>> Signed-off-by: Christoffer Dall <cdall@cs.columbia.edu>
>> ---
>>  include/linux/page-flags.h |    8 +++++++-
>>  1 file changed, 7 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
>> index b5d1384..70473da 100644
>> --- a/include/linux/page-flags.h
>> +++ b/include/linux/page-flags.h
>> @@ -362,7 +362,7 @@ static inline void ClearPageCompound(struct page *page)
>>   * pages on the LRU and/or pagecache.
>>   */
>>  TESTPAGEFLAG(Compound, compound)
>> -__PAGEFLAG(Head, compound)
>> +__SETPAGEFLAG(Head, compound)  __CLEARPAGEFLAG(Head, compound)
>>
>>  /*
>>   * PG_reclaim is used in combination with PG_compound to mark the
>> @@ -374,8 +374,14 @@ __PAGEFLAG(Head, compound)
>>   * PG_compound & PG_reclaim => Tail page
>>   * PG_compound & ~PG_reclaim => Head page
>>   */
>> +#define PG_head_mask ((1L << PG_compound))
>>  #define PG_head_tail_mask ((1L << PG_compound) | (1L << PG_reclaim))
>>
>> +static inline int PageHead(struct page *page)
>> +{
>> + return ((page->flags & PG_head_tail_mask) == PG_head_mask);
>> +}
>> +
>>  static inline int PageTail(struct page *page)
>>  {
>>   return ((page->flags & PG_head_tail_mask) == PG_head_tail_mask);
>> --
>> 1.7.9.5
>>
>>
>> Thanks!
>> -Christoffer

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2012-12-24 19:55 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-24 18:53 Christoffer Dall
2012-12-24 19:21 ` Linus Torvalds
2012-12-24 19:55   ` Christoffer Dall [this message]
2012-12-25  1:28   ` Andrea Arcangeli
2013-01-06  2:53     ` Simon Jeons
2012-12-27 16:00 ` Christoph Lameter

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='CAEDV+gL=N3LzAD-xqvU-4KnJOWBoi8ZRXiAaWxokkr06KtgYvA@mail.gmail.com' \
    --to=cdall@cs.columbia.edu \
    --cc=Steve.Capper@arm.com \
    --cc=Will.Deacon@arm.com \
    --cc=aarcange@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=cl@linux.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-mm@kvack.org \
    --cc=torvalds@linux-foundation.org \
    /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