From nobody Thu Dec 18 20:17:58 2025 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F1921B0416 for ; Wed, 18 Dec 2024 13:06:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734527211; cv=none; b=tSJrQE6hjSCVE7LQUzXrYK/KGKdmUNUnVxVK0PFAlOsEyOMb3JPdnXsAqH/BKUGw+N/eax5rLbGagYy+Iw56bPZg1mqTZoR1hqPkOTs6qoRB8tTYIEoUZk8FZvXkgknSQEcphCpH7FdnYifaPLfwBz5KPS0VcW2xRdgyvJRGyNg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734527211; c=relaxed/simple; bh=FWnScBZWDkJC1PU9kN58Q0gpTpGjLpyMzHDV709Ekfs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=NBK0luxtqrpEl4YDf3lJ0wKvvoay9fzREm4XBH4ktfD8jPfhEaqctKSt3Z0h1waf7mauKD847CiYSvdvzbX4dy4VXiM6YiXPrEVJM1DfZzV6AWO+axShd+5cC81Gc8LbPOWN7YtUb10311Xvs1/YiN43N0qjmU+xnlttpV99+tw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com; spf=pass smtp.mailfrom=bytedance.com; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b=CxPTcnt6; arc=none smtp.client-ip=209.85.214.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=bytedance.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bytedance.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bytedance.com header.i=@bytedance.com header.b="CxPTcnt6" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2164b662090so51909455ad.1 for ; Wed, 18 Dec 2024 05:06:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1734527209; x=1735132009; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=KC7Ql8GT7M6xqj/drFleO18sYzKRSHwzPDd2hD5Jtik=; b=CxPTcnt6vWgAFFD4FCIXm7FpyxF5pJ5gaXYKleumX3a2WPRNZLejptUikq5W6ON2js kN1COofk55jd6S/wFc/34pdG/hSe1W8OCruZb5x/H3gU7vTJffPVYqzbHafd1w1A7bc5 9mTAo0o3eqVkAK1f0rYm+7yNvZV0/DAmZu6Y2hlujzB08Tb47ZROSAyoTTH5FiQ05/UI oRlm6s3lAT2HxJrIlRFASXxutCzthka2ZHriN7oikHDSgm+hsi+lmsbGU54S5AxQVkre jPweWyVP+JBPFsIJCEXN6VUd8CVrk+6ax3Ij9churU+Itie5jZxgOFKNfqB7uistl/YN 8EeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734527209; x=1735132009; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KC7Ql8GT7M6xqj/drFleO18sYzKRSHwzPDd2hD5Jtik=; b=u+smNNt67DkTMd90O6o781LyJ0ni6hfXTdzG5U5Mc/BDbmOW9kjHXxvXsrZ4r225ah sibivodQOZJyU2LJhBkMoHUSX0iKxTmmwiHSUpaMBF2f86P2Zsapan0GFz4nI8X+HeQS tRLIs1v10alDKP81QnJzTfi725kYX/xIHByViPSGl9FRykIh95J0EM95hpcRwm+LxsI6 8hJikZY3Ia10KNycetkwtuY+wtZypKxaGkiONj2TcjvghwztPWnKL637S9fN/munvOOe OMLrBob8nSTFBZbB7RPyDxqjvIrbz9tCKO3+otZIsQw2k8k5uISJL4uOFpVn4pQXoTQ7 PdJw== X-Forwarded-Encrypted: i=1; AJvYcCXLfpyL3YrOPBvWAGYL6/WwfMoFDEIDUXLZoeZkvCwuwTQ0d0oifno6/O8WiajH70x42K2uf1p7QbWDOzM=@vger.kernel.org X-Gm-Message-State: AOJu0YyTIISdw7pgaF2hT9k9534/byVAC7OCZgB97wANz+pNRrsjDPPQ wzNDC6mfUTYnQScPi7aL2eNlgm3oz6JpuU0BBFdfJjiSxw2TMkQtu9PBpOFoUkc= X-Gm-Gg: ASbGncsXuH2p4FdWHPrnKBYUV1rbkbR7mZeYw7OHQaEs5QdOTRnqnAY7dzb3xiVjYge BGVxqeKfMJBIgbyJ9NBYCMUqR+oJKqj/cjWuuZZ/h6Jy1mz6YsP/yWdUGk0k/UGuK93W+1Iqizk TLeprvBWBCIsiWjswCkjrOsz1WCPHR1j/RzBqIgLKucKK+gHxBTm+8ICHFWnGeglwcd+ap9Ze7Y YyZs5Gj8m+ZAu6nDoi3gJB79HkbQFQXPD4l+aTBY9t55CKdpY5ZmkXBofviNbJgFTpw6XzpyYNx ZaNRSXOnd3wUBKKvxTo3Xw== X-Google-Smtp-Source: AGHT+IFeQHKjf5x1j6HplQpPLqOMHr9gUGeYMwElc8Se13maebUbMGrfsZ8FVIlBe6kXPLktzNwjjA== X-Received: by 2002:a17:902:cccd:b0:215:6cb2:7877 with SMTP id d9443c01a7336-218d6fcc257mr40842835ad.4.1734527209409; Wed, 18 Dec 2024 05:06:49 -0800 (PST) Received: from C02DW0BEMD6R.bytedance.net ([139.177.225.238]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-218a1db755dsm75751825ad.42.2024.12.18.05.06.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Dec 2024 05:06:49 -0800 (PST) From: Qi Zheng To: peterz@infradead.org, tglx@linutronix.de, david@redhat.com, jannh@google.com, hughd@google.com, yuzhao@google.com, willy@infradead.org, muchun.song@linux.dev, vbabka@kernel.org, lorenzo.stoakes@oracle.com, akpm@linux-foundation.org, rientjes@google.com, vishal.moola@gmail.com Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Qi Zheng Subject: [PATCH v2 15/15] mm: pgtable: introduce generic pagetable_dtor_free() Date: Wed, 18 Dec 2024 21:04:51 +0800 Message-Id: X-Mailer: git-send-email 2.24.3 (Apple Git-128) In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The pte_free(), pmd_free(), __pud_free() and __p4d_free() in asm-generic/pgalloc.h and the generic __tlb_remove_table() are actually the same, so let's introduce pagetable_dtor_free() to deduplicate them. In addition, the pagetable_dtor_free() in s390 actually does the same thing, so let's s390 also calls generic pagetable_dtor_free(). Signed-off-by: Qi Zheng Suggested-by: Peter Zijlstra (Intel) --- arch/s390/mm/pgalloc.c | 18 ++++++------------ include/asm-generic/pgalloc.h | 23 ++++------------------- include/asm-generic/tlb.h | 5 +---- include/linux/mm.h | 8 ++++++++ 4 files changed, 19 insertions(+), 35 deletions(-) diff --git a/arch/s390/mm/pgalloc.c b/arch/s390/mm/pgalloc.c index 3e002dea6278f..1e0727be48eaf 100644 --- a/arch/s390/mm/pgalloc.c +++ b/arch/s390/mm/pgalloc.c @@ -180,32 +180,26 @@ unsigned long *page_table_alloc(struct mm_struct *mm) return table; } =20 -static void pagetable_dtor_free(struct ptdesc *ptdesc) -{ - pagetable_dtor(ptdesc); - pagetable_free(ptdesc); -} - void page_table_free(struct mm_struct *mm, unsigned long *table) { - struct ptdesc *ptdesc =3D virt_to_ptdesc(table); + struct page *page =3D virt_to_page(table); =20 - pagetable_dtor_free(ptdesc); + pagetable_dtor_free(page); } =20 #ifdef CONFIG_TRANSPARENT_HUGEPAGE static void pte_free_now(struct rcu_head *head) { - struct ptdesc *ptdesc =3D container_of(head, struct ptdesc, pt_rcu_head); + struct page *page =3D container_of(head, struct page, rcu_head); =20 - pagetable_dtor_free(ptdesc); + pagetable_dtor_free(page); } =20 void pte_free_defer(struct mm_struct *mm, pgtable_t pgtable) { - struct ptdesc *ptdesc =3D virt_to_ptdesc(pgtable); + struct page *page =3D virt_to_page(pgtable); =20 - call_rcu(&ptdesc->pt_rcu_head, pte_free_now); + call_rcu(&page->rcu_head, pte_free_now); /* * THPs are not allowed for KVM guests. Warn if pgste ever reaches here. * Turn to the generic pte_free_defer() version once gmap is removed. diff --git a/include/asm-generic/pgalloc.h b/include/asm-generic/pgalloc.h index 3673e9c29504e..370f5b579ff88 100644 --- a/include/asm-generic/pgalloc.h +++ b/include/asm-generic/pgalloc.h @@ -107,10 +107,7 @@ static inline pgtable_t pte_alloc_one_noprof(struct mm= _struct *mm) */ static inline void pte_free(struct mm_struct *mm, struct page *pte_page) { - struct ptdesc *ptdesc =3D page_ptdesc(pte_page); - - pagetable_dtor(ptdesc); - pagetable_free(ptdesc); + pagetable_dtor_free(pte_page); } =20 =20 @@ -150,11 +147,7 @@ static inline pmd_t *pmd_alloc_one_noprof(struct mm_st= ruct *mm, unsigned long ad #ifndef __HAVE_ARCH_PMD_FREE static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) { - struct ptdesc *ptdesc =3D virt_to_ptdesc(pmd); - - BUG_ON((unsigned long)pmd & (PAGE_SIZE-1)); - pagetable_dtor(ptdesc); - pagetable_free(ptdesc); + pagetable_dtor_free(virt_to_page(pmd)); } #endif =20 @@ -199,11 +192,7 @@ static inline pud_t *pud_alloc_one_noprof(struct mm_st= ruct *mm, unsigned long ad =20 static inline void __pud_free(struct mm_struct *mm, pud_t *pud) { - struct ptdesc *ptdesc =3D virt_to_ptdesc(pud); - - BUG_ON((unsigned long)pud & (PAGE_SIZE-1)); - pagetable_dtor(ptdesc); - pagetable_free(ptdesc); + pagetable_dtor_free(virt_to_page(pud)); } =20 #ifndef __HAVE_ARCH_PUD_FREE @@ -254,11 +243,7 @@ static inline p4d_t *p4d_alloc_one_noprof(struct mm_st= ruct *mm, unsigned long ad =20 static inline void __p4d_free(struct mm_struct *mm, p4d_t *p4d) { - struct ptdesc *ptdesc =3D virt_to_ptdesc(p4d); - - BUG_ON((unsigned long)p4d & (PAGE_SIZE-1)); - pagetable_dtor(ptdesc); - pagetable_free(ptdesc); + pagetable_dtor_free(virt_to_page(p4d)); } =20 #ifndef __HAVE_ARCH_P4D_FREE diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h index 583e95568f52b..ef25169523602 100644 --- a/include/asm-generic/tlb.h +++ b/include/asm-generic/tlb.h @@ -211,10 +211,7 @@ struct mmu_table_batch { #ifndef __HAVE_ARCH_TLB_REMOVE_TABLE static inline void __tlb_remove_table(void *table) { - struct ptdesc *ptdesc =3D page_ptdesc((struct page *)table); - - pagetable_dtor(ptdesc); - pagetable_free(ptdesc); + pagetable_dtor_free(table); } #endif =20 diff --git a/include/linux/mm.h b/include/linux/mm.h index 736215c428293..f2d04eec66076 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -3095,6 +3095,14 @@ static inline void pagetable_dtor(struct ptdesc *ptd= esc) lruvec_stat_sub_folio(folio, NR_PAGETABLE); } =20 +static inline void pagetable_dtor_free(void *table) +{ + struct ptdesc *ptdesc =3D page_ptdesc((struct page *)table); + + pagetable_dtor(ptdesc); + pagetable_free(ptdesc); +} + static inline bool pagetable_pte_ctor(struct ptdesc *ptdesc) { struct folio *folio =3D ptdesc_folio(ptdesc); --=20 2.20.1