From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3CF1DE77188 for ; Wed, 18 Dec 2024 14:26:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id AE2766B00A6; Wed, 18 Dec 2024 09:26:51 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id A91806B00A8; Wed, 18 Dec 2024 09:26:51 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9595F6B00AA; Wed, 18 Dec 2024 09:26:51 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 77BC16B00A6 for ; Wed, 18 Dec 2024 09:26:51 -0500 (EST) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id E76ADA0CA9 for ; Wed, 18 Dec 2024 14:26:50 +0000 (UTC) X-FDA: 82908304962.25.AAF919A Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) by imf27.hostedemail.com (Postfix) with ESMTP id 9809E4000F for ; Wed, 18 Dec 2024 14:26:13 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=R9uzebWU; spf=pass (imf27.hostedemail.com: domain of klarasmodin@gmail.com designates 209.85.167.49 as permitted sender) smtp.mailfrom=klarasmodin@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1734531979; a=rsa-sha256; cv=none; b=dp2ILrBlTP7MEuKZmvQh04N36xA5dBE/LPNtJcztDpFijsQxc6Nr9uSqPPVXxXwM3jsO55 xonxYoUzgYt1JqrkVA1A55gZZC0c/sVu6bKsKLwNDKs6/B+Kyfcd03l3Iy8Vr2BB94SXZW iLaD/H1ynPIK23uEUEXVWyf3cbDSJMM= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=R9uzebWU; spf=pass (imf27.hostedemail.com: domain of klarasmodin@gmail.com designates 209.85.167.49 as permitted sender) smtp.mailfrom=klarasmodin@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1734531979; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=70sWeERMptzwKALDyA5C6mRflO5NDr8MtSi8T8llx40=; b=uHlbT2pyd7K2SgTUrxM2rxKCtEOtdo2mFZMcEMgzuvJLn+ltC1dTZZrINAybp2nB1dU5oJ +RCIxmtPzVD1FXbDi7fV9aPkvap01YCvoUwcX9yhMKDX5n1nIyVl5kILru0q1iOjnyqtD+ Bh83N0hTwc/C4O5vDsscOj2AYY5S4cw= Received: by mail-lf1-f49.google.com with SMTP id 2adb3069b0e04-540254357c8so5887145e87.1 for ; Wed, 18 Dec 2024 06:26:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1734532007; x=1735136807; darn=kvack.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=70sWeERMptzwKALDyA5C6mRflO5NDr8MtSi8T8llx40=; b=R9uzebWUAaJgaOPrrUkKy/ug4sFAbMa7xDJtaJ2Ouu45HixekKLdH8MFSniG+xhbE5 mpEruhlT/oK66Q5RafqoyGXMmUnSNBLECIye3ifmOziEhknHTfRvRukRfDOkjiV5Tbqt dftKuh/C9IiM3aL0edpCpZiXteVKVTiS4oQpI6p8rlHGJ02lYJeCY2am1SFVjWms633v HGJd4JD1wZrQ6qCSMYZVgNqZvguvf7jcFbTZ0Og5Yhs+q+Tb+mRrEHEgvI2szf3jRnPg 3DAKrFmbn8TSYYkCYyzmKAaxXJ4HGP9zG1E8hbgqF/N/YszXFN6qaGuhOSqSVn9kS/34 i2Ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734532007; x=1735136807; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=70sWeERMptzwKALDyA5C6mRflO5NDr8MtSi8T8llx40=; b=v+OJhhUdY75Ue3lrBdJ3MMHfnooM49wYEhGSM2Bg69p+TIeyy9WD8kHBMLTCVobke7 tMuYndMrQL6KO0KOKzgBHhFOM+VS9HQhquELIoILHXwHjgSUvZMmnJJO471/UCX0UKSx NmCymabonU1XKwIAcu6cTOeeYO+XSDC4NTE0AtyvOKI18MSyvBv7arfxy11RvQho3hl7 cu9kD589hPIH8jZlp2Eq0CBWzjqFlD3ucw/aIwPT68PIQ7+6id0vTpwdx2Iwq6Qmuc4W J5PiQMB28tTXjfQWk2qPhr9+Rb6653yJ8A6WFmfXo2A3lpn8GCSjF+GilujxwslHv30O Oq3Q== X-Gm-Message-State: AOJu0YwBPun+n4IWmxggdcRW+zGj6/GFxy1hkw/tmm4vMXy4HyPjBlRj IqJLHxWPnjMlj5OyI5+/sdZwrGuVLYmGZKQ3d2YGLWDu+tPGxtaN X-Gm-Gg: ASbGncsO21gZ2ChF9yveMQ1o0gpYo2a4I9k04AfHfMqyycKaJNhI9ZC0+qoePzpLk2w Y+o3XkE/C6kSp7SNj2M3M/cHjIMFIXT/4NFfVfv4UQAHrZd/7EGZlcDSUZQMQe/L9FQDNZDmJCl HyEdlcLviGA5WOQ6TUGgbGTaf07at47danWPwgiPlf0+4TlWFzC5ammJB3lMIWubvD6Pod+8jPE SUJCicoa1QaFLHR0HoRROyHCMZwj0ICm/Tp/tKF6voEGOxpbPl0/L+hitoJXMGGyFWuCyp9dfCj GMMMMvKo7ks1mZuhrFmTkMhsOegZgJi96950W3ritw== X-Google-Smtp-Source: AGHT+IEpIIEIJ2UXiiLBdwl8jw7i267QzdNiytJ3jSLNDR3hUDDJnoXHvBFmKiclhZAWiuXzUvG2cA== X-Received: by 2002:a05:6512:1254:b0:53e:3a01:cf4f with SMTP id 2adb3069b0e04-541e674691amr1196803e87.14.1734532006593; Wed, 18 Dec 2024 06:26:46 -0800 (PST) Received: from ?IPV6:2001:678:a5c:1202:4fb5:f16a:579c:6dcb? (soda.int.kasm.eu. [2001:678:a5c:1202:4fb5:f16a:579c:6dcb]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54120ba9a33sm1482892e87.98.2024.12.18.06.26.43 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 18 Dec 2024 06:26:45 -0800 (PST) Message-ID: Date: Wed, 18 Dec 2024 15:26:42 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 02/12] mm: pgtable: introduce generic p4d_alloc_one() and p4d_free() To: Qi Zheng , 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 Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org References: Content-Language: en-US, sv-SE From: Klara Modin In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 9809E4000F X-Stat-Signature: 8gwc6imuity6cwmmyu7rkut1gjeu4k3b X-Rspam-User: X-Rspamd-Server: rspam09 X-HE-Tag: 1734531973-308417 X-HE-Meta: U2FsdGVkX19OSiM6+tl4mBR9QHbMyReeC4ALEo3Z0wMTJVBSGMQtof428ACdfCleJ/d7dpi0QSRQmoe61ZVo0vsAPA9h7vGLpbmhR4RGqfI5UYyAdkQktD2acdq4X05QQbEiKEcOLAVH03XYJdnfoDsFdovSremqc5vkaVmLYB5nBvOeAGxacFiHV89ahxLdtvY96pgLMFcKYJRi21Kbs9l9FpHOwGti4HrRfdj4uXSeLmPbdTG2rospEjMfA78/RfzwXeO9m+RcOvDYjjAlzoeaRI6FOrPdWi3pUad7zaSrEl0RHX/Wl8IAPsRpONLoWzBf5zKQxBH/Y6876rfLbY+eK9MVtgWSmjZzPZ6kVGgjjiJaQn3OJxRtroKoeB7l7Cufm9gsnrI72PezTUzmZZD81oJw+5ntuDqCbI/5wvFUJFOShlUpSO/2YyXt971WP7vHAE8+999VO0ZWnj8XBmuw5iWE5QTqFPYUhiHMxRTAgMuJCio8wahcpNnlTDgEWlO5RFbH+dbv4A4cxzh1B/RMI7QqV+ufw1ydvzbL8PljO2d/P/TfPOGrYiWTi88RKHKWgcjpR5vKV70o3FWaIkSZz0ZRpxs3qiURR6HpI933hCYfPdsWJVzAFYsFPo9hAGfhMPiOA5mCmjEMi0Kc37XNWfRKPHyrHbXLPek7DttxvushYyitQY4z39Z/PWwW0TYTZhp+UHu8t3yZ/qSTgsGRiRDOITwoYK9V+us0NeEU4e05zmID26QxWi0j0H+vqGGqXVh5UPZJr1zC0RHxvsxJbHWKJRQJMAM4FF4rdtvh1sCzCpplSU92U3dcT+C/LGoyv3sT058ueq87K/W2XJsF/eyfvY7bWtqe8CXlaRAamfUmoCfi6PAXk4E4Gvgy2l3cyLKcoRpLiNTqKVZXLzYfXryocXZODNTY5TFotqktpeLcYSe8SyKIhMKoOufdVjeH++bAQWZmJT3B4h7 X3oRE4KE XKX2NK2BrssFB5WKa5hBSAUprBFUKXtBmR2mNkV8TYTvLhWEJRveHA0e1Pj5d6Zr2asMlfUDxmFcWk96AyWDl2/DK3gVAA/uWx8HNxjwKr5sGfMhNYts4YYYsHvbNLA59cJGsg6KnOKWHC5Yvg0NgD+NTxQySNWdtqAbLmjqB0NT3WXiiVpl9C6sWej9nuN6U+J83QST4yaBFFV1Z8fqNBeswOE2Pcl6Oun4rpMu3OoyEqKzOxm1xJpG+6A9y1mBy60SgIkfoGRlvCmKjJsAMKZRY9nO5upEiHwwyMUroGcDgktXECIyIDW+TUCZ5suMmPsAqDcxKGc/Z1gMSTz4I/t2FZS5nkO8LOLGajvo79/NxTat8wGFx7C6O3FCQn82/ebzW+hxrRegSkTDoZrJpAlYYpfn2mUYDTpjWtFWdKOtVF2jqdFuL4q0NrHNX9Y/010+3sHjYL9NlBzpatT3xzOd8y/9zDnwq4PQIxC+6Mx/DkXk= X-Bogosity: Ham, tests=bogofilter, spamicity=0.006736, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Hi, On 2024-12-14 10:02, Qi Zheng wrote: > Several architectures (arm64, riscv, x86) define p4d_alloc_one() as a > wrapper for get_zeroed_page() and p4d_free() as a wrapper for free_page(). > > For these architectures, provide a generic implementation in > asm-generic/pgalloc.h and convert them to use it. And like other levels > of page tables, add statistics for P4D level page table. > > For s390, it also defines p4d_alloc_one() and p4d_free(), but it uses its > own logic, so skip it. > > Signed-off-by: Qi Zheng > --- > arch/arm64/include/asm/pgalloc.h | 15 ++++----- > arch/riscv/include/asm/pgalloc.h | 25 ++++++--------- > arch/x86/include/asm/pgalloc.h | 16 ++++------ > arch/x86/mm/pgtable.c | 3 ++ > include/asm-generic/pgalloc.h | 55 ++++++++++++++++++++++++++++++++ > include/linux/mm.h | 16 ++++++++++ > 6 files changed, 98 insertions(+), 32 deletions(-) > > diff --git a/arch/arm64/include/asm/pgalloc.h b/arch/arm64/include/asm/pgalloc.h > index e75422864d1bd..679c530549327 100644 > --- a/arch/arm64/include/asm/pgalloc.h > +++ b/arch/arm64/include/asm/pgalloc.h > @@ -15,6 +15,8 @@ > > #define __HAVE_ARCH_PGD_FREE > #define __HAVE_ARCH_PUD_FREE > +#define __HAVE_ARCH_P4D_ALLOC_ONE > +#define __HAVE_ARCH_P4D_FREE > #include > > #define PGD_SIZE (PTRS_PER_PGD * sizeof(pgd_t)) > @@ -87,19 +89,16 @@ static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgdp, p4d_t *p4dp) > > static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned long addr) > { > - gfp_t gfp = GFP_PGTABLE_USER; > + if (!pgtable_l5_enabled()) > + return NULL; > > - if (mm == &init_mm) > - gfp = GFP_PGTABLE_KERNEL; > - return (p4d_t *)get_zeroed_page(gfp); > + return __p4d_alloc_one(mm, addr); > } > > static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d) > { > - if (!pgtable_l5_enabled()) > - return; > - BUG_ON((unsigned long)p4d & (PAGE_SIZE-1)); > - free_page((unsigned long)p4d); > + if (pgtable_l5_enabled()) > + __p4d_free(mm, p4d); > } > > #define __p4d_free_tlb(tlb, p4d, addr) p4d_free((tlb)->mm, p4d) > diff --git a/arch/riscv/include/asm/pgalloc.h b/arch/riscv/include/asm/pgalloc.h > index f52264304f772..bb6e1c5f1fb19 100644 > --- a/arch/riscv/include/asm/pgalloc.h > +++ b/arch/riscv/include/asm/pgalloc.h > @@ -14,6 +14,8 @@ > #ifdef CONFIG_MMU > #define __HAVE_ARCH_PUD_ALLOC_ONE > #define __HAVE_ARCH_PUD_FREE > +#define __HAVE_ARCH_P4D_ALLOC_ONE > +#define __HAVE_ARCH_P4D_FREE > #include > > static inline void riscv_tlb_remove_ptdesc(struct mmu_gather *tlb, void *pt) > @@ -118,21 +120,10 @@ static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud, > #define p4d_alloc_one p4d_alloc_one > static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned long addr) > { > - if (pgtable_l5_enabled) { > - gfp_t gfp = GFP_PGTABLE_USER; > - > - if (mm == &init_mm) > - gfp = GFP_PGTABLE_KERNEL; > - return (p4d_t *)get_zeroed_page(gfp); > - } > + if (!pgtable_l5_enabled) > + return NULL; > > - return NULL; > -} > - > -static inline void __p4d_free(struct mm_struct *mm, p4d_t *p4d) > -{ > - BUG_ON((unsigned long)p4d & (PAGE_SIZE-1)); > - free_page((unsigned long)p4d); > + return __p4d_alloc_one(mm, addr); > } > > #define p4d_free p4d_free > @@ -145,8 +136,12 @@ static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d) > static inline void __p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d, > unsigned long addr) > { > - if (pgtable_l5_enabled) > + if (pgtable_l5_enabled) { > + struct ptdesc *ptdesc = virt_to_ptdesc(p4d); > + > + pagetable_p4d_dtor(ptdesc); > riscv_tlb_remove_ptdesc(tlb, virt_to_ptdesc(p4d)); > + } > } > #endif /* __PAGETABLE_PMD_FOLDED */ > > diff --git a/arch/x86/include/asm/pgalloc.h b/arch/x86/include/asm/pgalloc.h > index dcd836b59bebd..d9bc6cae77c9e 100644 > --- a/arch/x86/include/asm/pgalloc.h > +++ b/arch/x86/include/asm/pgalloc.h > @@ -8,6 +8,8 @@ > > #define __HAVE_ARCH_PTE_ALLOC_ONE > #define __HAVE_ARCH_PGD_FREE > +#define __HAVE_ARCH_P4D_ALLOC_ONE > +#define __HAVE_ARCH_P4D_FREE > #include > > static inline int __paravirt_pgd_alloc(struct mm_struct *mm) { return 0; } > @@ -149,20 +151,16 @@ static inline void pgd_populate_safe(struct mm_struct *mm, pgd_t *pgd, p4d_t *p4 > > static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned long addr) > { > - gfp_t gfp = GFP_KERNEL_ACCOUNT; > + if (!pgtable_l5_enabled()) > + return NULL; > > - if (mm == &init_mm) > - gfp &= ~__GFP_ACCOUNT; > - return (p4d_t *)get_zeroed_page(gfp); > + return __p4d_alloc_one(mm, addr); > } > > static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d) > { > - if (!pgtable_l5_enabled()) > - return; > - > - BUG_ON((unsigned long)p4d & (PAGE_SIZE-1)); > - free_page((unsigned long)p4d); > + if (pgtable_l5_enabled()) > + return __p4d_free(mm, p4d); > } > > extern void ___p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d); > diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c > index 69a357b15974a..3d6e84da45b24 100644 > --- a/arch/x86/mm/pgtable.c > +++ b/arch/x86/mm/pgtable.c > @@ -94,6 +94,9 @@ void ___pud_free_tlb(struct mmu_gather *tlb, pud_t *pud) > #if CONFIG_PGTABLE_LEVELS > 4 > void ___p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d) > { > + struct ptdesc *ptdesc = virt_to_ptdesc(p4d); > + > + pagetable_p4d_dtor(ptdesc); > paravirt_release_p4d(__pa(p4d) >> PAGE_SHIFT); > paravirt_tlb_remove_table(tlb, virt_to_page(p4d)); > } > diff --git a/include/asm-generic/pgalloc.h b/include/asm-generic/pgalloc.h > index 7c48f5fbf8aa7..dbf61819b3581 100644 > --- a/include/asm-generic/pgalloc.h > +++ b/include/asm-generic/pgalloc.h > @@ -215,6 +215,61 @@ static inline void pud_free(struct mm_struct *mm, pud_t *pud) > > #endif /* CONFIG_PGTABLE_LEVELS > 3 */ > > +#if CONFIG_PGTABLE_LEVELS > 4 > + > +static inline p4d_t *__p4d_alloc_one_noprof(struct mm_struct *mm, unsigned long addr) > +{ > + gfp_t gfp = GFP_PGTABLE_USER; > + struct ptdesc *ptdesc; > + > + if (mm == &init_mm) > + gfp = GFP_PGTABLE_KERNEL; > + gfp &= ~__GFP_HIGHMEM; > + > + ptdesc = pagetable_alloc_noprof(gfp, 0); > + if (!ptdesc) > + return NULL; > + > + pagetable_p4d_ctor(ptdesc); > + return ptdesc_address(ptdesc); > +} > +#define __p4d_alloc_one(...) alloc_hooks(__p4d_alloc_one_noprof(__VA_ARGS__)) > + > +#ifndef __HAVE_ARCH_P4D_ALLOC_ONE > +/** > + * p4d_alloc_one - allocate memory for a P4D-level page table > + * @mm: the mm_struct of the current context > + * > + * Allocate memory for a page table using %GFP_PGTABLE_USER for user context > + * and %GFP_PGTABLE_KERNEL for kernel context. > + * > + * Return: pointer to the allocated memory or %NULL on error > + */ > +static inline p4d_t *p4d_alloc_one_noprof(struct mm_struct *mm, unsigned long addr) > +{ > + return __p4d_alloc_one_noprof(mm, addr); > +} > +#define p4d_alloc_one(...) alloc_hooks(p4d_alloc_one_noprof(__VA_ARGS__)) > +#endif > + > +static inline void __p4d_free(struct mm_struct *mm, p4d_t *p4d) > +{ > + struct ptdesc *ptdesc = virt_to_ptdesc(p4d); > + > + BUG_ON((unsigned long)p4d & (PAGE_SIZE-1)); > + pagetable_p4d_dtor(ptdesc); > + pagetable_free(ptdesc); > +} > + > +#ifndef __HAVE_ARCH_P4D_FREE > +static inline void p4d_free(struct mm_struct *mm, pud_t *p4d) Should this perhaps be p4d_t *p4d rather than pud_t *p4d? Otherwise I get this build error: In file included from /home/klara/git/linux/arch/riscv/include/asm/kfence.h:8, from /home/klara/git/linux/mm/kfence/core.c:34: /home/klara/git/linux/include/asm-generic/pgalloc.h: In function ‘p4d_free’: /home/klara/git/linux/include/asm-generic/pgalloc.h:252:24: error: passing argument 2 of ‘__p4d_free’ from incompatible pointer type [-Wincompatible-pointer-types] 252 | __p4d_free(mm, p4d); | ^~~ | | | pud_t * /home/klara/git/linux/include/asm-generic/pgalloc.h:244:60: note: expected ‘p4d_t *’ but argument is of type ‘pud_t *’ 244 | static inline void __p4d_free(struct mm_struct *mm, p4d_t *p4d) | ~~~~~~~^~~ In file included from /home/klara/git/linux/arch/riscv/include/asm/kfence.h:8, from /home/klara/git/linux/mm/kfence/report.c:22: /home/klara/git/linux/include/asm-generic/pgalloc.h: In function ‘p4d_free’: /home/klara/git/linux/include/asm-generic/pgalloc.h:252:24: error: passing argument 2 of ‘__p4d_free’ from incompatible pointer type [-Wincompatible-pointer-types] 252 | __p4d_free(mm, p4d); | ^~~ | | | pud_t * /home/klara/git/linux/include/asm-generic/pgalloc.h:244:60: note: expected ‘p4d_t *’ but argument is of type ‘pud_t *’ 244 | static inline void __p4d_free(struct mm_struct *mm, p4d_t *p4d) | ~~~~~~~^~~ Regards, Klara Modin > +{ > + __p4d_free(mm, p4d); > +} > +#endif > + > +#endif > + > #ifndef __HAVE_ARCH_PGD_FREE > static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) > { > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 5e73e53c34e9e..807a12ed8ec96 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -3237,6 +3237,22 @@ static inline void pagetable_pud_dtor(struct ptdesc *ptdesc) > lruvec_stat_sub_folio(folio, NR_PAGETABLE); > } > > +static inline void pagetable_p4d_ctor(struct ptdesc *ptdesc) > +{ > + struct folio *folio = ptdesc_folio(ptdesc); > + > + __folio_set_pgtable(folio); > + lruvec_stat_add_folio(folio, NR_PAGETABLE); > +} > + > +static inline void pagetable_p4d_dtor(struct ptdesc *ptdesc) > +{ > + struct folio *folio = ptdesc_folio(ptdesc); > + > + __folio_clear_pgtable(folio); > + lruvec_stat_sub_folio(folio, NR_PAGETABLE); > +} > + > extern void __init pagecache_init(void); > extern void free_initmem(void); >