mirror of
https://github.com/torvalds/linux.git
synced 2026-09-26 01:52:03 +02:00
x86/kvm: Disable preemption in kvm_flush_tlb_multi()
kvm_flush_tlb_multi() is installed as an x86 PV TLB flush backend, so flush_tlb_multi() can reach it through pv_ops when running as a KVM guest. kvm_flush_tlb_multi() uses the per-CPU scratch cpumask __pv_cpu_mask. That buffer must remain tied to the current CPU until the mask has been copied, filtered, and consumed by native_flush_tlb_multi(). The x86/mm callers currently enter flush_tlb_multi() while pinned to a CPU. To let those callers drop CPU pinning before issuing the remote TLB flush, each PV backend must protect its own CPU-local scratch state. Make the KVM backend protect its per-CPU scratch cpumask by disabling preemption locally. This is harmless with the current callers, where the preemption disable is nested, and makes the KVM pv_ops dependency explicit before changing the x86/mm call sites. Signed-off-by: Chuyi Zhou <zhouchuyi@bytedance.com> Signed-off-by: Thomas Gleixner <tglx@kernel.org> Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Link: https://patch.msgid.link/20260709122933.4021501-14-zhouchuyi@bytedance.com
This commit is contained in:
parent
ed15468787
commit
ae397bb32d
|
|
@ -663,8 +663,10 @@ static void kvm_flush_tlb_multi(const struct cpumask *cpumask,
|
|||
u8 state;
|
||||
int cpu;
|
||||
struct kvm_steal_time *src;
|
||||
struct cpumask *flushmask = this_cpu_cpumask_var_ptr(__pv_cpu_mask);
|
||||
struct cpumask *flushmask;
|
||||
|
||||
guard(preempt)();
|
||||
flushmask = this_cpu_cpumask_var_ptr(__pv_cpu_mask);
|
||||
cpumask_copy(flushmask, cpumask);
|
||||
/*
|
||||
* We have to call flush only on online vCPUs. And
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user