All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yeoreum Yun <yeoreum.yun@arm.com>
To: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Yeoreum Yun <yeoreum.yun@arm.com>,
	Dave Hansen <dave.hansen@intel.com>,
	"David Hildenbrand (Arm)" <david@kernel.org>,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, loongarch@lists.linux.dev,
	linux-mips@vger.kernel.org, linux-arch@vger.kernel.org,
	kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org,
	x86@kernel.org, linux-mm@kvack.org, kasan-dev@googlegroups.com,
	linux-csky@vger.kernel.org, linux-m68k@lists.linux-m68k.org,
	linux-openrisc@vger.kernel.org, linux@armlinux.org.uk,
	akpm@linux-foundation.org, ankur.a.arora@oracle.com,
	rppt@kernel.org, linmag7@gmail.com, chleroy@kernel.org,
	klarasmodin@gmail.com, chenhuacai@kernel.org, kernel@xen0n.name,
	kas@kernel.org, zhangtianyang@loongson.cn, wangyuli@aosc.io,
	tsbogend@alpha.franken.de, ljs@kernel.org, jgg@ziepe.ca,
	catalin.marinas@arm.com, will@kernel.org, arnd@arndb.de,
	ryan.roberts@arm.com, pasha.tatashin@soleen.com,
	rmclure@linux.ibm.com, baolin.wang@linux.alibaba.com,
	tj@kernel.org, kevin.brodsky@arm.com, anup@brainfault.org,
	atish.patra@linux.dev, pjw@kernel.org, palmer@dabbelt.com,
	aou@eecs.berkeley.edu, alex@ghiti.fr,
	dave.hansen@linux.intel.com, luto@kernel.org,
	peterz@infradead.org, tglx@kernel.org, mingo@redhat.com,
	bp@alien8.de, hpa@zytor.com, hannes@cmpxchg.org,
	mhocko@kernel.org, qi.zheng@linux.dev, shakeel.butt@linux.dev,
	kasong@tencent.com, baohua@kernel.org, axelrasmussen@google.com,
	yuanchu@google.com, weixugc@google.com, ryabinin.a.a@gmail.com,
	glider@google.com, andreyknvl@gmail.com, dvyukov@google.com,
	vincenzo.frascino@arm.com, anshuman.khandual@arm.com,
	yang@os.amperecomputing.com, chaitanyas.prakash@arm.com,
	ardb@kernel.org, guoren@kernel.org, yang.li85200@gmail.com,
	viro@zeniv.linux.org.uk, dinguyen@kernel.org,
	schuster.simon@siemens-energy.com, wangruikang@iscas.ac.cn,
	junhui.liu@pigmoral.tech, muchun.song@linux.dev,
	vishal.moola@gmail.com, namcao@linutronix.de, pavel@kernel.org,
	djbw@kernel.org, yu-cheng.yu@intel.com, baolu.lu@linux.intel.com,
	Jonathan.Cameron@huawei.com, coxu@redhat.com,
	andreas@gaisler.com, liam@infradead.org, vbabka@kernel.org,
	surenb@google.com, mhocko@suse.com, shorne@gmail.com,
	jonas@southpole.se, stefan.kristiansson@saunalahti.fi
Subject: Re: [RFC PATCH 10/34] x86: mm: carve out the generic compile-time folded pgtable case in effective_prot()
Date: Wed, 15 Jul 2026 10:41:47 +0100	[thread overview]
Message-ID: <aldV23PwIXnFloaN@e129823.arm.com> (raw)
In-Reply-To: <CAMuHMdUqL=vJFAzYgcRVNbD_VWWwhehwTuhTfwLt_yRR8c+B0g@mail.gmail.com>

Hi Geert,

> Hi Yeoreum,
> 
> On Tue, 14 Jul 2026 at 18:51, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
> > On Tue, Jul 14, 2026 at 05:08:24PM +0100, Yeoreum Yun wrote:
> > > On Tue, Jul 14, 2026 at 07:35:19AM -0700, Dave Hansen wrote:
> > > > On 7/14/26 04:40, Yeoreum Yun wrote:
> > > > > @@ -254,22 +255,8 @@ static void effective_prot(struct ptdump_state *pt_st, int level, u64 val)
> > > > >         struct pg_state *st = container_of(pt_st, struct pg_state, ptdump);
> > > > >         pgprotval_t prot = val & PTE_FLAGS_MASK;
> > > > >         pgprotval_t effective;
> > > > > -       bool first_level = false;
> > > > >
> > > > > -       /* Ignore folded levels ... */
> > > > > -       if (((level == 0) && mm_p4d_folded(st->mm)) ||
> > > > > -           ((level == 1) && mm_pud_folded(st->mm)) ||
> > > > > -           ((level == 2) && mm_pmd_folded(st->mm)))
> > > > > -               return;
> > > > > -
> > > > > -       /* ... and make the actual first level remember the protection. */
> > > > > -       if (((level == 0)) ||
> > > > > -           ((level == 1) && mm_p4d_folded(st->mm)) ||
> > > > > -           ((level == 2) && mm_pud_folded(st->mm)) ||
> > > > > -           ((level == 3) && mm_pmd_folded(st->mm)))
> > > > > -               first_level = true;
> > > > > -
> > > > > -       if (!first_level) {
> > > > > +       if (first_level > st->first_level) {
> > > > >                 pgprotval_t higher_prot = st->prot_levels[level - 1];
> > > > >
> > > > >                 effective = (higher_prot & prot & (_PAGE_USER | _PAGE_RW)) |
> > > > > @@ -471,6 +458,15 @@ bool ptdump_walk_pgd_level_core(struct seq_file *m,
> > > > >                 .seq            = m
> > > > >         };
> > > > >
> > > > > +       if (mm_pmd_folded (mm))
> > > > > +               st->first_level = 3;
> > > > > +       else if (mm_pud_folded (mm))
> > > > > +               st->first_level = 2;
> > > > > +       else if (mm_p4d_folded (mm))
> > > > > +               st->first_level = 1;
> > > > > +       else
> > > > > +               st->first_level = 0;
> > > > > +
> > > > >         ptdump_walk_pgd(&st.ptdump, mm, pgd);
> > > >
> > > > This is indeed an improvement and a step in the right direction! Thanks
> > > > for looking at this.
> > > >
> > > > But one of my test for whether it's good x86 code is whether there's any
> > > > actually x86-specific logic in it. Isn't this basically a translation
> > > > between the integer level number and whether it is folded?
> > > >
> > > > That seems like a common helper that more than one arch could use. Could
> > > > this be stuck in a helper so that all arch/x86 has to do is:
> > > >
> > > >     if (mm_pt_level_folded(mm, level))
> > > >             return;
> > >
> > > Yes. at least the level semantic in ptdump (pgd is level 0,
> > > p4d is level 1, ...) is same to all archs where use ptdump.
> > > So It seems reasonable to add this common helper in ptdump.c
> > >
> >
> > Furthermore, the effective_prot() need to require to identify whether
> > it's the first pgtable to prevent the inheriting from dummy value.
> > So I think it seems to make a ptdump_pt_level_first() like:
> >
> > diff --git a/mm/ptdump.c b/mm/ptdump.c
> > index 973020000096c..2ec5700e4be5e 100644
> > --- a/mm/ptdump.c
> > +++ b/mm/ptdump.c
> > @@ -190,6 +190,23 @@ void ptdump_walk_pgd(struct ptdump_state *st, struct mm_struct *mm, pgd_t *pgd)
> >         st->note_page_flush(st);
> >  }
> >
> > +bool pdtump_pt_level_first(struct mm_struct *mm, int level)
> > +{
> > +       if (!mm || level > CONFIG_PGTABLE_LEVELS)
> > +               return false;
> > +
> > +       if (mm_pmd_folded(mm) && level == 3)
> > +               return true;
> > +       if (mm_pud_folded(mm) && level == 2)
> > +               return true;
> > +       if (mm_p4d_folded(mm) && level == 1)
> > +               return true;
> 
> Is this order (... && level == ...) the optimal order?
> On arm64, mm_pud_folded() and mm_p4d_folded() perform several checks.
> 
> > +       if (level == 0)
> > +               return true;
> > +
> > +       return false;
> > +}

It is. since the purpose of ptdump_pt_level_first is designed to be used
in the *callback* of pXd_entry(). IOW, if we check level 0 first,
it always returns wrong return in folded case.


-- 
Sincerely,
Yeoreum Yun

WARNING: multiple messages have this Message-ID (diff)
From: Yeoreum Yun <yeoreum.yun@arm.com>
To: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Yeoreum Yun <yeoreum.yun@arm.com>,
	Dave Hansen <dave.hansen@intel.com>,
	"David Hildenbrand (Arm)" <david@kernel.org>,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, loongarch@lists.linux.dev,
	linux-mips@vger.kernel.org, linux-arch@vger.kernel.org,
	kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org,
	x86@kernel.org, linux-mm@kvack.org, kasan-dev@googlegroups.com,
	linux-csky@vger.kernel.org, linux-m68k@lists.linux-m68k.org,
	linux-openrisc@vger.kernel.org, linux@armlinux.org.uk,
	akpm@linux-foundation.org, ankur.a.arora@oracle.com,
	rppt@kernel.org, linmag7@gmail.com, chleroy@kernel.org,
	klarasmodin@gmail.com, chenhuacai@kernel.org, kernel@xen0n.name,
	kas@kernel.org, zhangtianyang@loongson.cn, wangyuli@aosc.io,
	tsbogend@alpha.franken.de, ljs@kernel.org, jgg@ziepe.ca,
	catalin.marinas@arm.com, will@kernel.org, arnd@arndb.de,
	ryan.roberts@arm.com, pasha.tatashin@soleen.com,
	rmclure@linux.ibm.com, baolin.wang@linux.alibaba.com,
	tj@kernel.org, kevin.brodsky@arm.com, anup@brainfault.org,
	atish.patra@linux.dev, pjw@kernel.org, palmer@dabbelt.com,
	aou@eecs.berkeley.edu, alex@ghiti.fr,
	dave.hansen@linux.intel.com, luto@kernel.org,
	peterz@infradead.org, tglx@kernel.org, mingo@redhat.com,
	bp@alien8.de, hpa@zytor.com, hannes@cmpxchg.org,
	mhocko@kernel.org, qi.zheng@linux.dev, shakeel.butt@linux.dev,
	kasong@tencent.com, baohua@kernel.org, axelrasmussen@google.com,
	yuanchu@google.com, weixugc@google.com, ryabinin.a.a@gmail.com,
	glider@google.com, andreyknvl@gmail.com, dvyukov@google.com,
	vincenzo.frascino@arm.com, anshuman.khandual@arm.com,
	yang@os.amperecomputing.com, chaitanyas.prakash@arm.com,
	ardb@kernel.org, guoren@kernel.org, yang.li85200@gmail.com,
	viro@zeniv.linux.org.uk, dinguyen@kernel.org,
	schuster.simon@siemens-energy.com, wangruikang@iscas.ac.cn,
	junhui.liu@pigmoral.tech, muchun.song@linux.dev,
	vishal.moola@gmail.com, namcao@linutronix.de, pavel@kernel.org,
	djbw@kernel.org, yu-cheng.yu@intel.com, baolu.lu@linux.intel.com,
	Jonathan.Cameron@huawei.com, coxu@redhat.com,
	andreas@gaisler.com, liam@infradead.org, vbabka@kernel.org,
	surenb@google.com, mhocko@suse.com, shorne@gmail.com,
	jonas@southpole.se, stefan.kristiansson@saunalahti.fi
Subject: Re: [RFC PATCH 10/34] x86: mm: carve out the generic compile-time folded pgtable case in effective_prot()
Date: Wed, 15 Jul 2026 10:41:47 +0100	[thread overview]
Message-ID: <aldV23PwIXnFloaN@e129823.arm.com> (raw)
In-Reply-To: <CAMuHMdUqL=vJFAzYgcRVNbD_VWWwhehwTuhTfwLt_yRR8c+B0g@mail.gmail.com>

Hi Geert,

> Hi Yeoreum,
> 
> On Tue, 14 Jul 2026 at 18:51, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
> > On Tue, Jul 14, 2026 at 05:08:24PM +0100, Yeoreum Yun wrote:
> > > On Tue, Jul 14, 2026 at 07:35:19AM -0700, Dave Hansen wrote:
> > > > On 7/14/26 04:40, Yeoreum Yun wrote:
> > > > > @@ -254,22 +255,8 @@ static void effective_prot(struct ptdump_state *pt_st, int level, u64 val)
> > > > >         struct pg_state *st = container_of(pt_st, struct pg_state, ptdump);
> > > > >         pgprotval_t prot = val & PTE_FLAGS_MASK;
> > > > >         pgprotval_t effective;
> > > > > -       bool first_level = false;
> > > > >
> > > > > -       /* Ignore folded levels ... */
> > > > > -       if (((level == 0) && mm_p4d_folded(st->mm)) ||
> > > > > -           ((level == 1) && mm_pud_folded(st->mm)) ||
> > > > > -           ((level == 2) && mm_pmd_folded(st->mm)))
> > > > > -               return;
> > > > > -
> > > > > -       /* ... and make the actual first level remember the protection. */
> > > > > -       if (((level == 0)) ||
> > > > > -           ((level == 1) && mm_p4d_folded(st->mm)) ||
> > > > > -           ((level == 2) && mm_pud_folded(st->mm)) ||
> > > > > -           ((level == 3) && mm_pmd_folded(st->mm)))
> > > > > -               first_level = true;
> > > > > -
> > > > > -       if (!first_level) {
> > > > > +       if (first_level > st->first_level) {
> > > > >                 pgprotval_t higher_prot = st->prot_levels[level - 1];
> > > > >
> > > > >                 effective = (higher_prot & prot & (_PAGE_USER | _PAGE_RW)) |
> > > > > @@ -471,6 +458,15 @@ bool ptdump_walk_pgd_level_core(struct seq_file *m,
> > > > >                 .seq            = m
> > > > >         };
> > > > >
> > > > > +       if (mm_pmd_folded (mm))
> > > > > +               st->first_level = 3;
> > > > > +       else if (mm_pud_folded (mm))
> > > > > +               st->first_level = 2;
> > > > > +       else if (mm_p4d_folded (mm))
> > > > > +               st->first_level = 1;
> > > > > +       else
> > > > > +               st->first_level = 0;
> > > > > +
> > > > >         ptdump_walk_pgd(&st.ptdump, mm, pgd);
> > > >
> > > > This is indeed an improvement and a step in the right direction! Thanks
> > > > for looking at this.
> > > >
> > > > But one of my test for whether it's good x86 code is whether there's any
> > > > actually x86-specific logic in it. Isn't this basically a translation
> > > > between the integer level number and whether it is folded?
> > > >
> > > > That seems like a common helper that more than one arch could use. Could
> > > > this be stuck in a helper so that all arch/x86 has to do is:
> > > >
> > > >     if (mm_pt_level_folded(mm, level))
> > > >             return;
> > >
> > > Yes. at least the level semantic in ptdump (pgd is level 0,
> > > p4d is level 1, ...) is same to all archs where use ptdump.
> > > So It seems reasonable to add this common helper in ptdump.c
> > >
> >
> > Furthermore, the effective_prot() need to require to identify whether
> > it's the first pgtable to prevent the inheriting from dummy value.
> > So I think it seems to make a ptdump_pt_level_first() like:
> >
> > diff --git a/mm/ptdump.c b/mm/ptdump.c
> > index 973020000096c..2ec5700e4be5e 100644
> > --- a/mm/ptdump.c
> > +++ b/mm/ptdump.c
> > @@ -190,6 +190,23 @@ void ptdump_walk_pgd(struct ptdump_state *st, struct mm_struct *mm, pgd_t *pgd)
> >         st->note_page_flush(st);
> >  }
> >
> > +bool pdtump_pt_level_first(struct mm_struct *mm, int level)
> > +{
> > +       if (!mm || level > CONFIG_PGTABLE_LEVELS)
> > +               return false;
> > +
> > +       if (mm_pmd_folded(mm) && level == 3)
> > +               return true;
> > +       if (mm_pud_folded(mm) && level == 2)
> > +               return true;
> > +       if (mm_p4d_folded(mm) && level == 1)
> > +               return true;
> 
> Is this order (... && level == ...) the optimal order?
> On arm64, mm_pud_folded() and mm_p4d_folded() perform several checks.
> 
> > +       if (level == 0)
> > +               return true;
> > +
> > +       return false;
> > +}

It is. since the purpose of ptdump_pt_level_first is designed to be used
in the *callback* of pXd_entry(). IOW, if we check level 0 first,
it always returns wrong return in folded case.


-- 
Sincerely,
Yeoreum Yun

_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv

WARNING: multiple messages have this Message-ID (diff)
From: Yeoreum Yun <yeoreum.yun@arm.com>
To: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Yeoreum Yun <yeoreum.yun@arm.com>,
	Dave Hansen <dave.hansen@intel.com>,
	"David Hildenbrand (Arm)" <david@kernel.org>,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, loongarch@lists.linux.dev,
	linux-mips@vger.kernel.org, linux-arch@vger.kernel.org,
	kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org,
	x86@kernel.org, linux-mm@kvack.org, kasan-dev@googlegroups.com,
	linux-csky@vger.kernel.org, linux-m68k@lists.linux-m68k.org,
	linux-openrisc@vger.kernel.org, linux@armlinux.org.uk,
	akpm@linux-foundation.org, ankur.a.arora@oracle.com,
	rppt@kernel.org, linmag7@gmail.com, chleroy@kernel.org,
	klarasmodin@gmail.com, chenhuacai@kernel.org, kernel@xen0n.name,
	kas@kernel.org, zhangtianyang@loongson.cn, wangyuli@aosc.io,
	tsbogend@alpha.franken.de, ljs@kernel.org, jgg@ziepe.ca,
	catalin.marinas@arm.com, will@kernel.org, arnd@arndb.de,
	ryan.roberts@arm.com, pasha.tatashin@soleen.com,
	rmclure@linux.ibm.com, baolin.wang@linux.alibaba.com,
	tj@kernel.org, kevin.brodsky@arm.com, anup@brainfault.org,
	atish.patra@linux.dev, pjw@kernel.org, palmer@dabbelt.com,
	aou@eecs.berkeley.edu, alex@ghiti.fr,
	dave.hansen@linux.intel.com, luto@kernel.org,
	peterz@infradead.org, tglx@kernel.org, mingo@redhat.com,
	bp@alien8.de, hpa@zytor.com, hannes@cmpxchg.org,
	mhocko@kernel.org, qi.zheng@linux.dev, shakeel.butt@linux.dev,
	kasong@tencent.com, baohua@kernel.org, axelrasmussen@google.com,
	yuanchu@google.com, weixugc@google.com, ryabinin.a.a@gmail.com,
	glider@google.com, andreyknvl@gmail.com, dvyukov@google.com,
	vincenzo.frascino@arm.com, anshuman.khandual@arm.com,
	yang@os.amperecomputing.com, chaitanyas.prakash@arm.com,
	ardb@kernel.org, guoren@kernel.org, yang.li85200@gmail.com,
	viro@zeniv.linux.org.uk, dinguyen@kernel.org,
	schuster.simon@siemens-energy.com, wangruikang@iscas.ac.cn,
	junhui.liu@pigmoral.tech, muchun.song@linux.dev,
	vishal.moola@gmail.com, namcao@linutronix.de, pavel@kernel.org,
	djbw@kernel.org, yu-cheng.yu@intel.com, baolu.lu@linux.intel.com,
	Jonathan.Cameron@huawei.com, coxu@redhat.com,
	andreas@gaisler.com, liam@infradead.org, vbabka@kernel.org,
	surenb@google.com, mhocko@suse.com, shorne@gmail.com,
	jonas@southpole.se, stefan.kristiansson@saunalahti.fi
Subject: Re: [RFC PATCH 10/34] x86: mm: carve out the generic compile-time folded pgtable case in effective_prot()
Date: Wed, 15 Jul 2026 10:41:47 +0100	[thread overview]
Message-ID: <aldV23PwIXnFloaN@e129823.arm.com> (raw)
In-Reply-To: <CAMuHMdUqL=vJFAzYgcRVNbD_VWWwhehwTuhTfwLt_yRR8c+B0g@mail.gmail.com>

Hi Geert,

> Hi Yeoreum,
> 
> On Tue, 14 Jul 2026 at 18:51, Yeoreum Yun <yeoreum.yun@arm.com> wrote:
> > On Tue, Jul 14, 2026 at 05:08:24PM +0100, Yeoreum Yun wrote:
> > > On Tue, Jul 14, 2026 at 07:35:19AM -0700, Dave Hansen wrote:
> > > > On 7/14/26 04:40, Yeoreum Yun wrote:
> > > > > @@ -254,22 +255,8 @@ static void effective_prot(struct ptdump_state *pt_st, int level, u64 val)
> > > > >         struct pg_state *st = container_of(pt_st, struct pg_state, ptdump);
> > > > >         pgprotval_t prot = val & PTE_FLAGS_MASK;
> > > > >         pgprotval_t effective;
> > > > > -       bool first_level = false;
> > > > >
> > > > > -       /* Ignore folded levels ... */
> > > > > -       if (((level == 0) && mm_p4d_folded(st->mm)) ||
> > > > > -           ((level == 1) && mm_pud_folded(st->mm)) ||
> > > > > -           ((level == 2) && mm_pmd_folded(st->mm)))
> > > > > -               return;
> > > > > -
> > > > > -       /* ... and make the actual first level remember the protection. */
> > > > > -       if (((level == 0)) ||
> > > > > -           ((level == 1) && mm_p4d_folded(st->mm)) ||
> > > > > -           ((level == 2) && mm_pud_folded(st->mm)) ||
> > > > > -           ((level == 3) && mm_pmd_folded(st->mm)))
> > > > > -               first_level = true;
> > > > > -
> > > > > -       if (!first_level) {
> > > > > +       if (first_level > st->first_level) {
> > > > >                 pgprotval_t higher_prot = st->prot_levels[level - 1];
> > > > >
> > > > >                 effective = (higher_prot & prot & (_PAGE_USER | _PAGE_RW)) |
> > > > > @@ -471,6 +458,15 @@ bool ptdump_walk_pgd_level_core(struct seq_file *m,
> > > > >                 .seq            = m
> > > > >         };
> > > > >
> > > > > +       if (mm_pmd_folded (mm))
> > > > > +               st->first_level = 3;
> > > > > +       else if (mm_pud_folded (mm))
> > > > > +               st->first_level = 2;
> > > > > +       else if (mm_p4d_folded (mm))
> > > > > +               st->first_level = 1;
> > > > > +       else
> > > > > +               st->first_level = 0;
> > > > > +
> > > > >         ptdump_walk_pgd(&st.ptdump, mm, pgd);
> > > >
> > > > This is indeed an improvement and a step in the right direction! Thanks
> > > > for looking at this.
> > > >
> > > > But one of my test for whether it's good x86 code is whether there's any
> > > > actually x86-specific logic in it. Isn't this basically a translation
> > > > between the integer level number and whether it is folded?
> > > >
> > > > That seems like a common helper that more than one arch could use. Could
> > > > this be stuck in a helper so that all arch/x86 has to do is:
> > > >
> > > >     if (mm_pt_level_folded(mm, level))
> > > >             return;
> > >
> > > Yes. at least the level semantic in ptdump (pgd is level 0,
> > > p4d is level 1, ...) is same to all archs where use ptdump.
> > > So It seems reasonable to add this common helper in ptdump.c
> > >
> >
> > Furthermore, the effective_prot() need to require to identify whether
> > it's the first pgtable to prevent the inheriting from dummy value.
> > So I think it seems to make a ptdump_pt_level_first() like:
> >
> > diff --git a/mm/ptdump.c b/mm/ptdump.c
> > index 973020000096c..2ec5700e4be5e 100644
> > --- a/mm/ptdump.c
> > +++ b/mm/ptdump.c
> > @@ -190,6 +190,23 @@ void ptdump_walk_pgd(struct ptdump_state *st, struct mm_struct *mm, pgd_t *pgd)
> >         st->note_page_flush(st);
> >  }
> >
> > +bool pdtump_pt_level_first(struct mm_struct *mm, int level)
> > +{
> > +       if (!mm || level > CONFIG_PGTABLE_LEVELS)
> > +               return false;
> > +
> > +       if (mm_pmd_folded(mm) && level == 3)
> > +               return true;
> > +       if (mm_pud_folded(mm) && level == 2)
> > +               return true;
> > +       if (mm_p4d_folded(mm) && level == 1)
> > +               return true;
> 
> Is this order (... && level == ...) the optimal order?
> On arm64, mm_pud_folded() and mm_p4d_folded() perform several checks.
> 
> > +       if (level == 0)
> > +               return true;
> > +
> > +       return false;
> > +}

It is. since the purpose of ptdump_pt_level_first is designed to be used
in the *callback* of pXd_entry(). IOW, if we check level 0 first,
it always returns wrong return in folded case.


-- 
Sincerely,
Yeoreum Yun

-- 
kvm-riscv mailing list
kvm-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kvm-riscv

  reply	other threads:[~2026-07-15  9:42 UTC|newest]

Thread overview: 234+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-13 13:55 [RFC PATCH 00/34] mm: optimize unnecessary loads due to ptep_get() and friends out Yeoreum Yun
2026-07-13 13:55 ` Yeoreum Yun
2026-07-13 13:55 ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 01/34] ARM: mm: make nommu pgd_t a scalar Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 02/34] ARM: mm: make 2-level " Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 15:38   ` Arnd Bergmann
2026-07-13 15:38     ` Arnd Bergmann
2026-07-13 15:38     ` Arnd Bergmann
2026-07-13 16:04     ` David Hildenbrand (Arm)
2026-07-13 16:04       ` David Hildenbrand (Arm)
2026-07-13 16:04       ` David Hildenbrand (Arm)
2026-07-13 16:26       ` David Hildenbrand (Arm)
2026-07-13 16:26         ` David Hildenbrand (Arm)
2026-07-13 16:26         ` David Hildenbrand (Arm)
2026-07-14 10:26   ` Pedro Falcato
2026-07-14 10:26     ` Pedro Falcato
2026-07-14 10:26     ` Pedro Falcato
2026-07-14 10:54     ` David Hildenbrand (Arm)
2026-07-14 10:54       ` David Hildenbrand (Arm)
2026-07-14 10:54       ` David Hildenbrand (Arm)
2026-07-14 11:55     ` Arnd Bergmann
2026-07-14 11:55       ` Arnd Bergmann
2026-07-14 11:55       ` Arnd Bergmann
2026-07-14 13:34       ` David Laight
2026-07-14 13:34         ` David Laight
2026-07-14 13:34         ` David Laight
2026-07-14 15:06         ` Arnd Bergmann
2026-07-14 15:06           ` Arnd Bergmann
2026-07-14 15:06           ` Arnd Bergmann
2026-07-14 21:45           ` David Laight
2026-07-14 21:45             ` David Laight
2026-07-14 21:45             ` David Laight
2026-07-15  6:11             ` Arnd Bergmann
2026-07-15  6:11               ` Arnd Bergmann
2026-07-15  6:11               ` Arnd Bergmann
2026-07-14 12:34   ` David Laight
2026-07-14 12:34     ` David Laight
2026-07-14 12:34     ` David Laight
2026-07-14 13:03     ` David Hildenbrand (Arm)
2026-07-14 13:03       ` David Hildenbrand (Arm)
2026-07-14 13:03       ` David Hildenbrand (Arm)
2026-07-15  6:15   ` Arnd Bergmann
2026-07-15  6:15     ` Arnd Bergmann
2026-07-15  6:15     ` Arnd Bergmann
2026-07-15  9:41     ` David Hildenbrand (Arm)
2026-07-15  9:41       ` David Hildenbrand (Arm)
2026-07-15  9:41       ` David Hildenbrand (Arm)
2026-07-13 13:55 ` [RFC PATCH 03/34] ARM: mm: remove custom pgdp_get() Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 04/34] LoongArch: mm: define pud_leaf() only when PUD exists Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 05/34] MIPS: " Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 06/34] mm/pgtable: define (pgd|p4d|pud)_leaf() for folded page tables Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 07/34] mm/pgtable: define (pgd|p4d|pud)_offset_lockless() " Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 08/34] loongarch: kvm: remove stack copy address of pXd in pXd_offset() Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 09/34] riscv: " Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 10/34] x86: mm: carve out the generic compile-time folded pgtable case in effective_prot() Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 14:19   ` Dave Hansen
2026-07-13 14:19     ` Dave Hansen
2026-07-13 14:19     ` Dave Hansen
2026-07-13 14:41     ` David Hildenbrand (Arm)
2026-07-13 14:41       ` David Hildenbrand (Arm)
2026-07-13 14:41       ` David Hildenbrand (Arm)
2026-07-13 14:55       ` Dave Hansen
2026-07-13 14:55         ` Dave Hansen
2026-07-13 14:55         ` Dave Hansen
2026-07-13 15:02         ` David Hildenbrand (Arm)
2026-07-13 15:02           ` David Hildenbrand (Arm)
2026-07-13 15:02           ` David Hildenbrand (Arm)
2026-07-13 17:57           ` Dave Hansen
2026-07-13 17:57             ` Dave Hansen
2026-07-13 17:57             ` Dave Hansen
2026-07-13 19:49             ` David Hildenbrand (Arm)
2026-07-13 19:49               ` David Hildenbrand (Arm)
2026-07-13 19:49               ` David Hildenbrand (Arm)
2026-07-13 20:27               ` Dave Hansen
2026-07-13 20:27                 ` Dave Hansen
2026-07-13 20:27                 ` Dave Hansen
2026-07-13 21:17                 ` David Hildenbrand (Arm)
2026-07-13 21:17                   ` David Hildenbrand (Arm)
2026-07-13 21:17                   ` David Hildenbrand (Arm)
2026-07-13 21:40                   ` Dave Hansen
2026-07-13 21:40                     ` Dave Hansen
2026-07-13 21:40                     ` Dave Hansen
2026-07-14 10:50                     ` David Hildenbrand (Arm)
2026-07-14 10:50                       ` David Hildenbrand (Arm)
2026-07-14 10:50                       ` David Hildenbrand (Arm)
2026-07-14 11:40                       ` Yeoreum Yun
2026-07-14 11:40                         ` Yeoreum Yun
2026-07-14 11:40                         ` Yeoreum Yun
2026-07-14 14:35                         ` Dave Hansen
2026-07-14 14:35                           ` Dave Hansen
2026-07-14 14:35                           ` Dave Hansen
2026-07-14 16:08                           ` Yeoreum Yun
2026-07-14 16:08                             ` Yeoreum Yun
2026-07-14 16:08                             ` Yeoreum Yun
2026-07-14 16:31                             ` David Hildenbrand (Arm)
2026-07-14 16:31                               ` David Hildenbrand (Arm)
2026-07-14 16:31                               ` David Hildenbrand (Arm)
2026-07-14 18:28                               ` Yeoreum Yun
2026-07-14 18:28                                 ` Yeoreum Yun
2026-07-14 18:28                                 ` Yeoreum Yun
2026-07-15  9:43                                 ` David Hildenbrand (Arm)
2026-07-15  9:43                                   ` David Hildenbrand (Arm)
2026-07-15  9:43                                   ` David Hildenbrand (Arm)
2026-07-14 16:51                             ` Yeoreum Yun
2026-07-14 16:51                               ` Yeoreum Yun
2026-07-14 16:51                               ` Yeoreum Yun
2026-07-14 17:29                               ` David Hildenbrand (Arm)
2026-07-14 17:29                                 ` David Hildenbrand (Arm)
2026-07-14 17:29                                 ` David Hildenbrand (Arm)
2026-07-14 17:58                                 ` Yeoreum Yun
2026-07-14 17:58                                   ` Yeoreum Yun
2026-07-14 17:58                                   ` Yeoreum Yun
2026-07-15  9:44                                   ` David Hildenbrand (Arm)
2026-07-15  9:44                                     ` David Hildenbrand (Arm)
2026-07-15  9:44                                     ` David Hildenbrand (Arm)
2026-07-15  7:45                               ` Geert Uytterhoeven
2026-07-15  7:45                                 ` Geert Uytterhoeven
2026-07-15  7:45                                 ` Geert Uytterhoeven
2026-07-15  9:41                                 ` Yeoreum Yun [this message]
2026-07-15  9:41                                   ` Yeoreum Yun
2026-07-15  9:41                                   ` Yeoreum Yun
2026-07-15 10:34                                   ` Geert Uytterhoeven
2026-07-15 10:34                                     ` Geert Uytterhoeven
2026-07-15 10:34                                     ` Geert Uytterhoeven
2026-07-13 14:48     ` Yeoreum Yun
2026-07-13 14:48       ` Yeoreum Yun
2026-07-13 14:48       ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 11/34] mm: vmscan: remove stack copy address of pud pass in wallk_pud_range() Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-15 13:44   ` Usama Anjum
2026-07-15 13:44     ` Usama Anjum
2026-07-15 13:44     ` Usama Anjum
2026-07-13 13:55 ` [RFC PATCH 12/34] arm64: mm: use proper set_pXd() for generic compile-time folded patable in kasan_early_init() Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 13/34] arm64: mm: define pud_set_huge() when __PGTABLE_PMD_FOLDED not defined Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 14/34] csky: mm: use proper set_pXd() for generic compile-time folded patable in vmalloc_fault() Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 15/34] mips: mm: use proper set_pXd() for generic compile-time folded patable in vmalloc_fault path Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 16/34] nios2: " Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 17/34] riscv: mm: use proper set_pXd() for generic compile-time folded patable in vmalloc_fault() Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 18/34] riscv: mm: use proper set_pXd() for generic compile-time folded patable in setup_vm_final() Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 19/34] x86: power: use proper set_pXd() for generic compile-time folded patable in resume_one_md_table_init() Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 14:38   ` Dave Hansen
2026-07-13 14:38     ` Dave Hansen
2026-07-13 14:38     ` Dave Hansen
2026-07-13 14:59     ` David Hildenbrand (Arm)
2026-07-13 14:59       ` David Hildenbrand (Arm)
2026-07-13 14:59       ` David Hildenbrand (Arm)
2026-07-13 15:01     ` Yeoreum Yun
2026-07-13 15:01       ` Yeoreum Yun
2026-07-13 15:01       ` Yeoreum Yun
2026-07-13 13:55 ` [RFC PATCH 20/34] x86: kexec: use proper set_pXd() for generic compile-time folded patable in machine_kexec_page_table_set_one() Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:55   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 21/34] x86: platform: use proper set_pXd() for generic compile-time folded patable in setup_olpc_ofw_pgd() Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 22/34] x86: mm: use proper set_pXd() for generic compile-time folded patable in one_md_table_init() Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 23/34] x86: mm: skip pud setup when using generic compile-time folded pagetable Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 24/34] x86: mm: call try_to_free_pmd_page() when CONFIG_PGTABLE_LEVELS > 2 Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 25/34] x86: mm: remove usage of pgd_page_vaddr() for CONFIG_x86_PAE Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 26/34] x86: mm: define pudp_set_access_flags() when CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD is enabled only Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 27/34] m68k: mm: remove usage of pgd_page_vaddr() for CONFIG_PGTABLE_LEVELS=3 Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 28/34] arm: mm: use proper pgtable APIs for generic compile-time folded patable in kasan_init() Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 29/34] mm/pgtable: disallow calling folded set_pgd/set_p4d/set_pud Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 30/34] mm/pgtable: disallow calling folded (pgd|p4d|pud)_page, pgd_page_vaddr() and (p4d|pud)_pgtable Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 31/34] mm/pgtable: optimize pmdp_get() and friends for folded pagetable levels Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 32/34] openrisc/pgtable: drop __pmd_offset() Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 33/34] mm/pgtable: catch abuse of folded dummy pgd_t/p4d_t/pud_t Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56 ` [RFC PATCH 34/34] arm64: pgtable: convert pte_present() from macro to static inline Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 13:56   ` Yeoreum Yun
2026-07-13 14:08 ` [RFC PATCH 00/34] mm: optimize unnecessary loads due to ptep_get() and friends out David Hildenbrand (Arm)
2026-07-13 14:08   ` David Hildenbrand (Arm)
2026-07-13 14:08   ` David Hildenbrand (Arm)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aldV23PwIXnFloaN@e129823.arm.com \
    --to=yeoreum.yun@arm.com \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=akpm@linux-foundation.org \
    --cc=alex@ghiti.fr \
    --cc=andreas@gaisler.com \
    --cc=andreyknvl@gmail.com \
    --cc=ankur.a.arora@oracle.com \
    --cc=anshuman.khandual@arm.com \
    --cc=anup@brainfault.org \
    --cc=aou@eecs.berkeley.edu \
    --cc=ardb@kernel.org \
    --cc=arnd@arndb.de \
    --cc=atish.patra@linux.dev \
    --cc=axelrasmussen@google.com \
    --cc=baohua@kernel.org \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=bp@alien8.de \
    --cc=catalin.marinas@arm.com \
    --cc=chaitanyas.prakash@arm.com \
    --cc=chenhuacai@kernel.org \
    --cc=chleroy@kernel.org \
    --cc=coxu@redhat.com \
    --cc=dave.hansen@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=david@kernel.org \
    --cc=dinguyen@kernel.org \
    --cc=djbw@kernel.org \
    --cc=dvyukov@google.com \
    --cc=geert@linux-m68k.org \
    --cc=glider@google.com \
    --cc=guoren@kernel.org \
    --cc=hannes@cmpxchg.org \
    --cc=hpa@zytor.com \
    --cc=jgg@ziepe.ca \
    --cc=jonas@southpole.se \
    --cc=junhui.liu@pigmoral.tech \
    --cc=kas@kernel.org \
    --cc=kasan-dev@googlegroups.com \
    --cc=kasong@tencent.com \
    --cc=kernel@xen0n.name \
    --cc=kevin.brodsky@arm.com \
    --cc=klarasmodin@gmail.com \
    --cc=kvm-riscv@lists.infradead.org \
    --cc=liam@infradead.org \
    --cc=linmag7@gmail.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-csky@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-m68k@lists.linux-m68k.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-openrisc@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=linux@armlinux.org.uk \
    --cc=ljs@kernel.org \
    --cc=loongarch@lists.linux.dev \
    --cc=luto@kernel.org \
    --cc=mhocko@kernel.org \
    --cc=mhocko@suse.com \
    --cc=mingo@redhat.com \
    --cc=muchun.song@linux.dev \
    --cc=namcao@linutronix.de \
    --cc=palmer@dabbelt.com \
    --cc=pasha.tatashin@soleen.com \
    --cc=pavel@kernel.org \
    --cc=peterz@infradead.org \
    --cc=pjw@kernel.org \
    --cc=qi.zheng@linux.dev \
    --cc=rmclure@linux.ibm.com \
    --cc=rppt@kernel.org \
    --cc=ryabinin.a.a@gmail.com \
    --cc=ryan.roberts@arm.com \
    --cc=schuster.simon@siemens-energy.com \
    --cc=shakeel.butt@linux.dev \
    --cc=shorne@gmail.com \
    --cc=stefan.kristiansson@saunalahti.fi \
    --cc=surenb@google.com \
    --cc=tglx@kernel.org \
    --cc=tj@kernel.org \
    --cc=tsbogend@alpha.franken.de \
    --cc=vbabka@kernel.org \
    --cc=vincenzo.frascino@arm.com \
    --cc=viro@zeniv.linux.org.uk \
    --cc=vishal.moola@gmail.com \
    --cc=wangruikang@iscas.ac.cn \
    --cc=wangyuli@aosc.io \
    --cc=weixugc@google.com \
    --cc=will@kernel.org \
    --cc=x86@kernel.org \
    --cc=yang.li85200@gmail.com \
    --cc=yang@os.amperecomputing.com \
    --cc=yu-cheng.yu@intel.com \
    --cc=yuanchu@google.com \
    --cc=zhangtianyang@loongson.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.