Re: [PATCH 12/12] x86/mm: only invalidate final translations with INVLPGB

From: Rik van Riel
Date: Sat Jan 11 2025 - 21:39:58 EST


On Fri, 2025-01-03 at 19:40 +0100, Jann Horn wrote:
> On Mon, Dec 30, 2024 at 6:53 PM Rik van Riel <riel@xxxxxxxxxxx>
> wrote:
> >
> > +++ b/arch/x86/include/asm/invlpgb.h
> > @@ -51,7 +51,7 @@ static inline void invlpgb_flush_user(unsigned
> > long pcid,
> >  static inline void invlpgb_flush_user_nr(unsigned long pcid,
> > unsigned long addr,
> >                                          int nr, bool pmd_stride)
> >  {
> > -       __invlpgb(0, pcid, addr, nr - 1, pmd_stride, INVLPGB_PCID |
> > INVLPGB_VA);
> > +       __invlpgb(0, pcid, addr, nr - 1, pmd_stride, INVLPGB_PCID |
> > INVLPGB_VA | INVLPGB_FINAL_ONLY);
> >  }
>
> Please note this final-only behavior in a comment above the function
> and/or rename the function to make this clear.
>
> I think this currently interacts badly with pmdp_collapse_flush(),
> which is used by retract_page_tables(). pmdp_collapse_flush() removes

I've added a freed_tables argument to invlpgb_flush_user_nr_nosync

> a PMD entry pointing to a page table with pmdp_huge_get_and_clear(),
> then calls flush_tlb_range(), which on x86 calls flush_tlb_mm_range()
> with the "freed_tables" parameter set to false. But that's really a
> preexisting bug, not something introduced by your series. I've sent a
> patch for that, see
> <
> https://lore.kernel.org/r/20250103-x86-collapse-flush-fix-v1-1-3c521856cfa6@xxxxxxxxxx
> >.
>
With your change, I believe the next version of my patch
series should handle this case correctly, too.

--
All Rights Reversed.