On Tue, Jul 12, 2022 at 1:35 AM Kefeng Wang <wangkefeng.wang@xxxxxxxxxx> wrote: > > Hi Barry, > > On 2022/7/11 11:46, Barry Song wrote: > > From: Barry Song <v-songbaohua@xxxxxxxx> > > > > Platforms like ARM64 have hareware TLB shootdown broadcast. They > > don't maintain mm_cpumask but just send tlbi and related sync > > instructions for TLB flush. task's mm_cpumask is normally empty > > in this case. We also allow deferred TLB flush on this kind of > > platforms. > > > > Signed-off-by: Barry Song <v-songbaohua@xxxxxxxx>> > > --- > ... > > diff --git a/mm/Kconfig b/mm/Kconfig > > index 169e64192e48..7bf54f57ca01 100644 > > --- a/mm/Kconfig > > +++ b/mm/Kconfig > > @@ -951,6 +951,9 @@ config ARCH_HAS_CURRENT_STACK_POINTER > > register alias named "current_stack_pointer", this config can be > > selected. > > > > +config ARCH_HAS_MM_CPUMASK > > + bool > > + > > config ARCH_HAS_VM_GET_PAGE_PROT > > bool > > > > diff --git a/mm/rmap.c b/mm/rmap.c > > index 5bcb334cd6f2..13d4f9a1d4f1 100644 > > --- a/mm/rmap.c > > +++ b/mm/rmap.c > > @@ -692,6 +692,10 @@ static bool should_defer_flush(struct mm_struct *mm, enum ttu_flags flags) > > if (!(flags & TTU_BATCH_FLUSH)) > > return false; > > > > +#ifndef CONFIG_ARCH_HAS_MM_CPUMASK > > + return true; > > +#endif > > + > > Here is another option to enable arch's tlbbatch defer > This option is even better than simply having ARCH_HAS_MM_CPUMASK since arch might make decisions based on specific hardware characters. for example, https://lists.ozlabs.org/pipermail/linuxppc-dev/2017-November/165468.html +bool arch_tlbbatch_should_defer(struct mm_struct *mm) +{ + if (!radix_enabled() || cpu_has_feature(CPU_FTR_POWER9_DD1)) + return false; + + if (!mm_is_thread_local(mm)) + return true; + + return false; +} In this case, having MM_CPUMASK doesn't necessarily mean tlbbatch is needed. > [1] > https://patchwork.ozlabs.org/project/linuxppc-dev/patch/20171101101735.2318-2-khandual@xxxxxxxxxxxxxxxxxx/ > > > /* If remote CPUs need to be flushed then defer batch the flush */ > > if (cpumask_any_but(mm_cpumask(mm), get_cpu()) < nr_cpu_ids) > > should_defer = true; Thanks Barry