From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 186903B0AEA; Mon, 27 Jul 2026 15:36:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785166595; cv=none; b=AlABGjqh+5kYagSn41Cs/ZVjVeHNNtQc1zuuAnDeqTF2dHCdA9vHI3Lf0ok6oVpZD8pjHFq1lO3VTc6IwQjMiHHnSfe3BD7qyAZxUHtl2ymoDAP6C7q/SzM/xlY9pzOfEKGd+/vP7uPjJOAb3zXF0V1zJYkv2CxV/kDlDp7ev4w= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785166595; c=relaxed/simple; bh=VxwcTpU1zkLTiWJHJFd1+dPEfdXN9pkdJizROxnSPx8=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=c22AjYQX3Ra2X0Xv2tovicZ9ttFqSGJYcSlsDKFpmNxAYM3YxFLJYsR6U1vmyuMzBJ6ixNxCT/l+u5sUdVed4/XVX5GI9EnhVt1Q2mYunrSNMs6BJH62qcLjOqWL2ek9LvKDcvhK5ZkVbuEfWTNMBvge9htmbBcqnOtVRMbXAHw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=umQaGad5; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="umQaGad5" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 47CDA1688; Mon, 27 Jul 2026 08:36:29 -0700 (PDT) Received: from e129823.arm.com (e129823.arm.com [10.2.213.3]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 545F83F763; Mon, 27 Jul 2026 08:36:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1785166593; bh=VxwcTpU1zkLTiWJHJFd1+dPEfdXN9pkdJizROxnSPx8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=umQaGad50YqGP9/hpR0vblKavVaO/yfzmd6WpBrSu3X1qxzwvAqth8D98RKBUpnRl YBkPW2SI9qXrZ/dhG0U16YoQWNEaqdp7BQq231JeMnCBE+q/DgI9MewD6hJ98T6X/b l61b8+i7MvjGE4JRrEUAFuCexvu/jxEyxkuWD4XU= Date: Mon, 27 Jul 2026 16:36:23 +0100 From: Yeoreum Yun To: "David Hildenbrand (Arm)" Cc: Yeoreum Yun , Dave Hansen , Russell King , Huacai Chen , WANG Xuerui , Thomas Bogendoerfer , Catalin Marinas , Will Deacon , Arnd Bergmann , Andrew Morton , Kairui Song , Qi Zheng , Shakeel Butt , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Johannes Weiner , Michal Hocko , Lorenzo Stoakes , Tianrui Zhao , Bibo Mao , Anup Patel , Atish Patra , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Thomas Gleixner , Ingo Molnar , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Jonas Bonn , Stefan Kristiansson , Stafford Horne , linux-kernel@vger.kernel.org, loongarch@lists.linux.dev, linux-mips@vger.kernel.org, linux-arch@vger.kernel.org, linux-mm@kvack.org, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-openrisc@vger.kernel.org Subject: Re: [PATCH RFC v2 13/20] x86: mm: carve out the generic compile-time folded pgtable case in effective_prot() Message-ID: References: <20260722-dummy_ptxp3-v2-0-d9e4bad31e0a@arm.com> <20260722-dummy_ptxp3-v2-13-d9e4bad31e0a@arm.com> <33c774f6-2750-4831-8eee-e43dc471da32@intel.com> Precedence: bulk X-Mailing-List: linux-openrisc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: > On 7/22/26 23:00, Yeoreum Yun wrote: > > On Wed, Jul 22, 2026 at 01:20:39PM -0700, Dave Hansen wrote: > >> On 7/22/26 10:37, Yeoreum Yun wrote: > >>> However, mm_pXd_folded() requires to mm for other architecture like > >>> s390. might save the mm instead of first_level and calls the > >>> ptdump_pt_level_first() with static inline version would make the > >>> constant comparison. So it requires to save *mm* structure in here. > >> > >> I'm having a really hard time parsing that. > >> > >> I think you're trying to say that the effective_prot_p*() functions need > >> to know the first level but they don't (today) need the mm_struct. If > >> they don't get the (calculated) first_level passed in, they need the > >> mm_struct instead. > >> > >> I think you're arguing 'pg_state' needs a ->first_level or a ->mm. > >> Having a pg_state->mm doesn't seem bad to me at all. > >> > >> But, it's also a little bit silly. It would not be rocket science to > >> pass an mm_struct down to the effective_prot_p*() functions. It makes a > >> whole lot of sense to me for a page table walking function to need > >> metadata from the mm_struct to walk correctly. > > > > Yes. I mean to add pg_state->mm like: > > > > diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c > > index 2afa7a23340e..aaf00f0c6624 100644 > > --- a/arch/x86/mm/dump_pagetables.c > > +++ b/arch/x86/mm/dump_pagetables.c > > @@ -38,6 +38,7 @@ struct pg_state { > > bool check_wx; > > unsigned long wx_pages; > > struct seq_file *seq; > > + struct mm_struct *mm; > > }; > > > > struct addr_marker { > > @@ -254,7 +255,7 @@ static void effective_prot(struct ptdump_state *pt_st, int level, u64 val) > > pgprotval_t prot = val & PTE_FLAGS_MASK; > > pgprotval_t effective; > > > > - if (level > 0) { > > + if (level > pgtable_first_level(st->mm)) { > > pgprotval_t higher_prot = st->prot_levels[level - 1]; > > > > effective = (higher_prot & prot & (_PAGE_USER | _PAGE_RW)) | > > @@ -452,7 +453,8 @@ bool ptdump_walk_pgd_level_core(struct seq_file *m, > > .level = -1, > > .to_dmesg = dmesg, > > .check_wx = checkwx, > > - .seq = m > > + .seq = m, > > + .mm = mm, > > }; > > > > ptdump_walk_pgd(&st.ptdump, mm, pgd); > > diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h > > index 8c093c119e5a..6e7d0580db99 100644 > > --- a/include/linux/pgtable.h > > +++ b/include/linux/pgtable.h > > @@ -2490,4 +2490,15 @@ pgprot_t vm_get_page_prot(vm_flags_t vm_flags) \ > > } \ > > EXPORT_SYMBOL(vm_get_page_prot); > > > > +static inline int pgtable_first_level(struct mm_struct *mm) > > +{ > > + if (mm_pmd_folded(mm)) > > + return 3; > > + if (mm_pud_folded(mm)) > > + return 2; > > + if (mm_p4d_folded(mm)) > > + return 1; > > + return 0; > > +} > > In that case the function should probably be called > > "mm_first_pgtable_level" > > But now it gets confusing, because we have > > enum pgtable_level { > PGTABLE_LEVEL_PTE = 0, > PGTABLE_LEVEL_PMD, > PGTABLE_LEVEL_PUD, > PGTABLE_LEVEL_P4D, > PGTABLE_LEVEL_PGD, > }; > > > But maybe we can make sense of it and do > > /* > * The enum values correspond to the numerical page table level, > * starting with the highest level being level 0. > */ > enum pgtable_level { > PGTABLE_LEVEL_PGD = 0, > PGTABLE_LEVEL_P4D, > PGTABLE_LEVEL_PUD, > PGTABLE_LEVEL_PMD, > PGTABLE_LEVEL_PTE, > }; > > static inline enum pgtable_level mm_first_pgtable_level(struct mm_struct *mm) > { > if (mm_pmd_folded(mm)) > return PGTABLE_LEVEL_PMD; > if (mm_pud_folded(mm)) > return PGTABLE_LEVEL_PUD; > if (mm_p4d_folded(mm)) > return PGTABLE_LEVEL_P4D; > return PGTABLE_LEVEL_PGD; > } > > > We could even teach effective_prot() and friends to consume enum pgtable_level > now and have it all be a bit cleaner? Yes. That would be good for me unless others comment. -- Sincerely, Yeoreum Yun 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 512AAC531D0 for ; Mon, 27 Jul 2026 15:36:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=e1vVVeArvOEgv0mPJBCiE0DVQYKEHev66K2yN37zsVY=; b=CsRdsGdOsRZ+hQ bnARQJj3Ki/GWAWbJKl6+37a+J0T4FWTG+eBFXKMKhxGtl/li4lb7VnKDIDFVuD0SbPHLAtK0mpar hUmnTco89qCZfMDehmW6usJnG/NDUy12qGyxTsHtm9UcvZu1if1BV4RaUPhCE4l8wnq00RUO+sl2e SQcwo7ODdZwm9KnBx7dNxbw/xgAz86rpL+O+1Enc7q+erehO06zagXHVS7MlZsvObel14nmi7C++k Mm+I8m7vnrCZzy7cfS8dS1WgB+o/kzwxwmVXtT2/lwAtGqUo4r1mxH/Q6Yb100Y0K4moiEu+I88Cl xpGPn/WZUg26jtGDnXpg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1woNNe-00000003C2s-3X7X; Mon, 27 Jul 2026 15:36:38 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1woNNc-00000003C1N-1sUq; Mon, 27 Jul 2026 15:36:37 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4556B15A1; Mon, 27 Jul 2026 08:36:29 -0700 (PDT) Received: from e129823.arm.com (e129823.arm.com [10.2.213.3]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 545F83F763; Mon, 27 Jul 2026 08:36:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1785166593; bh=VxwcTpU1zkLTiWJHJFd1+dPEfdXN9pkdJizROxnSPx8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=umQaGad50YqGP9/hpR0vblKavVaO/yfzmd6WpBrSu3X1qxzwvAqth8D98RKBUpnRl YBkPW2SI9qXrZ/dhG0U16YoQWNEaqdp7BQq231JeMnCBE+q/DgI9MewD6hJ98T6X/b l61b8+i7MvjGE4JRrEUAFuCexvu/jxEyxkuWD4XU= Date: Mon, 27 Jul 2026 16:36:23 +0100 From: Yeoreum Yun To: "David Hildenbrand (Arm)" Cc: Yeoreum Yun , Dave Hansen , Russell King , Huacai Chen , WANG Xuerui , Thomas Bogendoerfer , Catalin Marinas , Will Deacon , Arnd Bergmann , Andrew Morton , Kairui Song , Qi Zheng , Shakeel Butt , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Johannes Weiner , Michal Hocko , Lorenzo Stoakes , Tianrui Zhao , Bibo Mao , Anup Patel , Atish Patra , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Thomas Gleixner , Ingo Molnar , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Jonas Bonn , Stefan Kristiansson , Stafford Horne , linux-kernel@vger.kernel.org, loongarch@lists.linux.dev, linux-mips@vger.kernel.org, linux-arch@vger.kernel.org, linux-mm@kvack.org, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-openrisc@vger.kernel.org Subject: Re: [PATCH RFC v2 13/20] x86: mm: carve out the generic compile-time folded pgtable case in effective_prot() Message-ID: References: <20260722-dummy_ptxp3-v2-0-d9e4bad31e0a@arm.com> <20260722-dummy_ptxp3-v2-13-d9e4bad31e0a@arm.com> <33c774f6-2750-4831-8eee-e43dc471da32@intel.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260727_083636_562931_CF0AB792 X-CRM114-Status: GOOD ( 34.60 ) X-BeenThere: kvm-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "kvm-riscv" Errors-To: kvm-riscv-bounces+kvm-riscv=archiver.kernel.org@lists.infradead.org > On 7/22/26 23:00, Yeoreum Yun wrote: > > On Wed, Jul 22, 2026 at 01:20:39PM -0700, Dave Hansen wrote: > >> On 7/22/26 10:37, Yeoreum Yun wrote: > >>> However, mm_pXd_folded() requires to mm for other architecture like > >>> s390. might save the mm instead of first_level and calls the > >>> ptdump_pt_level_first() with static inline version would make the > >>> constant comparison. So it requires to save *mm* structure in here. > >> > >> I'm having a really hard time parsing that. > >> > >> I think you're trying to say that the effective_prot_p*() functions need > >> to know the first level but they don't (today) need the mm_struct. If > >> they don't get the (calculated) first_level passed in, they need the > >> mm_struct instead. > >> > >> I think you're arguing 'pg_state' needs a ->first_level or a ->mm. > >> Having a pg_state->mm doesn't seem bad to me at all. > >> > >> But, it's also a little bit silly. It would not be rocket science to > >> pass an mm_struct down to the effective_prot_p*() functions. It makes a > >> whole lot of sense to me for a page table walking function to need > >> metadata from the mm_struct to walk correctly. > > > > Yes. I mean to add pg_state->mm like: > > > > diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c > > index 2afa7a23340e..aaf00f0c6624 100644 > > --- a/arch/x86/mm/dump_pagetables.c > > +++ b/arch/x86/mm/dump_pagetables.c > > @@ -38,6 +38,7 @@ struct pg_state { > > bool check_wx; > > unsigned long wx_pages; > > struct seq_file *seq; > > + struct mm_struct *mm; > > }; > > > > struct addr_marker { > > @@ -254,7 +255,7 @@ static void effective_prot(struct ptdump_state *pt_st, int level, u64 val) > > pgprotval_t prot = val & PTE_FLAGS_MASK; > > pgprotval_t effective; > > > > - if (level > 0) { > > + if (level > pgtable_first_level(st->mm)) { > > pgprotval_t higher_prot = st->prot_levels[level - 1]; > > > > effective = (higher_prot & prot & (_PAGE_USER | _PAGE_RW)) | > > @@ -452,7 +453,8 @@ bool ptdump_walk_pgd_level_core(struct seq_file *m, > > .level = -1, > > .to_dmesg = dmesg, > > .check_wx = checkwx, > > - .seq = m > > + .seq = m, > > + .mm = mm, > > }; > > > > ptdump_walk_pgd(&st.ptdump, mm, pgd); > > diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h > > index 8c093c119e5a..6e7d0580db99 100644 > > --- a/include/linux/pgtable.h > > +++ b/include/linux/pgtable.h > > @@ -2490,4 +2490,15 @@ pgprot_t vm_get_page_prot(vm_flags_t vm_flags) \ > > } \ > > EXPORT_SYMBOL(vm_get_page_prot); > > > > +static inline int pgtable_first_level(struct mm_struct *mm) > > +{ > > + if (mm_pmd_folded(mm)) > > + return 3; > > + if (mm_pud_folded(mm)) > > + return 2; > > + if (mm_p4d_folded(mm)) > > + return 1; > > + return 0; > > +} > > In that case the function should probably be called > > "mm_first_pgtable_level" > > But now it gets confusing, because we have > > enum pgtable_level { > PGTABLE_LEVEL_PTE = 0, > PGTABLE_LEVEL_PMD, > PGTABLE_LEVEL_PUD, > PGTABLE_LEVEL_P4D, > PGTABLE_LEVEL_PGD, > }; > > > But maybe we can make sense of it and do > > /* > * The enum values correspond to the numerical page table level, > * starting with the highest level being level 0. > */ > enum pgtable_level { > PGTABLE_LEVEL_PGD = 0, > PGTABLE_LEVEL_P4D, > PGTABLE_LEVEL_PUD, > PGTABLE_LEVEL_PMD, > PGTABLE_LEVEL_PTE, > }; > > static inline enum pgtable_level mm_first_pgtable_level(struct mm_struct *mm) > { > if (mm_pmd_folded(mm)) > return PGTABLE_LEVEL_PMD; > if (mm_pud_folded(mm)) > return PGTABLE_LEVEL_PUD; > if (mm_p4d_folded(mm)) > return PGTABLE_LEVEL_P4D; > return PGTABLE_LEVEL_PGD; > } > > > We could even teach effective_prot() and friends to consume enum pgtable_level > now and have it all be a bit cleaner? Yes. That would be good for me unless others comment. -- Sincerely, Yeoreum Yun -- kvm-riscv mailing list kvm-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kvm-riscv 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7F4E2C531FC for ; Mon, 27 Jul 2026 15:36:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=usK+6zufGTj+o9Vm5U+QHcEMITQKIgAu7eiOios7DNU=; b=PBrrdbN/lRlNpb 5mTVBUgPwlWUaKO+N6aY9HfBygtXXSsib1ZGcpmzfZZPHvA958hNYFyQZZDOJrkhCUZTngqzXQkCe RFnx5kwa1E+0s73MLo9aVSWhl/H9Q4O4FLrLldXIUCCquqk3BG5xeT0+77b6INeHU+kiwfp7Dozoo w6Cq/ZBZKq/X7Hd7u03egWZ3ZJz41m/w3oiAQyFeN3SROw1C6i33VCdhC0SE1OZk2mKRYmt+SVjRc 8MYyvt1tLfGvDuJPw5w/EsOodC+s9CfIFb6soc5nEscx/RycQ4S7IVudy+dB5AJ5PiuDHzkKzV8ap m8ButRQl0okYGLvcj44g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1woNNe-00000003C2w-3vco; Mon, 27 Jul 2026 15:36:38 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1woNNc-00000003C1N-1sUq; Mon, 27 Jul 2026 15:36:37 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4556B15A1; Mon, 27 Jul 2026 08:36:29 -0700 (PDT) Received: from e129823.arm.com (e129823.arm.com [10.2.213.3]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 545F83F763; Mon, 27 Jul 2026 08:36:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1785166593; bh=VxwcTpU1zkLTiWJHJFd1+dPEfdXN9pkdJizROxnSPx8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=umQaGad50YqGP9/hpR0vblKavVaO/yfzmd6WpBrSu3X1qxzwvAqth8D98RKBUpnRl YBkPW2SI9qXrZ/dhG0U16YoQWNEaqdp7BQq231JeMnCBE+q/DgI9MewD6hJ98T6X/b l61b8+i7MvjGE4JRrEUAFuCexvu/jxEyxkuWD4XU= Date: Mon, 27 Jul 2026 16:36:23 +0100 From: Yeoreum Yun To: "David Hildenbrand (Arm)" Cc: Yeoreum Yun , Dave Hansen , Russell King , Huacai Chen , WANG Xuerui , Thomas Bogendoerfer , Catalin Marinas , Will Deacon , Arnd Bergmann , Andrew Morton , Kairui Song , Qi Zheng , Shakeel Butt , Barry Song , Axel Rasmussen , Yuanchu Xie , Wei Xu , Johannes Weiner , Michal Hocko , Lorenzo Stoakes , Tianrui Zhao , Bibo Mao , Anup Patel , Atish Patra , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Thomas Gleixner , Ingo Molnar , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Jonas Bonn , Stefan Kristiansson , Stafford Horne , linux-kernel@vger.kernel.org, loongarch@lists.linux.dev, linux-mips@vger.kernel.org, linux-arch@vger.kernel.org, linux-mm@kvack.org, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-openrisc@vger.kernel.org Subject: Re: [PATCH RFC v2 13/20] x86: mm: carve out the generic compile-time folded pgtable case in effective_prot() Message-ID: References: <20260722-dummy_ptxp3-v2-0-d9e4bad31e0a@arm.com> <20260722-dummy_ptxp3-v2-13-d9e4bad31e0a@arm.com> <33c774f6-2750-4831-8eee-e43dc471da32@intel.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260727_083636_562931_CF0AB792 X-CRM114-Status: GOOD ( 34.60 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org > On 7/22/26 23:00, Yeoreum Yun wrote: > > On Wed, Jul 22, 2026 at 01:20:39PM -0700, Dave Hansen wrote: > >> On 7/22/26 10:37, Yeoreum Yun wrote: > >>> However, mm_pXd_folded() requires to mm for other architecture like > >>> s390. might save the mm instead of first_level and calls the > >>> ptdump_pt_level_first() with static inline version would make the > >>> constant comparison. So it requires to save *mm* structure in here. > >> > >> I'm having a really hard time parsing that. > >> > >> I think you're trying to say that the effective_prot_p*() functions need > >> to know the first level but they don't (today) need the mm_struct. If > >> they don't get the (calculated) first_level passed in, they need the > >> mm_struct instead. > >> > >> I think you're arguing 'pg_state' needs a ->first_level or a ->mm. > >> Having a pg_state->mm doesn't seem bad to me at all. > >> > >> But, it's also a little bit silly. It would not be rocket science to > >> pass an mm_struct down to the effective_prot_p*() functions. It makes a > >> whole lot of sense to me for a page table walking function to need > >> metadata from the mm_struct to walk correctly. > > > > Yes. I mean to add pg_state->mm like: > > > > diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c > > index 2afa7a23340e..aaf00f0c6624 100644 > > --- a/arch/x86/mm/dump_pagetables.c > > +++ b/arch/x86/mm/dump_pagetables.c > > @@ -38,6 +38,7 @@ struct pg_state { > > bool check_wx; > > unsigned long wx_pages; > > struct seq_file *seq; > > + struct mm_struct *mm; > > }; > > > > struct addr_marker { > > @@ -254,7 +255,7 @@ static void effective_prot(struct ptdump_state *pt_st, int level, u64 val) > > pgprotval_t prot = val & PTE_FLAGS_MASK; > > pgprotval_t effective; > > > > - if (level > 0) { > > + if (level > pgtable_first_level(st->mm)) { > > pgprotval_t higher_prot = st->prot_levels[level - 1]; > > > > effective = (higher_prot & prot & (_PAGE_USER | _PAGE_RW)) | > > @@ -452,7 +453,8 @@ bool ptdump_walk_pgd_level_core(struct seq_file *m, > > .level = -1, > > .to_dmesg = dmesg, > > .check_wx = checkwx, > > - .seq = m > > + .seq = m, > > + .mm = mm, > > }; > > > > ptdump_walk_pgd(&st.ptdump, mm, pgd); > > diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h > > index 8c093c119e5a..6e7d0580db99 100644 > > --- a/include/linux/pgtable.h > > +++ b/include/linux/pgtable.h > > @@ -2490,4 +2490,15 @@ pgprot_t vm_get_page_prot(vm_flags_t vm_flags) \ > > } \ > > EXPORT_SYMBOL(vm_get_page_prot); > > > > +static inline int pgtable_first_level(struct mm_struct *mm) > > +{ > > + if (mm_pmd_folded(mm)) > > + return 3; > > + if (mm_pud_folded(mm)) > > + return 2; > > + if (mm_p4d_folded(mm)) > > + return 1; > > + return 0; > > +} > > In that case the function should probably be called > > "mm_first_pgtable_level" > > But now it gets confusing, because we have > > enum pgtable_level { > PGTABLE_LEVEL_PTE = 0, > PGTABLE_LEVEL_PMD, > PGTABLE_LEVEL_PUD, > PGTABLE_LEVEL_P4D, > PGTABLE_LEVEL_PGD, > }; > > > But maybe we can make sense of it and do > > /* > * The enum values correspond to the numerical page table level, > * starting with the highest level being level 0. > */ > enum pgtable_level { > PGTABLE_LEVEL_PGD = 0, > PGTABLE_LEVEL_P4D, > PGTABLE_LEVEL_PUD, > PGTABLE_LEVEL_PMD, > PGTABLE_LEVEL_PTE, > }; > > static inline enum pgtable_level mm_first_pgtable_level(struct mm_struct *mm) > { > if (mm_pmd_folded(mm)) > return PGTABLE_LEVEL_PMD; > if (mm_pud_folded(mm)) > return PGTABLE_LEVEL_PUD; > if (mm_p4d_folded(mm)) > return PGTABLE_LEVEL_P4D; > return PGTABLE_LEVEL_PGD; > } > > > We could even teach effective_prot() and friends to consume enum pgtable_level > now and have it all be a bit cleaner? Yes. That would be good for me unless others comment. -- Sincerely, Yeoreum Yun _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv