From: Byungchul Park <byungchul@sk.com>
To: "David Hildenbrand (Arm)" <david@kernel.org>
Cc: Dragos Tatulea <dtatulea@nvidia.com>,
linux-mm@kvack.org, akpm@linux-foundation.org,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
kernel_team@skhynix.com, harry.yoo@oracle.com, ast@kernel.org,
daniel@iogearbox.net, davem@davemloft.net, kuba@kernel.org,
hawk@kernel.org, john.fastabend@gmail.com, sdf@fomichev.me,
saeedm@nvidia.com, leon@kernel.org, tariqt@nvidia.com,
mbloch@nvidia.com, andrew+netdev@lunn.ch, edumazet@google.com,
pabeni@redhat.com, lorenzo.stoakes@oracle.com,
Liam.Howlett@oracle.com, vbabka@suse.cz, rppt@kernel.org,
surenb@google.com, mhocko@suse.com, horms@kernel.org,
jackmanb@google.com, hannes@cmpxchg.org, ziy@nvidia.com,
ilias.apalodimas@linaro.org, willy@infradead.org,
brauner@kernel.org, kas@kernel.org, yuzhao@google.com,
usamaarif642@gmail.com, baolin.wang@linux.alibaba.com,
almasrymina@google.com, toke@redhat.com, asml.silence@gmail.com,
bpf@vger.kernel.org, linux-rdma@vger.kernel.org,
sfr@canb.auug.org.au, dw@davidwei.uk, ap420073@gmail.com
Subject: Re: [PATCH v4] mm: introduce a new page type for page pool in page type
Date: Wed, 13 May 2026 22:26:36 +0900 [thread overview]
Message-ID: <20260513132636.GA75142@system.software.com> (raw)
In-Reply-To: <627bb280-be44-4648-8771-5a479cda988f@kernel.org>
On Wed, May 13, 2026 at 03:02:43PM +0200, David Hildenbrand (Arm) wrote:
> On 5/13/26 14:39, Byungchul Park wrote:
> > On Wed, May 13, 2026 at 02:29:46PM +0200, David Hildenbrand (Arm) wrote:
> > On 5/13/26 14:18, Byungchul Park wrote:
> >>>
> >>> Hi,
> >>>
> >>> The problem comes from the fact that page_type and _mapcount are
> >>> union'ed but there is a case where these two information should be kept
> >>> at the same time.
> >>>
> >>> Why don't we allow these two information can be kept in the 4 bytes at
> >>> the same time until Zi Yan's work on _mapcount and page_type will be
> >>> done, instead of taking a step back?
> >>>
> >>> It can be more optimized but I suggest the approach I just mentioned:
> >>> ---
> >>> diff --git a/fs/proc/internal.h b/fs/proc/internal.h
> >>> index 64dc44832808..e5ec204866dc 100644
> >>> --- a/fs/proc/internal.h
> >>> +++ b/fs/proc/internal.h
> >>> @@ -185,8 +185,7 @@ static inline int folio_precise_page_mapcount(struct folio *folio,
> >>> {
> >>> int mapcount = atomic_read(&page->_mapcount) + 1;
> >>>
> >>> - if (page_mapcount_is_type(mapcount))
> >>> - mapcount = 0;
> >>> + mapcount = page_mapcount_clear_type(mapcount);
> >>> if (folio_test_large(folio))
> >>> mapcount += folio_entire_mapcount(folio);
> >>>
> >>> diff --git a/include/linux/mm.h b/include/linux/mm.h
> >>> index 8260e28205e9..f45064796313 100644
> >>> --- a/include/linux/mm.h
> >>> +++ b/include/linux/mm.h
> >>> @@ -1865,8 +1865,7 @@ static inline int folio_mapcount(const struct folio *folio)
> >>>
> >>> if (likely(!folio_test_large(folio))) {
> >>> mapcount = atomic_read(&folio->_mapcount) + 1;
> >>> - if (page_mapcount_is_type(mapcount))
> >>> - mapcount = 0;
> >>> + mapcount = page_mapcount_clear_type(mapcount);
> >>> return mapcount;
> >>> }
> >>> return folio_large_mapcount(folio);
> >>> diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
> >>> index 0e03d816e8b9..f3b0d1fa262d 100644
> >>> --- a/include/linux/page-flags.h
> >>> +++ b/include/linux/page-flags.h
> >>> @@ -934,9 +934,9 @@ static inline bool page_type_has_type(int page_type)
> >>> }
> >>>
> >>> /* This takes a mapcount which is one more than page->_mapcount */
> >>> -static inline bool page_mapcount_is_type(unsigned int mapcount)
> >>> +static inline unsigned int page_mapcount_clear_type(unsigned int mapcount)
> >>> {
> >>> - return page_type_has_type(mapcount - 1);
> >>> + return (unsigned int)(((int)(mapcount << 8)) >> 8);
> >>> }
> >>>
> >>> static inline bool page_has_type(const struct page *page)
> >>> @@ -953,16 +953,20 @@ static __always_inline void __folio_set_##fname(struct folio *folio) \
> >>> { \
> >>> if (folio_test_##fname(folio)) \
> >>> return; \
> >>> - VM_BUG_ON_FOLIO(data_race(folio->page.page_type) != UINT_MAX, \
> >>> + VM_BUG_ON_FOLIO(page_type_has_type(data_race(folio->page.page_type)), \
> >>> folio); \
> >>> - folio->page.page_type = (unsigned int)PGTY_##lname << 24; \
> >>> + folio->page.page_type &= ~(PGTY_mapcount_underflow << 24); \
> >>> + folio->page.page_type |= (unsigned int)PGTY_##lname << 24; \
> >>> } \
> >>> static __always_inline void __folio_clear_##fname(struct folio *folio) \
> >>> { \
> >>> - if (folio->page.page_type == UINT_MAX) \
> >>> + int mapcount; \
> >>> + \
> >>> + if (!page_type_has_type(folio->page.page_type)) \
> >>> return; \
> >>> VM_BUG_ON_FOLIO(!folio_test_##fname(folio), folio); \
> >>> - folio->page.page_type = UINT_MAX; \
> >>> + mapcount = atomic_read(&folio->page._mapcount); \
> >>> + folio->page.page_type = page_mapcount_clear_type(mapcount); \
> >>> }
> >>>
> >>> #define PAGE_TYPE_OPS(uname, lname, fname) \
> >>> @@ -975,15 +979,20 @@ static __always_inline void __SetPage##uname(struct page *page) \
> >>> { \
> >>> if (Page##uname(page)) \
> >>> return; \
> >>> - VM_BUG_ON_PAGE(data_race(page->page_type) != UINT_MAX, page); \
> >>> - page->page_type = (unsigned int)PGTY_##lname << 24; \
> >>> + VM_BUG_ON_PAGE(page_type_has_type(data_race(page->page_type)), \
> >>> + page); \
> >>> + page->page_type &= ~(PGTY_mapcount_underflow << 24); \
> >>> + page->page_type |= (unsigned int)PGTY_##lname << 24; \
> >>> } \
> >>> static __always_inline void __ClearPage##uname(struct page *page) \
> >>> { \
> >>> - if (page->page_type == UINT_MAX) \
> >>> + int mapcount; \
> >>> + \
> >>> + if (!page_type_has_type(page->page_type)) \
> >>> return; \
> >>> VM_BUG_ON_PAGE(!Page##uname(page), page); \
> >>> - page->page_type = UINT_MAX; \
> >>> + mapcount = atomic_read(&page->_mapcount); \
> >>> + page->page_type = page_mapcount_clear_type(mapcount); \
> >>> }
> >>>
> >>> /*
> >>> diff --git a/mm/debug.c b/mm/debug.c
> >>> index 77fa8fe1d641..9a932ded09d4 100644
> >>> --- a/mm/debug.c
> >>> +++ b/mm/debug.c
> >>> @@ -74,8 +74,7 @@ static void __dump_folio(const struct folio *folio, const struct page *page,
> >>> int mapcount = atomic_read(&page->_mapcount) + 1;
> >>> char *type = "";
> >>>
> >>> - if (page_mapcount_is_type(mapcount))
> >>> - mapcount = 0;
> >>> + mapcount = page_mapcount_clear_type(mapcount);
> >>>
> >>> pr_warn("page: refcount:%d mapcount:%d mapping:%p index:%#lx pfn:%#lx\n",
> >>> folio_ref_count(folio), mapcount, mapping,
> >>> ---
> >>>
> >>> Thoughts?
> >>
> >> God no.
> >
> > This is not final patch, but for sharing the rough idea *with code* -
> > maybe there are more points in code that should be adjusted by the
> > change. I just typed the draft patch quick just for sharing idea.
> >
> > If we should allow pp type pages to be used in mapping as well, then
> > we should allow a page to keep both its type and mapcount at the same
> > time. Am I missing something?
>
> We don't want code to accidentally overflow mapcounts into these bits and have
> them wrongly be detected as page types.
>
> This is just very fragile.
Okay. Thanks for the explanation. Plus, the adjustment I mentioned
might not be as simple as I thought it'd be.
So sorry about the noise. I'm a zombie now. I'll think about it after
some rest.
Byungchul
> --
> Cheers,
>
> David
next prev parent reply other threads:[~2026-05-13 13:26 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-24 5:13 [PATCH v4] mm: introduce a new page type for page pool in page type Byungchul Park
2026-02-25 7:19 ` Mike Rapoport
2026-02-26 18:49 ` Johannes Weiner
2026-03-16 22:29 ` Byungchul Park
2026-03-16 22:31 ` [PATCH v5] " Byungchul Park
2026-03-17 9:20 ` Jesper Dangaard Brouer
2026-03-17 10:03 ` Ilias Apalodimas
2026-03-17 11:06 ` Dragos Tatulea
2026-03-19 23:31 ` Jakub Kicinski
2026-03-18 2:02 ` Byungchul Park
2026-03-20 11:44 ` Jesper Dangaard Brouer
2026-03-23 12:16 ` Ilias Apalodimas
2026-03-19 23:31 ` Jakub Kicinski
2026-05-13 9:00 ` [PATCH v4] " Dragos Tatulea
2026-05-13 9:12 ` Vlastimil Babka (SUSE)
2026-05-13 9:26 ` Pedro Falcato
2026-05-13 9:36 ` David Hildenbrand (Arm)
2026-05-13 12:06 ` Dragos Tatulea
2026-05-13 12:11 ` David Hildenbrand (Arm)
2026-05-14 8:54 ` Byungchul Park
2026-05-14 9:24 ` Dragos Tatulea
2026-05-15 0:01 ` Byungchul Park
2026-05-13 9:34 ` David Hildenbrand (Arm)
2026-05-13 12:18 ` Byungchul Park
2026-05-13 12:29 ` David Hildenbrand (Arm)
2026-05-13 12:39 ` Byungchul Park
2026-05-13 13:02 ` David Hildenbrand (Arm)
2026-05-13 13:26 ` Byungchul Park [this message]
2026-05-13 9:42 ` Lorenzo Stoakes
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=20260513132636.GA75142@system.software.com \
--to=byungchul@sk.com \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=almasrymina@google.com \
--cc=andrew+netdev@lunn.ch \
--cc=ap420073@gmail.com \
--cc=asml.silence@gmail.com \
--cc=ast@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=bpf@vger.kernel.org \
--cc=brauner@kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=david@kernel.org \
--cc=dtatulea@nvidia.com \
--cc=dw@davidwei.uk \
--cc=edumazet@google.com \
--cc=hannes@cmpxchg.org \
--cc=harry.yoo@oracle.com \
--cc=hawk@kernel.org \
--cc=horms@kernel.org \
--cc=ilias.apalodimas@linaro.org \
--cc=jackmanb@google.com \
--cc=john.fastabend@gmail.com \
--cc=kas@kernel.org \
--cc=kernel_team@skhynix.com \
--cc=kuba@kernel.org \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-rdma@vger.kernel.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=mbloch@nvidia.com \
--cc=mhocko@suse.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=rppt@kernel.org \
--cc=saeedm@nvidia.com \
--cc=sdf@fomichev.me \
--cc=sfr@canb.auug.org.au \
--cc=surenb@google.com \
--cc=tariqt@nvidia.com \
--cc=toke@redhat.com \
--cc=usamaarif642@gmail.com \
--cc=vbabka@suse.cz \
--cc=willy@infradead.org \
--cc=yuzhao@google.com \
--cc=ziy@nvidia.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.