From: "David Hildenbrand (Arm)" <david@kernel.org>
To: Zi Yan <ziy@nvidia.com>,
"Matthew Wilcox (Oracle)" <willy@infradead.org>,
Andrew Morton <akpm@linux-foundation.org>,
Muchun Song <muchun.song@linux.dev>,
Lorenzo Stoakes <ljs@kernel.org>,
"Liam R. Howlett" <liam@infradead.org>,
Vlastimil Babka <vbabka@kernel.org>,
Mike Rapoport <rppt@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
Nico Pache <nico.pache@linux.dev>,
Ryan Roberts <ryan.roberts@arm.com>, Dev Jain <dev.jain@arm.com>,
Barry Song <baohua@kernel.org>, Lance Yang <lance.yang@linux.dev>,
Usama Arif <usama.arif@linux.dev>,
Gregory Price <gourry@gourry.net>,
Ying Huang <ying.huang@linux.alibaba.com>,
Alistair Popple <apopple@nvidia.com>,
Johannes Weiner <hannes@cmpxchg.org>,
Qi Zheng <qi.zheng@linux.dev>,
Shakeel Butt <shakeel.butt@linux.dev>,
Kairui Song <kasong@tencent.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Steven Rostedt <rostedt@goodmis.org>,
Masami Hiramatsu <mhiramat@kernel.org>, Jan Kara <jack@suse.cz>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Matthew Brost <matthew.brost@intel.com>,
Joshua Hahn <joshua.hahnjy@gmail.com>,
Rakie Kim <rakie.kim@sk.com>, Byungchul Park <byungchul@sk.com>,
Axel Rasmussen <axelrasmussen@google.com>,
Yuanchu Xie <yuanchu@google.com>, Wei Xu <weixugc@google.com>,
linux-fsdevel@vger.kernel.org,
linux-trace-kernel@vger.kernel.org
Subject: Re: [PATCH v4 10/16] mm/page-flags: check page/folio->private instead of PG_private
Date: Mon, 14 Sep 2026 15:26:32 +0200 [thread overview]
Message-ID: <37f9a01c-4f6f-429d-b221-73ceffd55369@kernel.org> (raw)
In-Reply-To: <20260913-remove-pg_private-v4-10-848550f7574e@nvidia.com>
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
next prev parent reply other threads:[~2026-09-14 13:26 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
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:23 ` Zi Yan
2026-09-14 2:23 ` [f2fs-dev] " Zi Yan via Linux-f2fs-devel
2026-09-14 2:23 ` [PATCH v4 01/16] mm/zsmalloc: replace PG_private with pointer comparison Zi Yan
2026-09-14 2:24 ` [PATCH v4 02/16] perf/ring_buffer: stop using PG_private as AUX page high-order marker Zi Yan
2026-09-14 2:36 ` sashiko-bot
2026-09-14 2:24 ` [PATCH v4 03/16] xen/grant-table: stop setting PG_private on pages for grant mapping Zi Yan
2026-09-14 13:15 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 04/16] fscrypt: stop setting PG_private on bounce page Zi Yan
2026-09-14 2:24 ` [PATCH v4 05/16] mm/hugetlb: use direct assignment instead of folio_change_private() Zi Yan
2026-09-14 2:58 ` Muchun Song
2026-09-14 13:16 ` David Hildenbrand (Arm)
2026-09-16 1:56 ` Zi Yan
2026-09-16 6:12 ` David Hildenbrand (Arm)
2026-09-18 1:41 ` Zi Yan
2026-09-18 3:13 ` Muchun Song
2026-09-14 2:24 ` [f2fs-dev] [PATCH v4 06/16] f2fs: stop using PG_private Zi Yan via Linux-f2fs-devel
2026-09-14 2:24 ` Zi Yan
2026-09-14 13:17 ` [f2fs-dev] " David Hildenbrand (Arm) via Linux-f2fs-devel
2026-09-14 13:17 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [f2fs-dev] [PATCH v4 07/16] f2fs: convert the ->private flag helpers to folio-only Zi Yan via Linux-f2fs-devel
2026-09-14 2:24 ` Zi Yan
2026-09-16 2:20 ` [f2fs-dev] " Zi Yan via Linux-f2fs-devel
2026-09-16 2:20 ` Zi Yan
2026-09-14 2:24 ` [PATCH v4 08/16] erofs: mm/pagemap: add readahead_folio_last() to avoid folio->private Zi Yan
2026-09-14 2:24 ` [PATCH v4 09/16] erofs: use folio_attach/detach_private() instead of direct assignment Zi Yan
2026-09-14 13:18 ` David Hildenbrand (Arm)
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) [this message]
2026-09-14 14:44 ` Zi Yan
2026-09-14 15:11 ` David Hildenbrand (Arm)
2026-09-14 15:21 ` Zi Yan
2026-09-14 2:24 ` [PATCH v4 11/16] treewide: remove folio_set/clear_private() usage Zi Yan
2026-09-14 2:24 ` [PATCH v4 12/16] ceph: replace PagePrivate() with page_private() Zi Yan
2026-09-14 13:26 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 13/16] md/md-bitmap: " Zi Yan
2026-09-14 2:24 ` [PATCH v4 14/16] buffer: replace page_buffer() with page_private() and delete it Zi Yan
2026-09-14 2:24 ` [PATCH v4 15/16] treewide: remove PagePrivate() and PG_private from comments and docs Zi Yan
2026-09-14 2:24 ` Zi Yan
2026-09-14 13:36 ` David Hildenbrand (Arm)
2026-09-14 13:36 ` David Hildenbrand (Arm)
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)
2026-09-14 3:39 ` [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Andrew Morton
2026-09-14 3:39 ` Andrew Morton
2026-09-14 3:39 ` [f2fs-dev] " Andrew Morton
2026-09-15 17:16 ` Zi Yan
2026-09-15 17:16 ` Zi Yan
2026-09-15 17:16 ` [f2fs-dev] " Zi Yan via Linux-f2fs-devel
2026-09-15 18:18 ` Zi Yan via Linux-f2fs-devel
2026-09-14 4:18 ` [PATCH 1/3] md: Use folio_alloc_buffers() Matthew Wilcox (Oracle)
2026-09-14 4:27 ` sashiko-bot
2026-09-14 13:12 ` David Hildenbrand (Arm)
2026-09-14 13:17 ` Matthew Wilcox
2026-09-14 13:20 ` David Hildenbrand (Arm)
2026-09-14 14:36 ` Zi Yan
2026-09-14 4:18 ` [PATCH 2/3] md: Use folio APIs in free_page() Matthew Wilcox (Oracle)
2026-09-14 4:31 ` sashiko-bot
2026-09-14 16:21 ` Matthew Wilcox
2026-09-14 16:25 ` Zi Yan
2026-09-14 13:13 ` David Hildenbrand (Arm)
2026-09-14 4:18 ` [PATCH 3/3] md: Remove the last use of page_buffers() Matthew Wilcox (Oracle)
2026-09-14 4:29 ` sashiko-bot
2026-09-14 13:14 ` David Hildenbrand (Arm)
2026-09-14 4:21 ` [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Matthew Wilcox
2026-09-14 4:21 ` Matthew Wilcox
2026-09-14 4:21 ` [f2fs-dev] " Matthew Wilcox
2026-09-14 13:10 ` David Hildenbrand (Arm)
2026-09-14 13:10 ` David Hildenbrand (Arm)
2026-09-14 13:10 ` [f2fs-dev] " David Hildenbrand (Arm) via Linux-f2fs-devel
2026-09-14 15:30 ` patchwork-bot+f2fs
2026-09-14 15:30 ` patchwork-bot+f2fs
2026-09-14 15:30 ` patchwork-bot+f2fs--- via Linux-f2fs-devel
2026-09-15 21:49 ` Andrew Morton
2026-09-15 23:14 ` Roman Gushchin
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=37f9a01c-4f6f-429d-b221-73ceffd55369@kernel.org \
--to=david@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=apopple@nvidia.com \
--cc=axelrasmussen@google.com \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=byungchul@sk.com \
--cc=dev.jain@arm.com \
--cc=gourry@gourry.net \
--cc=hannes@cmpxchg.org \
--cc=jack@suse.cz \
--cc=joshua.hahnjy@gmail.com \
--cc=kasong@tencent.com \
--cc=lance.yang@linux.dev \
--cc=liam@infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=ljs@kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=matthew.brost@intel.com \
--cc=mhiramat@kernel.org \
--cc=mhocko@suse.com \
--cc=muchun.song@linux.dev \
--cc=nico.pache@linux.dev \
--cc=qi.zheng@linux.dev \
--cc=rakie.kim@sk.com \
--cc=rostedt@goodmis.org \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=shakeel.butt@linux.dev \
--cc=surenb@google.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@kernel.org \
--cc=weixugc@google.com \
--cc=willy@infradead.org \
--cc=ying.huang@linux.alibaba.com \
--cc=yuanchu@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.