The Linux Kernel Mailing List
 help / color / mirror / Atom feed
From: Johannes Weiner <hannes@cmpxchg.org>
To: Zi Yan <ziy@nvidia.com>
Cc: David Hildenbrand <david@kernel.org>,
	"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>,
	Qi Zheng <qi.zheng@linux.dev>,
	Shakeel Butt <shakeel.butt@linux.dev>,
	Kairui Song <kasong@tencent.com>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Minchan Kim <minchan@kernel.org>,
	Sergey Senozhatsky <senozhatsky@chromium.org>
Subject: Re: [PATCH RFC 01/14] mm/zsmalloc: replace PG_private with pointer comparison
Date: Mon, 3 Aug 2026 12:53:53 -0400	[thread overview]
Message-ID: <anDHoYNn0lPc34cK@cmpxchg.org> (raw)
In-Reply-To: <DKFF32LRYH32.16JIXI4LUS5E9@nvidia.com>

On Mon, Aug 03, 2026 at 11:34:35AM -0400, Zi Yan wrote:
> On Mon Aug 3, 2026 at 11:04 AM EDT, Johannes Weiner wrote:
> > On Fri, Jul 31, 2026 at 10:13:24PM -0400, Zi Yan wrote:
> >> zsmalloc uses PG_private to indicate first zpdesc in the zspage chain.
> >> Replace it with zpdesc->zspage->first_zpdesc == zpdesc. The check,
> >> is_first_zpdesc(), is only used in VM_BUG_ON(), so performance impact
> >> should be negligible.
> >> 
> >> It prepares for a future commit that remove PG_private.
> >> 
> >> No functional change intended.
> >> 
> >> Assisted-by: Claude:claude-opus-4-8
> >> Assisted-by: Codex:gpt-5
> >> Signed-off-by: Zi Yan <ziy@nvidia.com>
> >> To: Minchan Kim <minchan@kernel.org>
> >> To: Sergey Senozhatsky <senozhatsky@chromium.org>
> >> To: Andrew Morton <akpm@linux-foundation.org>
> >> Cc: linux-mm@kvack.org
> >> Cc: linux-kernel@vger.kernel.org
> >> ---
> >>  mm/zpdesc.h   |  2 +-
> >>  mm/zsmalloc.c | 15 +++------------
> >>  2 files changed, 4 insertions(+), 13 deletions(-)
> >> 
> >> diff --git a/mm/zpdesc.h b/mm/zpdesc.h
> >> index b8258dc78548d..4fd81c2e80769 100644
> >> --- a/mm/zpdesc.h
> >> +++ b/mm/zpdesc.h
> >> @@ -26,8 +26,8 @@
> >>   * with memcg_data.
> >>   *
> >>   * Page flags used:
> >> - * * PG_private identifies the first component page.
> >>   * * PG_locked is used by page migration code.
> >> + * The first component page has zpdesc->zspage->first_zpdesc == zpdesc
> >>   */
> >>  struct zpdesc {
> >>  	unsigned long flags;
> >> diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
> >> index 8204b76f78308..e8ef227624efa 100644
> >> --- a/mm/zsmalloc.c
> >> +++ b/mm/zsmalloc.c
> >> @@ -290,11 +290,6 @@ struct zs_pool {
> >>  	atomic_t compaction_in_progress;
> >>  };
> >>  
> >> -static inline void zpdesc_set_first(struct zpdesc *zpdesc)
> >> -{
> >> -	SetPagePrivate(zpdesc_page(zpdesc));
> >> -}
> >> -
> >>  static inline void zpdesc_inc_zone_page_state(struct zpdesc *zpdesc)
> >>  {
> >>  	inc_zone_page_state(zpdesc_page(zpdesc), NR_ZSPAGES);
> >> @@ -478,7 +473,7 @@ static void record_obj(unsigned long handle, unsigned long obj)
> >>  
> >>  static inline bool __maybe_unused is_first_zpdesc(struct zpdesc *zpdesc)
> >>  {
> >> -	return PagePrivate(zpdesc_page(zpdesc));
> >> +	return zpdesc->zspage->first_zpdesc == zpdesc;
> >>  }
> >
> > There are two checks: get_first_zpdesc() and obj_allocated().
> >
> > static struct zpdesc *get_first_zpdesc(struct zspage *zspage)
> > {
> > 	struct zpdesc *first_zpdesc = zspage->first_zpdesc;
> >
> > 	VM_BUG_ON_PAGE(is_first_zpdesc(first_zpdesc), zpdesc_page(first_zpdesc));
> > 	return first_zpdesc;
> > }
> >
> > If you expand the helper, this seems kind of pointless now:
> >
> > 	first_zpdesc = zspage->first_zpdesc;
> > 	VM_BUG_ON_PAGE(first_zpdesc != first_zpdesc->zspage->first_zpdesc, ...);
> >
> > Mayyybe it could make sense to assert first_zpdesc->zspage !=
> > zspage. But that's a separate issue that the previous check didn't
> 
> Usama has the same comment about this.
> 
> > necessarily catch. And might not be worth checking, considering how
> > trivial create_page_chain() is.
> >
> > In any case, it doesn't seem worth keeping the check as-is.
> >
> > And with one caller remaining, you could delete the helper and inline
> > that expression into the check in obj_allocated(). What it does now is
> > self-explanatory; it doesn't need another name like that PagePrivate()
> > check before did.
> 
> How about the version below? Basically, I made is_first_zpdesc() more
> straightforward for backpointer checking and first_zpdesc checking.
> 
> 1. get_first_zpdesc() needs the backpointer check; the first_zpdesc check is
> meaningless, since the assignment is done above.
> 
> 2. obj_allocated() needs the first_zpdesc check; the backpointer check
> is meaningless, since the zspage is from get_zspage().

Personally, I'm not a fan of "super predicates" where individual
conditions are only useful for only some of the callsites. They tend
to become obstacles to understanding the code and lead to subtle bugs
when developers misunderstand context requirements.

IMO it's better to just precisely express what each callsite
needs. Only factor a common helper if it's actually the same.

  reply	other threads:[~2026-08-03 16:53 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-01  2:13 [PATCH RFC 00/14] Remove PG_private by using page/folio->private checks instead Zi Yan
2026-08-01  2:13 ` [PATCH RFC 01/14] mm/zsmalloc: replace PG_private with pointer comparison Zi Yan
2026-08-01 14:12   ` Usama Arif
2026-08-01 23:49     ` Zi Yan
2026-08-02 12:05       ` Usama Arif
2026-08-02 18:38         ` Zi Yan
2026-08-03 15:04   ` Johannes Weiner
2026-08-03 15:34     ` Zi Yan
2026-08-03 16:53       ` Johannes Weiner [this message]
2026-08-03 21:05         ` Zi Yan
2026-08-01  2:13 ` [PATCH RFC 02/14] perf/ring_buffer: stop using PG_private as AUX page high-order marker Zi Yan
2026-08-01 14:32   ` Usama Arif
2026-08-02  1:20     ` Zi Yan
2026-08-01  2:13 ` [PATCH RFC 03/14] xen/grant-table: stop setting PG_private on pages for grant mapping Zi Yan
2026-08-01 14:42   ` Usama Arif
2026-08-02  1:24     ` Zi Yan
2026-08-01  2:13 ` [PATCH RFC 04/14] fs/crypto: stop setting PG_private on bounce page Zi Yan
2026-08-01 14:52   ` Usama Arif
2026-08-02  1:29     ` Zi Yan
2026-08-03 18:40   ` Eric Biggers
2026-08-01  2:13 ` [PATCH RFC 05/14] mm/hugetlb: use direct assignment instead of folio_change_private() Zi Yan
2026-08-02 12:16   ` Usama Arif
2026-08-02 18:38     ` Zi Yan
2026-08-01  2:13 ` [PATCH RFC 06/14] fs/f2fs: stop using PG_private Zi Yan
2026-08-03 11:17   ` Chao Yu
2026-08-01  2:13 ` [PATCH RFC 07/14] fs/erofs: mm/pagemap: add readahead_folio_reverse() to avoid folio->private Zi Yan
2026-08-03  9:54   ` Jan Kara
2026-08-03 16:56     ` Zi Yan
2026-08-03 23:55   ` Gao Xiang
2026-08-01  2:13 ` [PATCH RFC 08/14] fs/erofs: use folio_attach/detach_private() instead of direct assignment Zi Yan
2026-08-03 23:40   ` Gao Xiang
2026-08-01  2:13 ` [PATCH RFC 09/14] mm/page-flags: check page/folio->private instead of PG_private Zi Yan
2026-08-01  2:13 ` [PATCH RFC 10/14] mm/page-flags: introduce folio_test_fs_private() Zi Yan
2026-08-01  2:13 ` [PATCH RFC 11/14] treewide: remove folio_set/clear_private() Zi Yan
2026-08-01  2:13 ` [PATCH RFC 12/14] treewide: replace PagePrivate() with page_private() Zi Yan
2026-08-01  2:13 ` [PATCH RFC 13/14] treewide: adjust comments on PagePrivate and PG_private Zi Yan
2026-08-01  2:13 ` [PATCH RFC 14/14] mm/page-flags: remove PG_private Zi Yan
2026-08-03  9:07 ` [PATCH RFC 00/14] Remove PG_private by using page/folio->private checks instead Jürgen Groß
2026-08-03 18:13   ` Zi Yan

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=anDHoYNn0lPc34cK@cmpxchg.org \
    --to=hannes@cmpxchg.org \
    --cc=akpm@linux-foundation.org \
    --cc=apopple@nvidia.com \
    --cc=baohua@kernel.org \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=david@kernel.org \
    --cc=dev.jain@arm.com \
    --cc=gourry@gourry.net \
    --cc=kasong@tencent.com \
    --cc=lance.yang@linux.dev \
    --cc=liam@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=ljs@kernel.org \
    --cc=mhocko@suse.com \
    --cc=minchan@kernel.org \
    --cc=muchun.song@linux.dev \
    --cc=nico.pache@linux.dev \
    --cc=qi.zheng@linux.dev \
    --cc=rppt@kernel.org \
    --cc=ryan.roberts@arm.com \
    --cc=senozhatsky@chromium.org \
    --cc=shakeel.butt@linux.dev \
    --cc=surenb@google.com \
    --cc=usama.arif@linux.dev \
    --cc=vbabka@kernel.org \
    --cc=willy@infradead.org \
    --cc=ying.huang@linux.alibaba.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox