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 03AA5E77187 for ; Wed, 18 Dec 2024 14:43:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8CFD06B0082; Wed, 18 Dec 2024 09:43:15 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 87EF66B00A2; Wed, 18 Dec 2024 09:43:15 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 770306B00A4; Wed, 18 Dec 2024 09:43:15 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 537486B00A2 for ; Wed, 18 Dec 2024 09:43:15 -0500 (EST) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 042DEA0F1C for ; Wed, 18 Dec 2024 14:43:14 +0000 (UTC) X-FDA: 82908345996.01.B864A91 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) by imf27.hostedemail.com (Postfix) with ESMTP id 0815240002 for ; Wed, 18 Dec 2024 14:42:36 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=AfRm5oUW; dmarc=pass (policy=quarantine) header.from=bytedance.com; spf=pass (imf27.hostedemail.com: domain of zhengqi.arch@bytedance.com designates 209.85.214.176 as permitted sender) smtp.mailfrom=zhengqi.arch@bytedance.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1734532978; 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=R6GLWJQvuq4J3hubDyBKKbnWzxC36CZIoGbCxs2ghUQ=; b=zlZEC9g6vEt+LowvMsTQ+p919CMCepl+siawU54AXpXOgn9ajVO/ZuMe5PKLF4aV5ouRkP n2x4Jx3mqR8Ob/kZcfV7zOyrEtIPXJ6lYbgGLi18Plb09A6H76AAIyHsqQH+sFPqX4gOVL wc6GNFariH/6nmN6ofmuLUl5G9FeftY= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1734532978; a=rsa-sha256; cv=none; b=okpEGmCjWigG+GQQ6G+frO9IRvqcHVkuLSPnuajNjtvkxiAYZbevNSKtJ3O6CF5jHIGzi1 TNCpG5ypSfTxCHR8laSiAjspbUrIyKfZFebSBX15w5MgXeekxWi9ftDGVPw289qxU4VcIv ThKOCRzOA3zRnGigOEY1z70vuvN5KmE= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=AfRm5oUW; dmarc=pass (policy=quarantine) header.from=bytedance.com; spf=pass (imf27.hostedemail.com: domain of zhengqi.arch@bytedance.com designates 209.85.214.176 as permitted sender) smtp.mailfrom=zhengqi.arch@bytedance.com Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-21631789fcdso5888005ad.1 for ; Wed, 18 Dec 2024 06:43:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1734532991; x=1735137791; darn=kvack.org; h=content-transfer-encoding:in-reply-to:content-language:from :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=R6GLWJQvuq4J3hubDyBKKbnWzxC36CZIoGbCxs2ghUQ=; b=AfRm5oUWznp5hiFsM7hncGAFo4NOgkMNuKlpvzLOJ7+f2AEmi3jTUHwt4mJnwh5GLP x1E0yvVo8XIysu0MGbhrxpl3GUHxQP/T2nUVIbMUY6MnTA77LQVwu5DuKQkzAqRAPq0F vJloCE+SK3c4YOtZ3402XGDx3guF7eiKuN32ptjHOhSVd9AvhoTzm7EW8T8llCPvv8DD D0tvdXJDTbTft1oVfCfBHYOK+1MjqQvnopkAoYv82K6QVg19L/k8DpZaagSec/zICXiy ADtLbkrpT5gD8BxKCDiBxBbgJhEhsivXSnapMMTSo7va4VxVl7umPwCnixW3D1tz5FBX acrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734532991; x=1735137791; h=content-transfer-encoding:in-reply-to:content-language:from :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=R6GLWJQvuq4J3hubDyBKKbnWzxC36CZIoGbCxs2ghUQ=; b=NT8IpBS8w86r0Rm3Tgw4V58O7JgRuWbio+HOfhte7907FcvIFheiHzZ4Grv6rFb4gv 4EJPVLYXoAtDRDgUhJ9nyl6TrDKZLHj1xCSZ8YTDbUX4EX2dtCQuNKLCgubpr14TPSv8 BQynFIlcp7cty2dBYqmt9qsmIx0mAk+OctSyNnXMCRBCst5e/O+T95ugJv6NymoAY8S3 jhLkYTX+vPegVg1NLdG04U9MaPh5enYV5QzwJ8msMANOxBI/Xq9uglgUvzYG0nJmsJMH YhUuH2c5gXXC1X7UUyf/qUT4D3DH/oVRgVEbcQqt5Yj+kiKNBTLk92vbBzVg/UkTlnTl IMjw== X-Forwarded-Encrypted: i=1; AJvYcCU2MZRVSicBndVl7/ibGZSUKHmQ9X/RiSQ7Ji29l+qJfLYymW4dHDCuOHILnUtW3ZWdGZPVQ9H3zA==@kvack.org X-Gm-Message-State: AOJu0YwtuNrgPPtuSTVFSM0gXVt90JdvHOuNf4zz3bS8hi4m0M8XH3oT gqiwcp8qU5DicyqVYE6aRUdb9NnpRoV0Bp0wmwUcDrdTgMQnuUxaCuruNKlja9k= X-Gm-Gg: ASbGncvS1gER+Arb2AjMhnZovA7y16NFFzdm2VzPGuTnMxDUPfx/HPN9ijdB9fHhjxl fv2q4qbAmw90TdUUJRv88HSyQTIDcvV5Prnfg0oSY88d5RsyftJPMyhmMvFzdIMCWI0oLVr7EOR oFpX7Z1hlahKzyq8id4kfk2sMStTCUJlYb60g8NPpBt4LKJR3sGwtJchevKe4vjO8Y9af9ruI0O 5fdIXIkpDKuV4cqLCRkn4JMAuLDITNRLxZEZfN1QmbFgibN1jiwWCWlrh+zMDTAgbsfME27R5Ej w3o5nLLiJGmARkqlQ1AXeyih7zQ3IgptcsgqJAPT3UFV7nkPqx/e X-Google-Smtp-Source: AGHT+IGpAfSUXA7trx1t771l9SXHKyNia4RKYigVXyNmSAcnSlXmn7j7tBria63/jx4Dvw4h7RaVyQ== X-Received: by 2002:a17:903:1443:b0:216:6a4a:9a47 with SMTP id d9443c01a7336-218c9262eeamr87431315ad.21.1734532990760; Wed, 18 Dec 2024 06:43:10 -0800 (PST) Received: from ?IPV6:2409:8a28:f4f:a9a4:df6:1df4:e2c5:1e97? ([2409:8a28:f4f:a9a4:df6:1df4:e2c5:1e97]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-218a1e5c4dfsm76686595ad.177.2024.12.18.06.43.02 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 18 Dec 2024 06:43:10 -0800 (PST) Message-ID: Date: Wed, 18 Dec 2024 22:42:58 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 02/12] mm: pgtable: introduce generic p4d_alloc_one() and p4d_free() To: Klara Modin Cc: 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, linux-mm@kvack.org, linux-kernel@vger.kernel.org References: From: Qi Zheng Content-Language: en-US In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Stat-Signature: kh6um6o5ncuczos5uqiatd8eyhxcnq1d X-Rspamd-Queue-Id: 0815240002 X-Rspam-User: X-Rspamd-Server: rspam01 X-HE-Tag: 1734532956-802142 X-HE-Meta: U2FsdGVkX185fC+hUOv3wL8FlccBv4eAH+lgHQyIHZbW41ZuekwvS5XpnjTVQfCguifKDiFVNqP7XTh+PDxMiSHlQRbWZj/lAf+2najSwfH5+FsUDfxsvwQKbT/lk6INLGalrHUM0rLEM1FK5hfHWAyqbZ1tVo26lj/Dm+UK3t2Dzgl1VWHN62rsWwWVEiTLahbC88eEG8ChgNFQW74BYk5XE5NEeHx7Gy3ES/3TpHVWEchQxogxOnLJpklbe72EKwWwNFnR2KF28LbtJWYSWOva13CNBELPqk9Hf+BePoN6q1fRNp5SimAVyOgzrvFb+53H831lQO9/pEOXcpMKpLHXm+PzoHazjJxdsivZf1h8e8jYVVATNMAnB5meIAnPxyPNB9nAdvepI4UtFSYhVkLegdo/d/kGankcAXTX/7+8AmrBOrvB2qUQ6z7MFfh7YeU3JCbYOUuPR6O/Lm8VuoclizrDkWaLXPxdcGrltzct4o9a15BhZtCISxO3D2EnNtRlsij0ONHXBgQyUf94oLHaaY+TbUNm5AjivGq/DnreGgS725TKaSNCV2sNdiDZWRks42dP+hIfE/IlsvC0gQmfOn3FwLy95t6uXimMcrfkU1S+ZW2O5amGHYvyxjoHjTMVVhFz/nyoqMBmS3rUQGACc3yLKFzPZrLvuo4Qo18I2ndeSAwwIrXmkx21kW7cLnKt/YW4WI3zirfOgUmJfDb8EEvzUmmsBfc+wZgb/tHkNGmVwi8Sza0vTGxSsCbO2ZsmlX9CxZBr62VfmdKkkiksd2wTSGw6OSmLz+NYzowAGE5lYiC/kFcMNggNMNK0/e2CZoHccIlQ8UL9CPEbgubUeh8CNueqS4aSBWGiodAoNqbydDzLYxIdfiY8pU9oaLjWEG5vTGfrgpkfFH2t6eOGwMNXhVGJaTQ7mY5xccz1wdVN9jU19rlnSXfiZcAtPB9eig9fC9rQfvFZJnn f0spqKCN /viOmWRxXI2C6jWgjIOML1L6tebahOzEG3rvIvpvrQAM8x79QqR6FNeOVZutiB2FjMXFnoFf5P8iPkpd4sSP251eLwwaiK1nPsTh+pKN4THAxXsrZ0O6rMlNfP8GOHEcWIKJo9an/a7S1Xsb17V7Ke9CCRjJ8HC7w/YbPs2xqgLhBwKURF4hg1QHIbgRvblI75oBhdap1tK9y9W3lL8un+BIEfKh5tPFSaO/T+xx7xBmOU1rHTsm2fzP3gMCUEQ8ug7Z/7F/S2kKIowS64GCK9nnzY8+qLemfPMFEIe0NFgUogF3Sa2TDIKchux7rJuB/mmDIThiZiCHddFnD2gD95gYz/ppnjSzJI5eVTrVFOGYrGHQxlOaMyVsKoqNMcPWemaQnHhxTexK3ltZuiewaRbbNwwTBP3Ytp4fsi6tKD9qA/e8+EfNhG5ivxg== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000177, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On 2024/12/18 22:26, Klara Modin wrote: > 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? Yes, my bad. Will fix it. Thanks! > > 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); >