linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Matthew Wilcox <willy@infradead.org>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: linux-mm@kvack.org, Matthew Wilcox <mawilcox@microsoft.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>,
	Christoph Lameter <cl@linux.com>,
	Lai Jiangshan <laijs@cn.fujitsu.com>,
	Pekka Enberg <penberg@kernel.org>
Subject: Re: [PATCH v3 02/14] mm: Split page_type out from _mapcount
Date: Thu, 19 Apr 2018 04:16:01 -0700	[thread overview]
Message-ID: <20180419111601.GA5556@bombadil.infradead.org> (raw)
In-Reply-To: <dba1674f-6126-8cce-4730-24d69e594c97@suse.cz>

On Thu, Apr 19, 2018 at 11:04:23AM +0200, Vlastimil Babka wrote:
> On 04/18/2018 08:49 PM, Matthew Wilcox wrote:
> > From: Matthew Wilcox <mawilcox@microsoft.com>
> > 
> > We're already using a union of many fields here, so stop abusing the
> > _mapcount and make page_type its own field.  That implies renaming some
> > of the machinery that creates PageBuddy, PageBalloon and PageKmemcg;
> > bring back the PG_buddy, PG_balloon and PG_kmemcg names.
> > 
> > As suggested by Kirill, make page_type a bitmask.  Because it starts out
> > life as -1 (thanks to sharing the storage with _mapcount), setting a
> > page flag means clearing the appropriate bit.  This gives us space for
> > probably twenty or so extra bits (depending how paranoid we want to be
> > about _mapcount underflow).
> > 
> > Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
> > Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> > ---
> >  include/linux/mm_types.h   | 13 ++++++-----
> >  include/linux/page-flags.h | 45 ++++++++++++++++++++++----------------
> >  kernel/crash_core.c        |  1 +
> >  mm/page_alloc.c            | 13 +++++------
> >  scripts/tags.sh            |  6 ++---
> >  5 files changed, 43 insertions(+), 35 deletions(-)
> 
> ...
> 
> > diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
> > index e34a27727b9a..8c25b28a35aa 100644
> > --- a/include/linux/page-flags.h
> > +++ b/include/linux/page-flags.h
> > @@ -642,49 +642,56 @@ PAGEFLAG_FALSE(DoubleMap)
> >  #endif
> >  
> >  /*
> > - * For pages that are never mapped to userspace, page->mapcount may be
> > - * used for storing extra information about page type. Any value used
> > - * for this purpose must be <= -2, but it's better start not too close
> > - * to -2 so that an underflow of the page_mapcount() won't be mistaken
> > - * for a special page.
> > + * For pages that are never mapped to userspace (and aren't PageSlab),
> > + * page_type may be used.  Because it is initialised to -1, we invert the
> > + * sense of the bit, so __SetPageFoo *clears* the bit used for PageFoo, and
> > + * __ClearPageFoo *sets* the bit used for PageFoo.  We reserve a few high and
> > + * low bits so that an underflow or overflow of page_mapcount() won't be
> > + * mistaken for a page type value.
> >   */
> > -#define PAGE_MAPCOUNT_OPS(uname, lname)					\
> > +
> > +#define PAGE_TYPE_BASE	0xf0000000
> > +/* Reserve		0x0000007f to catch underflows of page_mapcount */
> > +#define PG_buddy	0x00000080
> > +#define PG_balloon	0x00000100
> > +#define PG_kmemcg	0x00000200
> > +
> > +#define PageType(page, flag)						\
> > +	((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE)
> > +
> > +#define PAGE_TYPE_OPS(uname, lname)					\
> >  static __always_inline int Page##uname(struct page *page)		\
> >  {									\
> > -	return atomic_read(&page->_mapcount) ==				\
> > -				PAGE_##lname##_MAPCOUNT_VALUE;		\
> > +	return PageType(page, PG_##lname);				\
> >  }									\
> >  static __always_inline void __SetPage##uname(struct page *page)		\
> >  {									\
> > -	VM_BUG_ON_PAGE(atomic_read(&page->_mapcount) != -1, page);	\
> > -	atomic_set(&page->_mapcount, PAGE_##lname##_MAPCOUNT_VALUE);	\
> > +	VM_BUG_ON_PAGE(!PageType(page, 0), page);			\
> 
> I think this debug test does less than you expect? IIUC you want to
> check that no type is yet set, but this will only trigger if something
> cleared one of the bits in top 0xf byte of PAGE_TYPE_BASE?
> Just keep the comparison to -1 then?

With this patchset, it becomes possible to set more than one of the
PageTye bits.  It doesn't make sense to set PageBuddy and PageKmemcg,
but maybe it makes sense to set PageKmemcg and PageTable?

So yes, I weakened this test, but I did so deliberately.

  reply	other threads:[~2018-04-19 11:16 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-18 18:48 [PATCH v3 00/14] Rearrange struct page Matthew Wilcox
2018-04-18 18:48 ` [PATCH v3 01/14] s390: Use _refcount for pgtables Matthew Wilcox
2018-04-18 18:49 ` [PATCH v3 02/14] mm: Split page_type out from _mapcount Matthew Wilcox
2018-04-19  9:04   ` Vlastimil Babka
2018-04-19 11:16     ` Matthew Wilcox [this message]
2018-04-20 15:17   ` Christopher Lameter
2018-04-20 20:43     ` Matthew Wilcox
2018-04-18 18:49 ` [PATCH v3 03/14] mm: Mark pages in use for page tables Matthew Wilcox
2018-04-19  9:30   ` Vlastimil Babka
2018-04-18 18:49 ` [PATCH v3 04/14] mm: Switch s_mem and slab_cache in struct page Matthew Wilcox
2018-04-19 11:06   ` Vlastimil Babka
2018-04-19 11:19     ` Matthew Wilcox
2018-04-18 18:49 ` [PATCH v3 05/14] mm: Move 'private' union within " Matthew Wilcox
2018-04-19 11:31   ` Vlastimil Babka
2018-04-20 15:25   ` Christopher Lameter
2018-04-20 20:27     ` Matthew Wilcox
2018-04-30  9:38   ` Kirill A. Shutemov
2018-04-18 18:49 ` [PATCH v3 06/14] mm: Move _refcount out of struct page union Matthew Wilcox
2018-04-19 11:37   ` Vlastimil Babka
2018-04-30  9:40   ` Kirill A. Shutemov
2018-04-18 18:49 ` [PATCH v3 07/14] slub: Remove page->counters Matthew Wilcox
2018-04-19 13:42   ` Vlastimil Babka
2018-04-19 14:23     ` Matthew Wilcox
2018-04-18 18:49 ` [PATCH v3 08/14] mm: Combine first three unions in struct page Matthew Wilcox
2018-04-19 13:46   ` Vlastimil Babka
2018-04-19 14:08     ` Matthew Wilcox
2018-04-30  9:42   ` Kirill A. Shutemov
2018-04-18 18:49 ` [PATCH v3 09/14] mm: Use page->deferred_list Matthew Wilcox
2018-04-19 13:23   ` Vlastimil Babka
2018-04-30  9:43   ` Kirill A. Shutemov
2018-04-18 18:49 ` [PATCH v3 10/14] mm: Move lru union within struct page Matthew Wilcox
2018-04-19 13:56   ` Vlastimil Babka
2018-04-30  9:44   ` Kirill A. Shutemov
2018-04-18 18:49 ` [PATCH v3 11/14] mm: Combine first two unions in " Matthew Wilcox
2018-04-19 14:03   ` Vlastimil Babka
2018-04-30  9:47   ` Kirill A. Shutemov
2018-04-30 12:42     ` Matthew Wilcox
2018-04-30 13:12       ` Kirill A. Shutemov
2018-04-18 18:49 ` [PATCH v3 12/14] mm: Improve struct page documentation Matthew Wilcox
2018-04-18 23:32   ` Randy Dunlap
2018-04-18 23:43     ` Matthew Wilcox
2018-04-18 18:49 ` [PATCH v3 13/14] slab,slub: Remove rcu_head size checks Matthew Wilcox
2018-04-18 18:49 ` [PATCH v3 14/14] slub: Remove kmem_cache->reserved Matthew Wilcox

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=20180419111601.GA5556@bombadil.infradead.org \
    --to=willy@infradead.org \
    --cc=akpm@linux-foundation.org \
    --cc=cl@linux.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=laijs@cn.fujitsu.com \
    --cc=linux-mm@kvack.org \
    --cc=mawilcox@microsoft.com \
    --cc=penberg@kernel.org \
    --cc=vbabka@suse.cz \
    /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).