* [PATCH v4 10/16] mm/page-flags: check page/folio->private instead of PG_private
2026-09-14 2:23 [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Zi Yan
@ 2026-09-14 2:24 ` Zi Yan
2026-09-14 13:26 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 16/16] mm/page-flags: remove PG_private Zi Yan
` (3 subsequent siblings)
4 siblings, 1 reply; 15+ messages in thread
From: Zi Yan @ 2026-09-14 2:24 UTC (permalink / raw)
To: David Hildenbrand, Matthew Wilcox (Oracle), Andrew Morton,
Muchun Song, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
Mike Rapoport, Suren Baghdasaryan, Michal Hocko, Baolin Wang,
Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang,
Usama Arif, Gregory Price, Ying Huang, Alistair Popple,
Johannes Weiner, Qi Zheng, Shakeel Butt, Kairui Song
Cc: linux-mm, linux-kernel, Zi Yan, Steven Rostedt, Masami Hiramatsu,
Jan Kara, Mathieu Desnoyers, Matthew Brost, Joshua Hahn,
Rakie Kim, Byungchul Park, Axel Rasmussen, Yuanchu Xie, Wei Xu,
linux-fsdevel, linux-trace-kernel
After the changes of the prior commits, page/folio->private != NULL is now
equivalent to checking PG_private.
Stop checking PG_private on pages and folios and use page/folio->private
instead, except swapcache and hugetlb folios, because the former uses a
field (swp_entry_t swap) overlapping with ->private and the latter sets its
flags in ->private. Exclude swapcache and hugetlb when the code is meant to
check PG_private only. PG_swapcache and folio->swap.val cannot be set/clear
as a whole, so excluding swapcache with folio_test_swapcache() is not
reliable. Instead, use folio_test_swapbacked(), since PG_swapbacked is
stable when a folio is added to/removed from swapcache. Add a helper,
folio_has_attached_private(), for this check.
folio_expected_ref_count() can be called without folio lock, so annotate
folio_test_private() with data_race() to avoid triggering race condition
checks. While at it, annotate folio->mapping too. Add data_race()
annotation for other lockless callers too.
folio_set/clear_private() and Set/ClearPagePrivate() become no-ops.
PG_private is no longer checked at page free time.
Remove KPF_PRIVATE since PG_private is no longer used.
Assisted-by: LLM
Signed-off-by: Zi Yan <ziy@nvidia.com>
To: Andrew Morton <akpm@linux-foundation.org>
To: David Hildenbrand <david@kernel.org>
To: Steven Rostedt <rostedt@goodmis.org>
To: Masami Hiramatsu <mhiramat@kernel.org>
To: Lorenzo Stoakes <ljs@kernel.org>
To: "Matthew Wilcox (Oracle)" <willy@infradead.org>
To: Jan Kara <jack@suse.cz>
To: Johannes Weiner <hannes@cmpxchg.org>
Cc: "Liam R. Howlett" <liam@infradead.org>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Nico Pache <nico.pache@linux.dev>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Barry Song <baohua@kernel.org>
Cc: Lance Yang <lance.yang@linux.dev>
Cc: Usama Arif <usama.arif@linux.dev>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Joshua Hahn <joshua.hahnjy@gmail.com>
Cc: Rakie Kim <rakie.kim@sk.com>
Cc: Byungchul Park <byungchul@sk.com>
Cc: Gregory Price <gourry@gourry.net>
Cc: Ying Huang <ying.huang@linux.alibaba.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Qi Zheng <qi.zheng@linux.dev>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Kairui Song <kasong@tencent.com>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Yuanchu Xie <yuanchu@google.com>
Cc: Wei Xu <weixugc@google.com>
Cc: linux-kernel@vger.kernel.org
Cc: linux-fsdevel@vger.kernel.org
Cc: linux-mm@kvack.org
Cc: linux-trace-kernel@vger.kernel.org
---
fs/proc/page.c | 1 -
include/linux/kernel-page-flags.h | 1 -
include/linux/mm.h | 20 +++++++++++------
include/linux/page-flags.h | 46 ++++++++++++++++++++++++++++++++++-----
include/trace/events/pagemap.h | 3 ++-
mm/huge_memory.c | 3 ++-
mm/migrate.c | 2 +-
mm/page-writeback.c | 3 ++-
mm/vmscan.c | 2 +-
tools/mm/page-types.c | 2 --
10 files changed, 62 insertions(+), 21 deletions(-)
diff --git a/fs/proc/page.c b/fs/proc/page.c
index 260772b20bd99..f90e1030825e9 100644
--- a/fs/proc/page.c
+++ b/fs/proc/page.c
@@ -232,7 +232,6 @@ u64 stable_page_flags(const struct page *page)
u |= kpf_copy_bit(k, KPF_RESERVED, PG_reserved);
u |= kpf_copy_bit(k, KPF_OWNER_2, PG_owner_2);
- u |= kpf_copy_bit(k, KPF_PRIVATE, PG_private);
u |= kpf_copy_bit(k, KPF_PRIVATE_2, PG_private_2);
u |= kpf_copy_bit(k, KPF_OWNER_PRIVATE, PG_owner_priv_1);
u |= kpf_copy_bit(k, KPF_ARCH, PG_arch_1);
diff --git a/include/linux/kernel-page-flags.h b/include/linux/kernel-page-flags.h
index 196778a087c4d..fe5ab6e50bd70 100644
--- a/include/linux/kernel-page-flags.h
+++ b/include/linux/kernel-page-flags.h
@@ -11,7 +11,6 @@
#define KPF_RESERVED 32
#define KPF_MLOCKED 33
#define KPF_OWNER_2 34
-#define KPF_PRIVATE 35
#define KPF_PRIVATE_2 36
#define KPF_OWNER_PRIVATE 37
#define KPF_ARCH 38
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 969594074fd2d..c9aad2c39fd9c 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -3004,9 +3004,9 @@ static inline bool folio_maybe_mapped_shared(struct folio *folio)
* @folio: the folio
*
* Calculate the expected folio refcount, taking references from the pagecache,
- * swapcache, PG_private and page table mappings into account. Useful in
- * combination with folio_ref_count() to detect unexpected references (e.g.,
- * GUP or other temporary references).
+ * swapcache, private data (folio->private != NULL) and page table mappings into
+ * account. Useful in combination with folio_ref_count() to detect unexpected
+ * references (e.g., GUP or other temporary references).
*
* Does currently not consider references from the LRU cache. If the folio
* was isolated from the LRU (which is the case during migration or split),
@@ -3044,10 +3044,16 @@ static inline int folio_expected_ref_count(const struct folio *folio)
ref_count += folio_test_swapcache(folio) << order;
if (!folio_test_anon(folio)) {
- /* One reference per page from the pagecache. */
- ref_count += !!folio->mapping << order;
- /* One reference from PG_private. */
- ref_count += folio_test_private(folio);
+ /*
+ * One reference per page from the pagecache.
+ * Use data_race() since folio might not be locked.
+ */
+ ref_count += !!data_race(folio->mapping) << order;
+ /*
+ * One reference from filesystem private data.
+ * Use data_race() since folio might not be locked.
+ */
+ ref_count += data_race(folio_has_attached_private(folio));
}
/* One reference per page table mapping. */
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index 462e89e055485..08988877331ba 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -577,7 +577,23 @@ FOLIO_FLAG(swapbacked, FOLIO_HEAD_PAGE)
* for its own purposes.
* - PG_private and PG_private_2 cause release_folio() and co to be invoked
*/
-PAGEFLAG(Private, private, PF_ANY)
+
+static __always_inline bool folio_test_private(const struct folio *folio)
+{
+ return folio->private;
+}
+
+static __always_inline int PagePrivate(const struct page *page)
+{
+ return !!page->private;
+}
+
+/* no-ops during transition */
+static __always_inline void folio_set_private(struct folio *folio) { }
+static __always_inline void folio_clear_private(struct folio *folio) { }
+static __always_inline void SetPagePrivate(struct page *page) { }
+static __always_inline void ClearPagePrivate(struct page *page) { }
+
FOLIO_FLAG(private_2, FOLIO_HEAD_PAGE)
/* owner_2 can be set on tail pages for anon memory */
@@ -1169,7 +1185,7 @@ static __always_inline void __ClearPageAnonExclusive(struct page *page)
*/
#define PAGE_FLAGS_CHECK_AT_FREE \
(1UL << PG_lru | 1UL << PG_locked | \
- 1UL << PG_private | 1UL << PG_private_2 | \
+ 1UL << PG_private_2 | \
1UL << PG_writeback | 1UL << PG_reserved | \
1UL << PG_active | \
1UL << PG_unevictable | __PG_MLOCKED | LRU_GEN_MASK)
@@ -1193,8 +1209,28 @@ static __always_inline void __ClearPageAnonExclusive(struct page *page)
(0xffUL /* order */ | 1UL << PG_has_hwpoisoned | \
1UL << PG_large_rmappable | 1UL << PG_partially_mapped)
-#define PAGE_FLAGS_PRIVATE \
- (1UL << PG_private | 1UL << PG_private_2)
+/**
+ * folio_has_attached_private - check if the folio has private data attached
+ * @folio: The folio to check.
+ *
+ * Use this in code that may encounter swapcache or hugetlb folios but only
+ * wants to detect attached private data. Swapcache stores swp_entry_t in
+ * folio->swap, a union with folio->private, and hugetlb stores its own flags
+ * in folio->private; both are excluded.
+ *
+ * NOTE: For swapcache, folio->swap.val PG_swapcache are not set as a whole,
+ * so folio_test_swapcache() is not reliable to exclude swapcache.
+ * Use folio_test_swapbacked() instead, since it remains set when a folio is
+ * added to/removed from swapcache.
+ *
+ * Return: true if folio->private is set and the folio is neither swapcache
+ * nor hugetlb.
+ */
+static inline bool folio_has_attached_private(const struct folio *folio)
+{
+ return folio_test_private(folio) && !folio_test_swapbacked(folio) &&
+ !folio_test_hugetlb(folio);
+}
/**
* folio_has_private - Determine if folio has private stuff
* @folio: The folio to be checked
@@ -1204,7 +1240,7 @@ static __always_inline void __ClearPageAnonExclusive(struct page *page)
*/
static inline int folio_has_private(const struct folio *folio)
{
- return !!(folio->flags.f & PAGE_FLAGS_PRIVATE);
+ return folio_has_attached_private(folio) || folio_test_private_2(folio);
}
#undef PF_ANY
diff --git a/include/trace/events/pagemap.h b/include/trace/events/pagemap.h
index 36c3a90f0acca..304652d6d8f2a 100644
--- a/include/trace/events/pagemap.h
+++ b/include/trace/events/pagemap.h
@@ -22,7 +22,8 @@
(folio_test_swapcache(folio) ? PAGEMAP_SWAPCACHE : 0) | \
(folio_test_swapbacked(folio) ? PAGEMAP_SWAPBACKED : 0) | \
(folio_test_mappedtodisk(folio) ? PAGEMAP_MAPPEDDISK : 0) | \
- (folio_test_private(folio) ? PAGEMAP_BUFFERS : 0) \
+ /* data_race() is used to read attached private locklessly */ \
+ (data_race(folio_has_attached_private(folio)) ? PAGEMAP_BUFFERS : 0) \
)
TRACE_EVENT(mm_lru_insertion,
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 30b7c63b0e359..8f4bcdccd8f35 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -4845,8 +4845,9 @@ static int split_huge_pages_pid(int pid, unsigned long vaddr_start,
* For folios with private, split_huge_page_to_list_to_order()
* will try to drop it before split and then check if the folio
* can be split or not. So skip the check here.
+ * data_race() is used to read attached private locklessly.
*/
- if (!folio_test_private(folio) &&
+ if (!data_race(folio_has_attached_private(folio)) &&
folio_expected_ref_count(folio) != folio_ref_count(folio))
goto next;
diff --git a/mm/migrate.c b/mm/migrate.c
index a369d0c95c386..b7b92925a28c3 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1327,7 +1327,7 @@ static int migrate_folio_unmap(new_folio_t get_new_folio,
* free the metadata, so the page can be freed.
*/
if (!src->mapping) {
- if (folio_test_private(src)) {
+ if (folio_has_attached_private(src)) {
try_to_free_buffers(src);
goto out;
}
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index eeab25d6ce364..0d754a678eac2 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -2705,7 +2705,8 @@ bool filemap_dirty_folio(struct address_space *mapping, struct folio *folio)
if (folio_test_set_dirty(folio))
return false;
- __folio_mark_dirty(folio, mapping, !folio_test_private(folio));
+ /* data_race() is used to read attached private locklessly */
+ __folio_mark_dirty(folio, mapping, !data_race(folio_has_attached_private(folio)));
if (mapping->host) {
/* !PageAnon && !swapper_space */
diff --git a/mm/vmscan.c b/mm/vmscan.c
index aaceed4759eeb..c2eb8fa9d5e50 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1029,7 +1029,7 @@ static void folio_check_dirty_writeback(struct folio *folio,
*writeback = folio_test_writeback(folio);
/* Verify dirty/writeback state if the filesystem supports it */
- if (!folio_test_private(folio))
+ if (!folio_has_attached_private(folio))
return;
mapping = folio_mapping(folio);
diff --git a/tools/mm/page-types.c b/tools/mm/page-types.c
index 7fc5a8be5997f..47e4781c5fc38 100644
--- a/tools/mm/page-types.c
+++ b/tools/mm/page-types.c
@@ -73,7 +73,6 @@
#define KPF_RESERVED 32
#define KPF_MLOCKED 33
#define KPF_OWNER_2 34
-#define KPF_PRIVATE 35
#define KPF_PRIVATE_2 36
#define KPF_OWNER_PRIVATE 37
#define KPF_ARCH 38
@@ -131,7 +130,6 @@ static const char * const page_flag_names[] = {
[KPF_RESERVED] = "r:reserved",
[KPF_MLOCKED] = "m:mlocked",
[KPF_OWNER_2] = "d:owner_2",
- [KPF_PRIVATE] = "P:private",
[KPF_PRIVATE_2] = "p:private_2",
[KPF_OWNER_PRIVATE] = "O:owner_private",
[KPF_ARCH] = "h:arch",
--
2.53.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH v4 10/16] mm/page-flags: check page/folio->private instead of PG_private
2026-09-14 2:24 ` [PATCH v4 10/16] mm/page-flags: check page/folio->private instead of PG_private Zi Yan
@ 2026-09-14 13:26 ` David Hildenbrand (Arm)
2026-09-14 14:44 ` Zi Yan
0 siblings, 1 reply; 15+ messages in thread
From: David Hildenbrand (Arm) @ 2026-09-14 13:26 UTC (permalink / raw)
To: Zi Yan, Matthew Wilcox (Oracle), Andrew Morton, Muchun Song,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Baolin Wang, Nico Pache,
Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif,
Gregory Price, Ying Huang, Alistair Popple, Johannes Weiner,
Qi Zheng, Shakeel Butt, Kairui Song
Cc: linux-mm, linux-kernel, Steven Rostedt, Masami Hiramatsu,
Jan Kara, Mathieu Desnoyers, Matthew Brost, Joshua Hahn,
Rakie Kim, Byungchul Park, Axel Rasmussen, Yuanchu Xie, Wei Xu,
linux-fsdevel, linux-trace-kernel
On 9/14/26 04:24, Zi Yan wrote:
> After the changes of the prior commits, page/folio->private != NULL is now
> equivalent to checking PG_private.
>
> Stop checking PG_private on pages and folios and use page/folio->private
> instead, except swapcache and hugetlb folios, because the former uses a
> field (swp_entry_t swap) overlapping with ->private and the latter sets its
> flags in ->private. Exclude swapcache and hugetlb when the code is meant to
> check PG_private only. PG_swapcache and folio->swap.val cannot be set/clear
> as a whole, so excluding swapcache with folio_test_swapcache() is not
> reliable. Instead, use folio_test_swapbacked(), since PG_swapbacked is
> stable when a folio is added to/removed from swapcache. Add a helper,
> folio_has_attached_private(), for this check.
>
> folio_expected_ref_count() can be called without folio lock, so annotate
> folio_test_private() with data_race() to avoid triggering race condition
> checks. While at it, annotate folio->mapping too. Add data_race()
> annotation for other lockless callers too.
Shouldn't we just move the data_race() into folio_has_attached_private() and
document there, that it can be called without the folio lock as well? Having the
data_race in multiple callers looks odd.
>
> folio_set/clear_private() and Set/ClearPagePrivate() become no-ops.
> PG_private is no longer checked at page free time.
You can mention here that we will clean this part up next, to remove these
helpers entirely.
[...]
> }
>
> /* One reference per page table mapping. */
> diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
> index 462e89e055485..08988877331ba 100644
> --- a/include/linux/page-flags.h
> +++ b/include/linux/page-flags.h
> @@ -577,7 +577,23 @@ FOLIO_FLAG(swapbacked, FOLIO_HEAD_PAGE)
> * for its own purposes.
> * - PG_private and PG_private_2 cause release_folio() and co to be invoked
> */
> -PAGEFLAG(Private, private, PF_ANY)
> +
> +static __always_inline bool folio_test_private(const struct folio *folio)
> +{
> + return folio->private;
> +}
> +
> +static __always_inline int PagePrivate(const struct page *page)
> +{
> + return !!page->private;
> +}
> +
> +/* no-ops during transition */
> +static __always_inline void folio_set_private(struct folio *folio) { }
> +static __always_inline void folio_clear_private(struct folio *folio) { }
> +static __always_inline void SetPagePrivate(struct page *page) { }
> +static __always_inline void ClearPagePrivate(struct page *page) { }
> +
> FOLIO_FLAG(private_2, FOLIO_HEAD_PAGE)
>
> /* owner_2 can be set on tail pages for anon memory */
> @@ -1169,7 +1185,7 @@ static __always_inline void __ClearPageAnonExclusive(struct page *page)
> */
> #define PAGE_FLAGS_CHECK_AT_FREE \
> (1UL << PG_lru | 1UL << PG_locked | \
> - 1UL << PG_private | 1UL << PG_private_2 | \
> + 1UL << PG_private_2 | \
> 1UL << PG_writeback | 1UL << PG_reserved | \
> 1UL << PG_active | \
> 1UL << PG_unevictable | __PG_MLOCKED | LRU_GEN_MASK)
> @@ -1193,8 +1209,28 @@ static __always_inline void __ClearPageAnonExclusive(struct page *page)
> (0xffUL /* order */ | 1UL << PG_has_hwpoisoned | \
> 1UL << PG_large_rmappable | 1UL << PG_partially_mapped)
>
> -#define PAGE_FLAGS_PRIVATE \
> - (1UL << PG_private | 1UL << PG_private_2)
> +/**
> + * folio_has_attached_private - check if the folio has private data attached
> + * @folio: The folio to check.
> + *
> + * Use this in code that may encounter swapcache or hugetlb folios but only
> + * wants to detect attached private data. Swapcache stores swp_entry_t in
> + * folio->swap, a union with folio->private, and hugetlb stores its own flags
> + * in folio->private; both are excluded.
This is an implementation detail that is irrelevant for callers. Move that above
the actual checks in the code below.
> + *
> + * NOTE: For swapcache, folio->swap.val PG_swapcache are not set as a whole,
> + * so folio_test_swapcache() is not reliable to exclude swapcache.
> + * Use folio_test_swapbacked() instead, since it remains set when a folio is
> + * added to/removed from swapcache.
Dito, a caller of this function doesn't care.
> + *
> + * Return: true if folio->private is set and the folio is neither swapcache
> + * nor hugetlb.
Can we remove these implementation details here instead and talk about "true if
the folio has private data attached" ?
> + */
> +static inline bool folio_has_attached_private(const struct folio *folio)
> +{
> + return folio_test_private(folio) && !folio_test_swapbacked(folio) &&
> + !folio_test_hugetlb(folio);
> +}
Apart from that LGTM.
--
Cheers,
David
^ permalink raw reply [flat|nested] 15+ messages in thread* Re: [PATCH v4 10/16] mm/page-flags: check page/folio->private instead of PG_private
2026-09-14 13:26 ` David Hildenbrand (Arm)
@ 2026-09-14 14:44 ` Zi Yan
2026-09-14 15:11 ` David Hildenbrand (Arm)
0 siblings, 1 reply; 15+ messages in thread
From: Zi Yan @ 2026-09-14 14:44 UTC (permalink / raw)
To: David Hildenbrand (Arm)
Cc: Matthew Wilcox (Oracle), Andrew Morton, Muchun Song,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Baolin Wang, Nico Pache,
Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif,
Gregory Price, Ying Huang, Alistair Popple, Johannes Weiner,
Qi Zheng, Shakeel Butt, Kairui Song, linux-mm, linux-kernel,
Steven Rostedt, Masami Hiramatsu, Jan Kara, Mathieu Desnoyers,
Matthew Brost, Joshua Hahn, Rakie Kim, Byungchul Park,
Axel Rasmussen, Yuanchu Xie, Wei Xu, linux-fsdevel,
linux-trace-kernel
On 14 Sep 2026, at 9:26, David Hildenbrand (Arm) wrote:
> On 9/14/26 04:24, Zi Yan wrote:
>> After the changes of the prior commits, page/folio->private != NULL is now
>> equivalent to checking PG_private.
>>
>> Stop checking PG_private on pages and folios and use page/folio->private
>> instead, except swapcache and hugetlb folios, because the former uses a
>> field (swp_entry_t swap) overlapping with ->private and the latter sets its
>> flags in ->private. Exclude swapcache and hugetlb when the code is meant to
>> check PG_private only. PG_swapcache and folio->swap.val cannot be set/clear
>> as a whole, so excluding swapcache with folio_test_swapcache() is not
>> reliable. Instead, use folio_test_swapbacked(), since PG_swapbacked is
>> stable when a folio is added to/removed from swapcache. Add a helper,
>> folio_has_attached_private(), for this check.
>>
>> folio_expected_ref_count() can be called without folio lock, so annotate
>> folio_test_private() with data_race() to avoid triggering race condition
>> checks. While at it, annotate folio->mapping too. Add data_race()
>> annotation for other lockless callers too.
>
> Shouldn't we just move the data_race() into folio_has_attached_private() and
> document there, that it can be called without the folio lock as well? Having the
> data_race in multiple callers looks odd.
Not all callers call it without holding a lock. Before the patch series,
it is fine for lockless reads because PagePrivate() is an atomic operation.
But after the patch series, lockless reads can cause data tearing of
folio->private. I think I need to add this to avoid the confusion.
>
>>
>> folio_set/clear_private() and Set/ClearPagePrivate() become no-ops.
>> PG_private is no longer checked at page free time.
>
> You can mention here that we will clean this part up next, to remove these
> helpers entirely.
>
Will do.
> [...]
>
>> }
>>
>> /* One reference per page table mapping. */
>> diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
>> index 462e89e055485..08988877331ba 100644
>> --- a/include/linux/page-flags.h
>> +++ b/include/linux/page-flags.h
>> @@ -577,7 +577,23 @@ FOLIO_FLAG(swapbacked, FOLIO_HEAD_PAGE)
>> * for its own purposes.
>> * - PG_private and PG_private_2 cause release_folio() and co to be invoked
>> */
>> -PAGEFLAG(Private, private, PF_ANY)
>> +
>> +static __always_inline bool folio_test_private(const struct folio *folio)
>> +{
>> + return folio->private;
>> +}
>> +
>> +static __always_inline int PagePrivate(const struct page *page)
>> +{
>> + return !!page->private;
>> +}
>> +
>> +/* no-ops during transition */
>> +static __always_inline void folio_set_private(struct folio *folio) { }
>> +static __always_inline void folio_clear_private(struct folio *folio) { }
>> +static __always_inline void SetPagePrivate(struct page *page) { }
>> +static __always_inline void ClearPagePrivate(struct page *page) { }
>> +
>> FOLIO_FLAG(private_2, FOLIO_HEAD_PAGE)
>>
>> /* owner_2 can be set on tail pages for anon memory */
>> @@ -1169,7 +1185,7 @@ static __always_inline void __ClearPageAnonExclusive(struct page *page)
>> */
>> #define PAGE_FLAGS_CHECK_AT_FREE \
>> (1UL << PG_lru | 1UL << PG_locked | \
>> - 1UL << PG_private | 1UL << PG_private_2 | \
>> + 1UL << PG_private_2 | \
>> 1UL << PG_writeback | 1UL << PG_reserved | \
>> 1UL << PG_active | \
>> 1UL << PG_unevictable | __PG_MLOCKED | LRU_GEN_MASK)
>> @@ -1193,8 +1209,28 @@ static __always_inline void __ClearPageAnonExclusive(struct page *page)
>> (0xffUL /* order */ | 1UL << PG_has_hwpoisoned | \
>> 1UL << PG_large_rmappable | 1UL << PG_partially_mapped)
>>
>> -#define PAGE_FLAGS_PRIVATE \
>> - (1UL << PG_private | 1UL << PG_private_2)
>> +/**
>> + * folio_has_attached_private - check if the folio has private data attached
>> + * @folio: The folio to check.
>> + *
>> + * Use this in code that may encounter swapcache or hugetlb folios but only
>> + * wants to detect attached private data. Swapcache stores swp_entry_t in
>> + * folio->swap, a union with folio->private, and hugetlb stores its own flags
>> + * in folio->private; both are excluded.
>
> This is an implementation detail that is irrelevant for callers. Move that above
> the actual checks in the code below.
OK.
>
>> + *
>> + * NOTE: For swapcache, folio->swap.val PG_swapcache are not set as a whole,
>> + * so folio_test_swapcache() is not reliable to exclude swapcache.
>> + * Use folio_test_swapbacked() instead, since it remains set when a folio is
>> + * added to/removed from swapcache.
>
> Dito, a caller of this function doesn't care.
Got it.
>
>> + *
>> + * Return: true if folio->private is set and the folio is neither swapcache
>> + * nor hugetlb.
>
> Can we remove these implementation details here instead and talk about "true if
> the folio has private data attached" ?
OK.
>
>> + */
>> +static inline bool folio_has_attached_private(const struct folio *folio)
>> +{
>> + return folio_test_private(folio) && !folio_test_swapbacked(folio) &&
>> + !folio_test_hugetlb(folio);
>> +}
> Apart from that LGTM.
Thanks.
Best Regards,
Yan, Zi
^ permalink raw reply [flat|nested] 15+ messages in thread* Re: [PATCH v4 10/16] mm/page-flags: check page/folio->private instead of PG_private
2026-09-14 14:44 ` Zi Yan
@ 2026-09-14 15:11 ` David Hildenbrand (Arm)
2026-09-14 15:21 ` Zi Yan
0 siblings, 1 reply; 15+ messages in thread
From: David Hildenbrand (Arm) @ 2026-09-14 15:11 UTC (permalink / raw)
To: Zi Yan
Cc: Matthew Wilcox (Oracle), Andrew Morton, Muchun Song,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Baolin Wang, Nico Pache,
Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif,
Gregory Price, Ying Huang, Alistair Popple, Johannes Weiner,
Qi Zheng, Shakeel Butt, Kairui Song, linux-mm, linux-kernel,
Steven Rostedt, Masami Hiramatsu, Jan Kara, Mathieu Desnoyers,
Matthew Brost, Joshua Hahn, Rakie Kim, Byungchul Park,
Axel Rasmussen, Yuanchu Xie, Wei Xu, linux-fsdevel,
linux-trace-kernel
On 9/14/26 16:44, Zi Yan wrote:
> On 14 Sep 2026, at 9:26, David Hildenbrand (Arm) wrote:
>
>> On 9/14/26 04:24, Zi Yan wrote:
>>> After the changes of the prior commits, page/folio->private != NULL is now
>>> equivalent to checking PG_private.
>>>
>>> Stop checking PG_private on pages and folios and use page/folio->private
>>> instead, except swapcache and hugetlb folios, because the former uses a
>>> field (swp_entry_t swap) overlapping with ->private and the latter sets its
>>> flags in ->private. Exclude swapcache and hugetlb when the code is meant to
>>> check PG_private only. PG_swapcache and folio->swap.val cannot be set/clear
>>> as a whole, so excluding swapcache with folio_test_swapcache() is not
>>> reliable. Instead, use folio_test_swapbacked(), since PG_swapbacked is
>>> stable when a folio is added to/removed from swapcache. Add a helper,
>>> folio_has_attached_private(), for this check.
>>>
>>> folio_expected_ref_count() can be called without folio lock, so annotate
>>> folio_test_private() with data_race() to avoid triggering race condition
>>> checks. While at it, annotate folio->mapping too. Add data_race()
>>> annotation for other lockless callers too.
>>
>> Shouldn't we just move the data_race() into folio_has_attached_private() and
>> document there, that it can be called without the folio lock as well? Having the
>> data_race in multiple callers looks odd.
>
> Not all callers call it without holding a lock. Before the patch series,
> it is fine for lockless reads because PagePrivate() is an atomic operation.
> But after the patch series, lockless reads can cause data tearing of
> folio->private. I think I need to add this to avoid the confusion.
Okay, but we should just keep that complexity internally.
E.g., just teach folio_test_private/PagePrivate about the data_race, because
that's exactly what worked before even with data races.
--
Cheers,
David
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 10/16] mm/page-flags: check page/folio->private instead of PG_private
2026-09-14 15:11 ` David Hildenbrand (Arm)
@ 2026-09-14 15:21 ` Zi Yan
0 siblings, 0 replies; 15+ messages in thread
From: Zi Yan @ 2026-09-14 15:21 UTC (permalink / raw)
To: David Hildenbrand (Arm)
Cc: Matthew Wilcox (Oracle), Andrew Morton, Muchun Song,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Baolin Wang, Nico Pache,
Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif,
Gregory Price, Ying Huang, Alistair Popple, Johannes Weiner,
Qi Zheng, Shakeel Butt, Kairui Song, linux-mm, linux-kernel,
Steven Rostedt, Masami Hiramatsu, Jan Kara, Mathieu Desnoyers,
Matthew Brost, Joshua Hahn, Rakie Kim, Byungchul Park,
Axel Rasmussen, Yuanchu Xie, Wei Xu, linux-fsdevel,
linux-trace-kernel
On 14 Sep 2026, at 11:11, David Hildenbrand (Arm) wrote:
> On 9/14/26 16:44, Zi Yan wrote:
>> On 14 Sep 2026, at 9:26, David Hildenbrand (Arm) wrote:
>>
>>> On 9/14/26 04:24, Zi Yan wrote:
>>>> After the changes of the prior commits, page/folio->private != NULL is now
>>>> equivalent to checking PG_private.
>>>>
>>>> Stop checking PG_private on pages and folios and use page/folio->private
>>>> instead, except swapcache and hugetlb folios, because the former uses a
>>>> field (swp_entry_t swap) overlapping with ->private and the latter sets its
>>>> flags in ->private. Exclude swapcache and hugetlb when the code is meant to
>>>> check PG_private only. PG_swapcache and folio->swap.val cannot be set/clear
>>>> as a whole, so excluding swapcache with folio_test_swapcache() is not
>>>> reliable. Instead, use folio_test_swapbacked(), since PG_swapbacked is
>>>> stable when a folio is added to/removed from swapcache. Add a helper,
>>>> folio_has_attached_private(), for this check.
>>>>
>>>> folio_expected_ref_count() can be called without folio lock, so annotate
>>>> folio_test_private() with data_race() to avoid triggering race condition
>>>> checks. While at it, annotate folio->mapping too. Add data_race()
>>>> annotation for other lockless callers too.
>>>
>>> Shouldn't we just move the data_race() into folio_has_attached_private() and
>>> document there, that it can be called without the folio lock as well? Having the
>>> data_race in multiple callers looks odd.
>>
>> Not all callers call it without holding a lock. Before the patch series,
>> it is fine for lockless reads because PagePrivate() is an atomic operation.
>> But after the patch series, lockless reads can cause data tearing of
>> folio->private. I think I need to add this to avoid the confusion.
> Okay, but we should just keep that complexity internally.
>
> E.g., just teach folio_test_private/PagePrivate about the data_race, because
> that's exactly what worked before even with data races.
Makes sense. Will update folio_test_private() and PagePrivate() and get rid
of callers’ data_race().
Best Regards,
Yan, Zi
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 16/16] mm/page-flags: remove PG_private
2026-09-14 2:23 [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Zi Yan
2026-09-14 2:24 ` [PATCH v4 10/16] mm/page-flags: check page/folio->private instead of PG_private Zi Yan
@ 2026-09-14 2:24 ` Zi Yan
2026-09-14 2:47 ` sashiko-bot
2026-09-14 13:38 ` David Hildenbrand (Arm)
2026-09-14 3:39 ` [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Andrew Morton
` (2 subsequent siblings)
4 siblings, 2 replies; 15+ messages in thread
From: Zi Yan @ 2026-09-14 2:24 UTC (permalink / raw)
To: David Hildenbrand, Matthew Wilcox (Oracle), Andrew Morton,
Muchun Song, Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka,
Mike Rapoport, Suren Baghdasaryan, Michal Hocko, Baolin Wang,
Nico Pache, Ryan Roberts, Dev Jain, Barry Song, Lance Yang,
Usama Arif, Gregory Price, Ying Huang, Alistair Popple,
Johannes Weiner, Qi Zheng, Shakeel Butt, Kairui Song
Cc: linux-mm, linux-kernel, Zi Yan, Baoquan He, Pasha Tatashin,
Pratyush Yadav, Jonathan Corbet, Jan Kara, Steven Rostedt,
Masami Hiramatsu, Dave Young, Shuah Khan, Mathieu Desnoyers,
kexec, linux-doc, linux-fsdevel, linux-trace-kernel
folio->private != NULL indicates a folio carries private data, replacing
PG_private. All PG_private users are converted. Remove PG_private and
reserve the space as PG_folio for future use. Unused PG_private functions
are removed too.
Assisted-by: LLM
Signed-off-by: Zi Yan <ziy@nvidia.com>
To: Andrew Morton <akpm@linux-foundation.org>
To: Baoquan He <baoquan.he@linux.dev>
To: Mike Rapoport <rppt@kernel.org>
To: Pasha Tatashin <pasha.tatashin@soleen.com>
To: Pratyush Yadav <pratyush@kernel.org>
To: Jonathan Corbet <corbet@lwn.net>
To: "Matthew Wilcox (Oracle)" <willy@infradead.org>
To: Jan Kara <jack@suse.cz>
To: David Hildenbrand <david@kernel.org>
To: Steven Rostedt <rostedt@goodmis.org>
To: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Dave Young <ruirui.yang@linux.dev>
Cc: Shuah Khan <skhan@linuxfoundation.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: "Liam R. Howlett" <liam@infradead.org>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: kexec@lists.infradead.org
Cc: linux-doc@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-fsdevel@vger.kernel.org
Cc: linux-mm@kvack.org
Cc: linux-trace-kernel@vger.kernel.org
---
include/linux/page-flags.h | 19 ++-----------------
include/trace/events/mmflags.h | 2 +-
kernel/vmcore_info.c | 1 -
3 files changed, 3 insertions(+), 19 deletions(-)
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index 08988877331ba..10f4ad075ea48 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -44,10 +44,6 @@
* Consequently, PG_reserved for a page mapped into user space can indicate
* the zero page, the vDSO, MMIO pages or device memory.
*
- * The PG_private bitflag is set on pagecache pages if they contain filesystem
- * specific data (which is normally at page->private). It can be used by
- * private allocations for its own usage.
- *
* During initiation of disk I/O, PG_locked is set. This bit is set before I/O
* and cleared when writeback _starts_ or when read _completes_. PG_writeback
* is set before writeback starts and cleared when it finishes.
@@ -105,7 +101,7 @@ enum pageflags {
PG_owner_2, /* Owner use. If pagecache, fs may use */
PG_arch_1,
PG_reserved,
- PG_private, /* If pagecache, has fs-private data */
+ PG_folio, /* Do not use: reserved for folio identification */
PG_private_2, /* If pagecache, has fs aux data */
PG_reclaim, /* To be reclaimed asap */
PG_swapbacked, /* Page is backed by RAM/swap */
@@ -575,7 +571,7 @@ FOLIO_FLAG(swapbacked, FOLIO_HEAD_PAGE)
/*
* Private page markings that may be used by the filesystem that owns the page
* for its own purposes.
- * - PG_private and PG_private_2 cause release_folio() and co to be invoked
+ * - folio->private and PG_private_2 cause release_folio() and co to be invoked
*/
static __always_inline bool folio_test_private(const struct folio *folio)
@@ -583,17 +579,6 @@ static __always_inline bool folio_test_private(const struct folio *folio)
return folio->private;
}
-static __always_inline int PagePrivate(const struct page *page)
-{
- return !!page->private;
-}
-
-/* no-ops during transition */
-static __always_inline void folio_set_private(struct folio *folio) { }
-static __always_inline void folio_clear_private(struct folio *folio) { }
-static __always_inline void SetPagePrivate(struct page *page) { }
-static __always_inline void ClearPagePrivate(struct page *page) { }
-
FOLIO_FLAG(private_2, FOLIO_HEAD_PAGE)
/* owner_2 can be set on tail pages for anon memory */
diff --git a/include/trace/events/mmflags.h b/include/trace/events/mmflags.h
index ef9aa388b84f7..3c153b3ad8450 100644
--- a/include/trace/events/mmflags.h
+++ b/include/trace/events/mmflags.h
@@ -144,7 +144,7 @@ TRACE_DEFINE_ENUM(___GFP_LAST_BIT);
DEF_PAGEFLAG_NAME(owner_2), \
DEF_PAGEFLAG_NAME(arch_1), \
DEF_PAGEFLAG_NAME(reserved), \
- DEF_PAGEFLAG_NAME(private), \
+ DEF_PAGEFLAG_NAME(folio), \
DEF_PAGEFLAG_NAME(private_2), \
DEF_PAGEFLAG_NAME(writeback), \
DEF_PAGEFLAG_NAME(head), \
diff --git a/kernel/vmcore_info.c b/kernel/vmcore_info.c
index 8614430ca212a..5a417f8a922ab 100644
--- a/kernel/vmcore_info.c
+++ b/kernel/vmcore_info.c
@@ -216,7 +216,6 @@ static int __init crash_save_vmcoreinfo_init(void)
VMCOREINFO_LENGTH(free_area.free_list, MIGRATE_TYPES);
VMCOREINFO_NUMBER(NR_FREE_PAGES);
VMCOREINFO_NUMBER(PG_lru);
- VMCOREINFO_NUMBER(PG_private);
VMCOREINFO_NUMBER(PG_swapcache);
VMCOREINFO_NUMBER(PG_swapbacked);
#define PAGE_SLAB_MAPCOUNT_VALUE (PGTY_slab << 24)
--
2.53.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH v4 16/16] mm/page-flags: remove PG_private
2026-09-14 2:24 ` [PATCH v4 16/16] mm/page-flags: remove PG_private Zi Yan
@ 2026-09-14 2:47 ` sashiko-bot
2026-09-14 13:37 ` David Hildenbrand (Arm)
2026-09-14 13:38 ` David Hildenbrand (Arm)
1 sibling, 1 reply; 15+ messages in thread
From: sashiko-bot @ 2026-09-14 2:47 UTC (permalink / raw)
To: Qi Zheng, Lorenzo Stoakes, Shakeel Butt, Johannes Weiner,
Kairui Song, Alistair Popple, Ryan Roberts, Gregory Price,
Baolin Wang, David Hildenbrand, Matthew Wilcox (Oracle), Dev Jain,
Andrew Morton, Vlastimil Babka, Suren Baghdasaryan,
Liam R. Howlett, Michal Hocko, Lance Yang, Ying Huang, Zi Yan,
Muchun Song, Mike Rapoport, Barry Song, Nico Pache, Usama Arif
Cc: Steven Rostedt, Jan Kara, Baoquan He, linux-mm, kexec,
linux-kernel, Masami Hiramatsu, linux-fsdevel, Pratyush Yadav,
Pasha Tatashin, Mathieu Desnoyers, Dave Young, Jonathan Corbet,
Shuah Khan, linux-trace-kernel, linux-doc
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Silent memory leak of folio private data due to missing check for leaked `folio->private` data when a head page is freed.
--
commit ebe4dd474a496c46897e3f790e03a43cc0508eaf
Author: Zi Yan <ziy@nvidia.com>
mm/page-flags: remove PG_private
folio->private != NULL indicates a folio carries private data, replacing
PG_private. All PG_private users are converted. Remove PG_private and
reserve the space as PG_folio for future use. Unused PG_private functions
are removed too.
> diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
> index 08988877331ba..10f4ad075ea48 100644
> --- a/include/linux/page-flags.h
> +++ b/include/linux/page-flags.h
[ ... ]
> @@ -105,7 +101,7 @@ enum pageflags {
> PG_owner_2, /* Owner use. If pagecache, fs may use */
> PG_arch_1,
> PG_reserved,
> - PG_private, /* If pagecache, has fs-private data */
> + PG_folio, /* Do not use: reserved for folio identification */
[Severity: High]
With the removal of PG_private, does the free path for head pages fail to
validate whether private data is leaked?
Previously, the memory management subsystem checked for PG_private during page
freeing (via PAGE_FLAGS_CHECK_AT_FREE) to catch filesystem leaks, and issued a
bad_page() warning if it was still set.
While tail pages are explicitly checked for leaked private data in the free
path:
if (tail_page->private) {
bad_page(tail_page, "nonzero private");
...
The head page's private field appears to be unconditionally zeroed without
validation in __free_pages_prepare() in mm/page_alloc.c:
page_cpupid_reset_last(page);
page->flags.f &= ~PAGE_FLAGS_CHECK_AT_PREP;
page->private = 0;
reset_page_owner(page, order);
Can this silently mask bugs where filesystems leak private data (like an
un-detached buffer_head)? Should we add a check for page->private != NULL
for head pages before unconditionally zeroing it?
> PG_private_2, /* If pagecache, has fs aux data */
> PG_reclaim, /* To be reclaimed asap */
> PG_swapbacked, /* Page is backed by RAM/swap */
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260913-remove-pg_private-v4-0-848550f7574e@nvidia.com?part=16
^ permalink raw reply [flat|nested] 15+ messages in thread* Re: [PATCH v4 16/16] mm/page-flags: remove PG_private
2026-09-14 2:47 ` sashiko-bot
@ 2026-09-14 13:37 ` David Hildenbrand (Arm)
0 siblings, 0 replies; 15+ messages in thread
From: David Hildenbrand (Arm) @ 2026-09-14 13:37 UTC (permalink / raw)
To: sashiko-reviews, Qi Zheng, Lorenzo Stoakes, Shakeel Butt,
Johannes Weiner, Kairui Song, Alistair Popple, Ryan Roberts,
Gregory Price, Baolin Wang, Matthew Wilcox (Oracle), Dev Jain,
Andrew Morton, Vlastimil Babka, Suren Baghdasaryan,
Liam R. Howlett, Michal Hocko, Lance Yang, Ying Huang, Zi Yan,
Muchun Song, Mike Rapoport, Barry Song, Nico Pache, Usama Arif
Cc: Steven Rostedt, Jan Kara, Baoquan He, linux-mm, kexec,
linux-kernel, Masami Hiramatsu, linux-fsdevel, Pratyush Yadav,
Pasha Tatashin, Mathieu Desnoyers, Dave Young, Jonathan Corbet,
Shuah Khan, linux-trace-kernel, linux-doc
On 9/14/26 04:47, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [High] Silent memory leak of folio private data due to missing check for leaked `folio->private` data when a head page is freed.
> --
>
> commit ebe4dd474a496c46897e3f790e03a43cc0508eaf
> Author: Zi Yan <ziy@nvidia.com>
>
> mm/page-flags: remove PG_private
>
> folio->private != NULL indicates a folio carries private data, replacing
> PG_private. All PG_private users are converted. Remove PG_private and
> reserve the space as PG_folio for future use. Unused PG_private functions
> are removed too.
>
>> diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
>> index 08988877331ba..10f4ad075ea48 100644
>> --- a/include/linux/page-flags.h
>> +++ b/include/linux/page-flags.h
>
> [ ... ]
>
>> @@ -105,7 +101,7 @@ enum pageflags {
>> PG_owner_2, /* Owner use. If pagecache, fs may use */
>> PG_arch_1,
>> PG_reserved,
>> - PG_private, /* If pagecache, has fs-private data */
>> + PG_folio, /* Do not use: reserved for folio identification */
>
> [Severity: High]
"High" lol
--
Cheers,
David
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 16/16] mm/page-flags: remove PG_private
2026-09-14 2:24 ` [PATCH v4 16/16] mm/page-flags: remove PG_private Zi Yan
2026-09-14 2:47 ` sashiko-bot
@ 2026-09-14 13:38 ` David Hildenbrand (Arm)
1 sibling, 0 replies; 15+ messages in thread
From: David Hildenbrand (Arm) @ 2026-09-14 13:38 UTC (permalink / raw)
To: Zi Yan, Matthew Wilcox (Oracle), Andrew Morton, Muchun Song,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Baolin Wang, Nico Pache,
Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif,
Gregory Price, Ying Huang, Alistair Popple, Johannes Weiner,
Qi Zheng, Shakeel Butt, Kairui Song
Cc: linux-mm, linux-kernel, Baoquan He, Pasha Tatashin,
Pratyush Yadav, Jonathan Corbet, Jan Kara, Steven Rostedt,
Masami Hiramatsu, Dave Young, Shuah Khan, Mathieu Desnoyers,
kexec, linux-doc, linux-fsdevel, linux-trace-kernel
On 9/14/26 04:24, Zi Yan wrote:
> folio->private != NULL indicates a folio carries private data, replacing
> PG_private. All PG_private users are converted. Remove PG_private and
> reserve the space as PG_folio for future use. Unused PG_private functions
> are removed too.
>
> Assisted-by: LLM
> Signed-off-by: Zi Yan <ziy@nvidia.com>
> To: Andrew Morton <akpm@linux-foundation.org>
> To: Baoquan He <baoquan.he@linux.dev>
> To: Mike Rapoport <rppt@kernel.org>
> To: Pasha Tatashin <pasha.tatashin@soleen.com>
> To: Pratyush Yadav <pratyush@kernel.org>
> To: Jonathan Corbet <corbet@lwn.net>
> To: "Matthew Wilcox (Oracle)" <willy@infradead.org>
> To: Jan Kara <jack@suse.cz>
> To: David Hildenbrand <david@kernel.org>
> To: Steven Rostedt <rostedt@goodmis.org>
> To: Masami Hiramatsu <mhiramat@kernel.org>
> Cc: Dave Young <ruirui.yang@linux.dev>
> Cc: Shuah Khan <skhan@linuxfoundation.org>
> Cc: Lorenzo Stoakes <ljs@kernel.org>
> Cc: "Liam R. Howlett" <liam@infradead.org>
> Cc: Vlastimil Babka <vbabka@kernel.org>
> Cc: Suren Baghdasaryan <surenb@google.com>
> Cc: Michal Hocko <mhocko@suse.com>
> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
> Cc: kexec@lists.infradead.org
> Cc: linux-doc@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Cc: linux-fsdevel@vger.kernel.org
> Cc: linux-mm@kvack.org
> Cc: linux-trace-kernel@vger.kernel.org
> ---
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
--
Cheers,
David
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead
2026-09-14 2:23 [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Zi Yan
2026-09-14 2:24 ` [PATCH v4 10/16] mm/page-flags: check page/folio->private instead of PG_private Zi Yan
2026-09-14 2:24 ` [PATCH v4 16/16] mm/page-flags: remove PG_private Zi Yan
@ 2026-09-14 3:39 ` Andrew Morton
2026-09-15 17:16 ` Zi Yan
2026-09-14 4:21 ` Matthew Wilcox
2026-09-14 15:30 ` [f2fs-dev] " patchwork-bot+f2fs
4 siblings, 1 reply; 15+ messages in thread
From: Andrew Morton @ 2026-09-14 3:39 UTC (permalink / raw)
To: Zi Yan
Cc: David Hildenbrand, Matthew Wilcox (Oracle), Muchun Song,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Baolin Wang, Nico Pache,
Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif,
Gregory Price, Ying Huang, Alistair Popple, Johannes Weiner,
Qi Zheng, Shakeel Butt, Kairui Song, linux-mm, linux-kernel,
Minchan Kim, Sergey Senozhatsky, Peter Zijlstra, Ingo Molnar,
Arnaldo Carvalho de Melo, Namhyung Kim, Thomas Gleixner,
Borislav Petkov, Dave Hansen, x86, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, H. Peter Anvin, linux-perf-users, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, Eric Biggers,
Theodore Y. Ts'o, Jaegeuk Kim, linux-fscrypt, Oscar Salvador,
Chao Yu, linux-f2fs-devel, Tal Zussman, Gao Xiang, Jan Kara,
Yue Hu, Jeffle Xu, Sandeep Dhavale, Hongbo Li, Chunhai Guo,
linux-erofs, linux-fsdevel, Steven Rostedt, Masami Hiramatsu,
Mathieu Desnoyers, Matthew Brost, Joshua Hahn, Rakie Kim,
Byungchul Park, Axel Rasmussen, Yuanchu Xie, Wei Xu,
linux-trace-kernel, Trond Myklebust, Anna Schumaker, linux-nfs,
Ilya Dryomov, Alex Markuze, Viacheslav Dubeyko, ceph-devel,
Song Liu, Yu Kuai, Li Nan, Xiao Ni, linux-raid,
Richard Weinberger, Zhihao Cheng, linux-mtd, Baoquan He,
Pasha Tatashin, Pratyush Yadav, Jonathan Corbet, Dave Young,
Shuah Khan, kexec, linux-doc
On Sun, 13 Sep 2026 22:23:58 -0400 Zi Yan <ziy@nvidia.com> wrote:
> This patchset removes PG_private to make space for upcoming PG_folio for
> identifying pages from a folio (more details in Note below). Instead of
> checking PG_private, all code is changed to check page/folio->private !=
> NULL instead.
>
> MM people are cc'd on all patches and subsystem people are cc'd on the
> cover letter and corresponding patches.
>
> Patch 6 is picked up separately in f2fs tree, but since mm-new does not
> have it yet, it is sent for MM testing.
AI review claims to have found a pre-existing critical level deadlock
in f2fs:
https://sashiko.dev/#/patchset/20260913-remove-pg_private-v4-0-848550f7574e@nvidia.com
it also had a few things to say about this patchset and, as always,
hugetlb.c.
Thanks, The MM bits appear adequately reviewed and review of the non-MM
bits are, as usual:
Great to have but I won't permit lack of other-than-MM review to
block MM improvements.
So I'll queue it all up and shall push it into -next after a few days.
Acks from non-MM maintainers are appreciated.
If a non-MM patch appears in linux-next I'll autodrop the mm.git copy
of that patch.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead
2026-09-14 3:39 ` [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Andrew Morton
@ 2026-09-15 17:16 ` Zi Yan
0 siblings, 0 replies; 15+ messages in thread
From: Zi Yan @ 2026-09-15 17:16 UTC (permalink / raw)
To: Andrew Morton
Cc: David Hildenbrand, Matthew Wilcox (Oracle), Muchun Song,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Baolin Wang, Nico Pache,
Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif,
Gregory Price, Ying Huang, Alistair Popple, Johannes Weiner,
Qi Zheng, Shakeel Butt, Kairui Song, linux-mm, linux-kernel,
Minchan Kim, Sergey Senozhatsky, Peter Zijlstra, Ingo Molnar,
Arnaldo Carvalho de Melo, Namhyung Kim, Thomas Gleixner,
Borislav Petkov, Dave Hansen, x86, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, H. Peter Anvin, linux-perf-users, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, Eric Biggers,
Theodore Y. Ts'o, Jaegeuk Kim, linux-fscrypt, Oscar Salvador,
Chao Yu, linux-f2fs-devel, Tal Zussman, Gao Xiang, Jan Kara,
Yue Hu, Jeffle Xu, Sandeep Dhavale, Hongbo Li, Chunhai Guo,
linux-erofs, linux-fsdevel, Steven Rostedt, Masami Hiramatsu,
Mathieu Desnoyers, Matthew Brost, Joshua Hahn, Rakie Kim,
Byungchul Park, Axel Rasmussen, Yuanchu Xie, Wei Xu,
linux-trace-kernel, Trond Myklebust, Anna Schumaker, linux-nfs,
Ilya Dryomov, Alex Markuze, Viacheslav Dubeyko, ceph-devel,
Song Liu, Yu Kuai, Li Nan, Xiao Ni, linux-raid,
Richard Weinberger, Zhihao Cheng, linux-mtd, Baoquan He,
Pasha Tatashin, Pratyush Yadav, Jonathan Corbet, Dave Young,
Shuah Khan, kexec, linux-doc
On 13 Sep 2026, at 23:39, Andrew Morton wrote:
> On Sun, 13 Sep 2026 22:23:58 -0400 Zi Yan <ziy@nvidia.com> wrote:
>
>> This patchset removes PG_private to make space for upcoming PG_folio for
>> identifying pages from a folio (more details in Note below). Instead of
>> checking PG_private, all code is changed to check page/folio->private !=
>> NULL instead.
>>
>> MM people are cc'd on all patches and subsystem people are cc'd on the
>> cover letter and corresponding patches.
>>
>> Patch 6 is picked up separately in f2fs tree, but since mm-new does not
>> have it yet, it is sent for MM testing.
>
> AI review claims to have found a pre-existing critical level deadlock
> in f2fs:
>
> https://sashiko.dev/#/patchset/20260913-remove-pg_private-v4-0-848550f7574e@nvidia.com
>
> it also had a few things to say about this patchset and, as always,
> hugetlb.c.
It seems that Sashiko overwrote my patch reviews with the reviews to
Matthew’s md patches. :/ I wonder if there is a way of recovering them.
>
>
> Thanks, The MM bits appear adequately reviewed and review of the non-MM
> bits are, as usual:
>
> Great to have but I won't permit lack of other-than-MM review to
> block MM improvements.
>
> So I'll queue it all up and shall push it into -next after a few days.
>
> Acks from non-MM maintainers are appreciated.
>
> If a non-MM patch appears in linux-next I'll autodrop the mm.git copy
> of that patch.
Thanks.
Best Regards,
Yan, Zi
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead
2026-09-14 2:23 [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Zi Yan
` (2 preceding siblings ...)
2026-09-14 3:39 ` [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Andrew Morton
@ 2026-09-14 4:21 ` Matthew Wilcox
2026-09-14 13:10 ` David Hildenbrand (Arm)
2026-09-14 15:30 ` [f2fs-dev] " patchwork-bot+f2fs
4 siblings, 1 reply; 15+ messages in thread
From: Matthew Wilcox @ 2026-09-14 4:21 UTC (permalink / raw)
To: Zi Yan
Cc: David Hildenbrand, Andrew Morton, Muchun Song, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Baolin Wang, Nico Pache,
Ryan Roberts, Dev Jain, Barry Song, Lance Yang, Usama Arif,
Gregory Price, Ying Huang, Alistair Popple, Johannes Weiner,
Qi Zheng, Shakeel Butt, Kairui Song, linux-mm, linux-kernel,
Minchan Kim, Sergey Senozhatsky, Peter Zijlstra, Ingo Molnar,
Arnaldo Carvalho de Melo, Namhyung Kim, Thomas Gleixner,
Borislav Petkov, Dave Hansen, x86, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, H. Peter Anvin, linux-perf-users, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, Eric Biggers,
Theodore Y. Ts'o, Jaegeuk Kim, linux-fscrypt, Oscar Salvador,
Chao Yu, linux-f2fs-devel, Tal Zussman, Gao Xiang, Jan Kara,
Yue Hu, Jeffle Xu, Sandeep Dhavale, Hongbo Li, Chunhai Guo,
linux-erofs, linux-fsdevel, Steven Rostedt, Masami Hiramatsu,
Mathieu Desnoyers, Matthew Brost, Joshua Hahn, Rakie Kim,
Byungchul Park, Axel Rasmussen, Yuanchu Xie, Wei Xu,
linux-trace-kernel, Trond Myklebust, Anna Schumaker, linux-nfs,
Ilya Dryomov, Alex Markuze, Viacheslav Dubeyko, ceph-devel,
Song Liu, Yu Kuai, Li Nan, Xiao Ni, linux-raid,
Richard Weinberger, Zhihao Cheng, linux-mtd, Baoquan He,
Pasha Tatashin, Pratyush Yadav, Jonathan Corbet, Dave Young,
Shuah Khan, kexec, linux-doc
On Sun, Sep 13, 2026 at 10:23:58PM -0400, Zi Yan wrote:
> md/md-bitmap: replace PagePrivate() with page_private()
> buffer: replace page_buffer() with page_private() and delete it
Sorry, looks like I screwed up git send-email usage. I'm proposing
replacing these two patches wth the three I sent.
^ permalink raw reply [flat|nested] 15+ messages in thread* Re: [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead
2026-09-14 4:21 ` Matthew Wilcox
@ 2026-09-14 13:10 ` David Hildenbrand (Arm)
0 siblings, 0 replies; 15+ messages in thread
From: David Hildenbrand (Arm) @ 2026-09-14 13:10 UTC (permalink / raw)
To: Matthew Wilcox, Zi Yan
Cc: Andrew Morton, Muchun Song, Lorenzo Stoakes, Liam R. Howlett,
Vlastimil Babka, Mike Rapoport, Suren Baghdasaryan, Michal Hocko,
Baolin Wang, Nico Pache, Ryan Roberts, Dev Jain, Barry Song,
Lance Yang, Usama Arif, Gregory Price, Ying Huang,
Alistair Popple, Johannes Weiner, Qi Zheng, Shakeel Butt,
Kairui Song, linux-mm, linux-kernel, Minchan Kim,
Sergey Senozhatsky, Peter Zijlstra, Ingo Molnar,
Arnaldo Carvalho de Melo, Namhyung Kim, Thomas Gleixner,
Borislav Petkov, Dave Hansen, x86, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
James Clark, H. Peter Anvin, linux-perf-users, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, xen-devel, Eric Biggers,
Theodore Y. Ts'o, Jaegeuk Kim, linux-fscrypt, Oscar Salvador,
Chao Yu, linux-f2fs-devel, Tal Zussman, Gao Xiang, Jan Kara,
Yue Hu, Jeffle Xu, Sandeep Dhavale, Hongbo Li, Chunhai Guo,
linux-erofs, linux-fsdevel, Steven Rostedt, Masami Hiramatsu,
Mathieu Desnoyers, Matthew Brost, Joshua Hahn, Rakie Kim,
Byungchul Park, Axel Rasmussen, Yuanchu Xie, Wei Xu,
linux-trace-kernel, Trond Myklebust, Anna Schumaker, linux-nfs,
Ilya Dryomov, Alex Markuze, Viacheslav Dubeyko, ceph-devel,
Song Liu, Yu Kuai, Li Nan, Xiao Ni, linux-raid,
Richard Weinberger, Zhihao Cheng, linux-mtd, Baoquan He,
Pasha Tatashin, Pratyush Yadav, Jonathan Corbet, Dave Young,
Shuah Khan, kexec, linux-doc
On 9/14/26 06:21, Matthew Wilcox wrote:
> On Sun, Sep 13, 2026 at 10:23:58PM -0400, Zi Yan wrote:
>> md/md-bitmap: replace PagePrivate() with page_private()
>> buffer: replace page_buffer() with page_private() and delete it
>
> Sorry, looks like I screwed up git send-email usage. I'm proposing
> replacing these two patches wth the three I sent.
For everybody CCed wondering "which patches":
https://lore.kernel.org/r/20260914041830.2072626-1-willy@infradead.org
https://lore.kernel.org/r/20260914041830.2072626-2-willy@infradead.org
https://lore.kernel.org/r/20260914041830.2072626-3-willy@infradead.org
--
Cheers,
David
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [f2fs-dev] [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead
2026-09-14 2:23 [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Zi Yan
` (3 preceding siblings ...)
2026-09-14 4:21 ` Matthew Wilcox
@ 2026-09-14 15:30 ` patchwork-bot+f2fs
4 siblings, 0 replies; 15+ messages in thread
From: patchwork-bot+f2fs @ 2026-09-14 15:30 UTC (permalink / raw)
To: Zi Yan
Cc: david, willy, akpm, muchun.song, ljs, liam, vbabka, rppt, surenb,
mhocko, baolin.wang, nico.pache, ryan.roberts, dev.jain, baohua,
lance.yang, usama.arif, gourry, ying.huang, apopple, hannes,
qi.zheng, shakeel.butt, kasong, mark.rutland, irogers, jack,
linux-doc, amarkuze, peterz, kexec, dave.hansen, ruirui.yang,
adrian.hunter, linux-mm, hongbohbli, hpa, guochunhai, skhan,
tz2294, baoquan.he, matthew.brost, anna, sstabellini, zbestahu,
rakie.kim, minchan, richard, x86, ceph-devel, ebiggers,
alexander.shishkin, mingo, slava, weixugc, yukuai, xen-devel,
xiang, magiclinan, mhiramat, joshua.hahnjy, xiao, byungchul,
james.clark, acme, linux-raid, linux-fscrypt, bp, rostedt,
linux-mtd, axelrasmussen, jefflexu, namhyung, jaegeuk, yuanchu,
idryomov, osalvador, jgross, pratyush, linux-nfs, tytso,
oleksandr_tyshchenko, song, corbet, pasha.tatashin, linux-kernel,
linux-f2fs-devel, linux-perf-users, senozhatsky, tglx, jolsa,
linux-fsdevel, mathieu.desnoyers, linux-trace-kernel, linux-erofs,
trondmy
Hello:
This series was applied to jaegeuk/f2fs.git (dev)
by Jaegeuk Kim <jaegeuk@kernel.org>:
On Sun, 13 Sep 2026 22:23:58 -0400 you wrote:
> Hi all,
>
> This patchset removes PG_private to make space for upcoming PG_folio for
> identifying pages from a folio (more details in Note below). Instead of
> checking PG_private, all code is changed to check page/folio->private !=
> NULL instead.
>
> [...]
Here is the summary with links:
- [f2fs-dev,v4,06/16] f2fs: stop using PG_private
https://git.kernel.org/jaegeuk/f2fs/c/60105162524e
- [f2fs-dev,v4,07/16] f2fs: convert the ->private flag helpers to folio-only
(no matching commit)
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 15+ messages in thread