Re: [PATCH v7 2/2] arm64: support batched/deferred tlb shootdown during page reclamation
From: Catalin Marinas <catalin.marinas@arm.com>
Date: 2023-01-05 18:15:13
Also in:
linux-arm-kernel, linux-doc, linux-mips, linux-mm, linux-riscv, linux-s390, lkml
On Thu, Nov 17, 2022 at 04:26:48PM +0800, Yicong Yang wrote:
It is tested on 4,8,128 CPU platforms and shows to be beneficial on large systems but may not have improvement on small systems like on a 4 CPU platform. So make ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH depends on CONFIG_EXPERT for this stage and make this disabled on systems with less than 8 CPUs. User can modify this threshold according to their own platforms by CONFIG_NR_CPUS_FOR_BATCHED_TLB.
What's the overhead of such batching on systems with 4 or fewer CPUs? If it isn't noticeable, I'd rather have it always on than some number chosen on whichever SoC you tested. Another option would be to make this a sysctl tunable.
.../features/vm/TLB/arch-support.txt | 2 +- arch/arm64/Kconfig | 6 +++ arch/arm64/include/asm/tlbbatch.h | 12 +++++ arch/arm64/include/asm/tlbflush.h | 52 ++++++++++++++++++- arch/x86/include/asm/tlbflush.h | 5 +- include/linux/mm_types_task.h | 4 +- mm/rmap.c | 10 ++--
Please keep any function prototype changes in a preparatory patch so that the arm64 one only introduces the arch specific changes. Easier to review.
+static inline bool arch_tlbbatch_should_defer(struct mm_struct *mm)
+{
+ /*
+ * TLB batched flush is proved to be beneficial for systems with large
+ * number of CPUs, especially system with more than 8 CPUs. TLB shutdown
+ * is cheap on small systems which may not need this feature. So use
+ * a threshold for enabling this to avoid potential side effects on
+ * these platforms.
+ */
+ if (num_online_cpus() < CONFIG_ARM64_NR_CPUS_FOR_BATCHED_TLB)
+ return false;The x86 implementation tracks the cpumask of where a task has run. We don't have such tracking on arm64 and I don't think it matters. As noticed/described in this series, the bottleneck is the actual DSB synchronisation (which sends a DVM Sync message to all the other CPUs and waits for a DVM Complete response). So I think it makes sense not to bother with an mm_cpumask(). What this patch aims to optimise is actually the number of DSBs issued on an SMP system by ptep_clear_flush(). The DVM is not an architected concept (well, it's part of AMBA AXI). I'd be curious to know how such patch behaves on Apple's M1/M2 hardware. My preference would be to have this always on for num_online_cpus() > 1 if there's no overhead. -- Catalin