From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out-172.mta0.migadu.com (out-172.mta0.migadu.com [91.218.175.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C012638D for ; Sat, 1 Aug 2026 14:13:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785593590; cv=none; b=EFfVBHH9GigkPGbia5eTYoJ2z6yVmlwVaegM2pdFpFIU7EleP6N2Zm+vccCnIh4jDdGEJQPWiZyWoRYLEV+13gdQHcBe9+q4VRjD8G+QtyJHjKKW5/F3PEI/78D6diXbwXVcZDj3iFTY5cDBofZm5F85e92wsm86xtjiXq1tgfM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785593590; c=relaxed/simple; bh=ZVXAOAAPLrxENk5OSxQdmwHgFnuHbavmv81fo4fmim0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FixoNLiUwIF8q1Rhng+7zYI/neHGj/U2vazl+zHOVU4hGyYneb4z4cLBG24HgVG9lP1KIQ0hqUR84BXJ54Gz6ViaUpUnxKuh866RDsQtK+uT8j2DSce4oj3Wo6HdJgqtlAuT2RoFlQcTnH8vmFoA5NQvfbKZmULFiIPa3kJBEF4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=GR8qNynB; arc=none smtp.client-ip=91.218.175.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="GR8qNynB" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1785593585; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QBNtXuv05JvF8EzNDyyEZc/1B79zvG0gadCVGtLxbz4=; b=GR8qNynBgqn9w1313L6f1le25ZwKgBwEypv3oBjasQiJFX7SVThH/j7rHKhKtFQSVAs2SG vaHGSdJArVyihEp4BctuMX8sufRqZ3Chv4Jpx/rPbQxEJ+8vgpluXgyOBsedb8/pn8vDha wjBq8eogjybroq6KHwJNQcGTvfLWvOA= From: Usama Arif To: Zi Yan Cc: Usama Arif , 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 , Gregory Price , Ying Huang , Alistair Popple , Johannes Weiner , Qi Zheng , Shakeel Butt , Kairui Song , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Minchan Kim , Sergey Senozhatsky Subject: Re: [PATCH RFC 01/14] mm/zsmalloc: replace PG_private with pointer comparison Date: Sat, 1 Aug 2026 07:12:57 -0700 Message-ID: <20260801141259.627022-1-usama.arif@linux.dev> In-Reply-To: <20260731-remove-pg_private-v1-1-142c97ba3562@nvidia.com> References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT On Fri, 31 Jul 2026 22:13:24 -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 > To: Minchan Kim > To: Sergey Senozhatsky > To: Andrew Morton > 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(-) > create_page_chain() sets zpdesc->zspage = zspage before assigning zspage->first_zpdesc, so LGTM. I think the assertion in get_first_zpdesc() should be changed to VM_BUG_ON_PAGE(first_zpdesc->zspage != zspage, zpdesc_page(first_zpdesc)); in the current check, we are checking zspage->first_zpdesc->zspage->first_zpdesc == zspage->first_zpdesc which is just testing the backpointer. With the above VM_BUG_ON check change, please feel free to add: Acked-by: Usama Arif > 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; > } > > /* Protected by class->lock */ > @@ -848,9 +843,6 @@ static inline bool obj_allocated(struct zpdesc *zpdesc, void *obj, > > static void reset_zpdesc(struct zpdesc *zpdesc) > { > - struct page *page = zpdesc_page(zpdesc); > - > - ClearPagePrivate(page); > zpdesc->zspage = NULL; > zpdesc->next = NULL; > /* PageZsmalloc is sticky until the page is freed to the buddy. */ > @@ -1001,8 +993,8 @@ static void create_page_chain(struct size_class *class, struct zspage *zspage, > * 1. all pages are linked together using zpdesc->next > * 2. each sub-page point to zspage using zpdesc->zspage > * > - * we set PG_private to identify the first zpdesc (i.e. no other zpdesc > - * has this flag set). > + * The first zpdesc has its zspage->first_zpdesc set to itself, no > + * other zpdesc has this set. > */ > for (i = 0; i < nr_zpdescs; i++) { > zpdesc = zpdescs[i]; > @@ -1010,7 +1002,6 @@ static void create_page_chain(struct size_class *class, struct zspage *zspage, > zpdesc->next = NULL; > if (i == 0) { > zspage->first_zpdesc = zpdesc; > - zpdesc_set_first(zpdesc); > if (unlikely(class->objs_per_zspage == 1 && > class->pages_per_zspage == 1)) > SetZsHugePage(zspage); > > -- > 2.53.0 > >