linux/include/asm-generic
Lance Yang 1fb3d8c20b mm/mmu_gather: replace IPI with synchronize_rcu() when batch allocation fails
When freeing page tables, we try to batch them.  If batch allocation fails
(GFP_NOWAIT), __tlb_remove_table_one() immediately frees the one without
batching.

On !CONFIG_PT_RECLAIM, the fallback sends an IPI to all CPUs via
tlb_remove_table_sync_one().  It disrupts all CPUs even when only a single
process is unmapping memory.  IPI broadcast was reported to hurt RT
workloads[1].

tlb_remove_table_sync_one() synchronizes with lockless page-table walkers
(e.g.  GUP-fast) that rely on IRQ disabling.  These walkers use
local_irq_disable(), which is also an RCU read-side critical section.

This patch introduces tlb_remove_table_sync_rcu() which uses RCU grace
period (synchronize_rcu()) instead of IPI broadcast.  This provides the
same guarantee as IPI but without disrupting all CPUs.  Since batch
allocation already failed, we are in a slow path where sleeping is
acceptable - we are in process context (unmap_region, exit_mmap) with only
mmap_lock held.

tlb_remove_table_sync_one() is retained for other callers (e.g.,
khugepaged after pmdp_collapse_flush(), tlb_finish_mmu() when
tlb->fully_unshared_tables) that are not slow paths.  Converting those may
require different approaches such as targeted IPIs.

Link: https://lore.kernel.org/linux-mm/1b27a3fa-359a-43d0-bdeb-c31341749367@kernel.org/ [1]
Link: https://lore.kernel.org/linux-mm/20260202150957.GD1282955@noisy.programming.kicks-ass.net/
Link: https://lore.kernel.org/linux-mm/dfdfeac9-5cd5-46fc-a5c1-9ccf9bd3502a@intel.com/
Link: https://lore.kernel.org/linux-mm/bc489455-bb18-44dc-8518-ae75abda6bec@kernel.org/
Link: https://lkml.kernel.org/r/20260224142101.20500-1-lance.yang@linux.dev
Signed-off-by: Lance Yang <lance.yang@linux.dev>
Suggested-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Suggested-by: Dave Hansen <dave.hansen@intel.com>
Suggested-by: David Hildenbrand (Arm) <david@kernel.org>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Nick Piggin <npiggin@gmail.com>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
2026-04-05 13:53:05 -07:00
..
bitops
vdso
Kbuild perf: Use EXPORT_SYMBOL_FOR_KVM() for the mediated APIs 2025-12-19 08:54:59 +01:00
access_ok.h
agp.h
archrandom.h
asm-offsets.h
asm-prototypes.h
atomic.h
atomic64.h atomic: specify alignment for atomic_t and atomic64_t 2026-01-26 19:07:14 -08:00
audit_change_attr.h audit: add fchmodat2() to change attributes class 2025-12-15 14:27:18 -05:00
audit_dir_write.h
audit_read.h audit: add missing syscalls to read class 2026-01-06 16:42:29 -05:00
audit_signal.h
audit_write.h
barrier.h
bitops.h
bitsperlong.h
bug.h x86/bug: Implement WARN_ONCE() 2025-11-24 20:23:25 +01:00
cache.h
cacheflush.h
cfi.h
checksum.h
cmpxchg-local.h
cmpxchg.h
codetag.lds.h
compat.h
current.h
delay.h
device.h
div64.h
dma-mapping.h
dma.h
early_ioremap.h
emergency-restart.h
error-injection.h
exec.h
extable.h
fixmap.h
flat.h
fprobe.h
ftrace.h
futex.h
getorder.h
hardirq.h
hugetlb.h mm: correctly handle UFFD PTE markers 2025-11-24 15:08:50 -08:00
hw_irq.h
int-ll64.h
io.h
ioctl.h
iomap.h
irq.h
irq_regs.h
irq_work.h
irqflags.h
kdebug.h
kmap_size.h
kprobes.h
kvm_para.h
kvm_types.h
linkage.h
local.h
local64.h
logic_io.h
mcs_spinlock.h
memory_model.h
mm_hooks.h
mmiowb.h
mmiowb_types.h
mmu.h
mmu_context.h
mmzone.h
module.h
module.lds.h
mshyperv.h mshv: Introduce hv_deposit_memory helper functions 2026-02-19 06:38:48 +00:00
msi.h
nommu_context.h
numa.h
param.h
parport.h
pci.h
pci_iomap.h
percpu.h asm-generic: percpu: Add assembly guard 2025-10-27 16:41:53 +01:00
pgalloc.h mm: remove unnecessary __GFP_HIGHMEM in __p*d_alloc_one_*() 2025-11-20 13:43:59 -08:00
pgtable-nop4d.h
pgtable-nopmd.h
pgtable-nopud.h
pgtable_uffd.h mm: userfaultfd: add pgtable_supports_uffd_wp() 2025-11-24 15:08:54 -08:00
preempt.h
qrwlock.h
qrwlock_types.h
qspinlock.h
qspinlock_types.h
resource.h
rqspinlock.h mm.git review status for linus..mm-nonmm-stable 2026-02-12 12:13:01 -08:00
runtime-const.h
rwonce.h
seccomp.h
sections.h
serial.h
set_memory.h
shmparam.h
signal.h
simd.h
softirq_stack.h
spinlock.h
spinlock_types.h
statfs.h
string.h
switch_to.h
syscall.h
syscalls.h
text-patching.h
thread_info_tif.h rseq: Switch to TIF_RSEQ if supported 2025-11-04 08:35:37 +01:00
ticket_spinlock.h
timex.h
tlb.h mm/mmu_gather: replace IPI with synchronize_rcu() when batch allocation fails 2026-04-05 13:53:05 -07:00
tlbflush.h
topology.h include/asm-generic/topology.h: Remove unused definition of cpumask_of_node() 2026-01-30 16:44:38 +01:00
trace_clock.h
uaccess.h
unwind_user.h
user.h
vermagic.h
vga.h
video.h
vmlinux.lds.h kbuild: Split .modinfo out from ELF_DETAILS 2026-02-26 11:50:19 -07:00
word-at-a-time.h
xor.h