On Mon, 2025-01-06 at 09:29 -0800, Dave Hansen wrote: > On 12/30/24 09:53, Rik van Riel wrote: > > --- a/arch/x86/mm/tlb.c > > +++ b/arch/x86/mm/tlb.c > > @@ -1074,6 +1074,12 @@ static void do_flush_tlb_all(void *info) > > void flush_tlb_all(void) > > { > > count_vm_tlb_event(NR_TLB_REMOTE_FLUSH); > > + if (cpu_feature_enabled(X86_FEATURE_INVLPGB)) { > > + guard(preempt)(); > > + invlpgb_flush_all(); > > + tlbsync(); > > + return; > > + } > > After seeing a few of these, I'd really prefer that the preempt and > tlbsync() logic be hidden in the invlpgb_*() helper, or *a* helper at > least. > > This would be a lot easier on the eyes if it were something like: > > flushed = invlpgb_flush_all(); > if (flushed) > return; One issue here is that some of the invlpgb helpers are supposed to be asynchronous, because we can have multiple of those flushes pending simultaneously, and then wait for them to complete with a tlbsync. How would we avoid the confusion between the two types (async vs sync) invlpgb helpers? I'm all for cleaning this up, but I have not thought of a good idea yet... -- All Rights Reversed.