On Wed, Feb 12, 2025 at 10:54:38AM +0100, Peter Zijlstra wrote: > On Tue, Feb 11, 2025 at 04:08:04PM -0500, Rik van Riel wrote: > > > +static void broadcast_tlb_flush(struct flush_tlb_info *info) > > +{ > > + bool pmd = info->stride_shift == PMD_SHIFT; > > + unsigned long maxnr = invlpgb_count_max; > > + unsigned long asid = info->mm->context.global_asid; > > + unsigned long addr = info->start; > > + unsigned long nr; > > + > > + /* Flushing multiple pages at once is not supported with 1GB pages. */ > > + if (info->stride_shift > PMD_SHIFT) > > + maxnr = 1; > > How does this work? > > Normally, if we get a 1GB range, we'll iterate on the stride and INVLPG > each one (just like any other stride). > > Should you not instead either force the stride down to PMD level or > force a full flush? Oh, n/m, I think I see.