Skip to content

Commit 4fdc343

Browse files
Szy0127bp3tk0v
authored andcommitted
x86/lib: Add WBINVD and WBNOINVD helpers to target multiple CPUs
Extract KVM's open-coded calls to do writeback caches on multiple CPUs to common library helpers for both WBINVD and WBNOINVD (KVM will use both). Put the onus on the caller to check for a non-empty mask to simplify the SMP=n implementation, e.g. so that it doesn't need to check that the one and only CPU in the system is present in the mask. [sean: move to lib, add SMP=n helpers, clarify usage] Signed-off-by: Zheyun Shen <[email protected]> Signed-off-by: Sean Christopherson <[email protected]> Signed-off-by: Borislav Petkov (AMD) <[email protected]> Reviewed-by: Tom Lendacky <[email protected]> Acked-by: Kai Huang <[email protected]> Link: https://lore.kernel.org/r/[email protected] Link: https://lore.kernel.org/[email protected]
1 parent 07f99c3 commit 4fdc343

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

arch/x86/include/asm/smp.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ void native_play_dead(void);
113113
void play_dead_common(void);
114114
void wbinvd_on_cpu(int cpu);
115115
void wbinvd_on_all_cpus(void);
116+
void wbinvd_on_cpus_mask(struct cpumask *cpus);
116117
void wbnoinvd_on_all_cpus(void);
118+
void wbnoinvd_on_cpus_mask(struct cpumask *cpus);
117119

118120
void smp_kick_mwait_play_dead(void);
119121
void __noreturn mwait_play_dead(unsigned int eax_hint);
@@ -154,11 +156,21 @@ static inline void wbinvd_on_all_cpus(void)
154156
wbinvd();
155157
}
156158

159+
static inline void wbinvd_on_cpus_mask(struct cpumask *cpus)
160+
{
161+
wbinvd();
162+
}
163+
157164
static inline void wbnoinvd_on_all_cpus(void)
158165
{
159166
wbnoinvd();
160167
}
161168

169+
static inline void wbnoinvd_on_cpus_mask(struct cpumask *cpus)
170+
{
171+
wbnoinvd();
172+
}
173+
162174
static inline struct cpumask *cpu_llc_shared_mask(int cpu)
163175
{
164176
return (struct cpumask *)cpumask_of(0);

arch/x86/kvm/x86.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8289,8 +8289,7 @@ static int kvm_emulate_wbinvd_noskip(struct kvm_vcpu *vcpu)
82898289
int cpu = get_cpu();
82908290

82918291
cpumask_set_cpu(cpu, vcpu->arch.wbinvd_dirty_mask);
8292-
on_each_cpu_mask(vcpu->arch.wbinvd_dirty_mask,
8293-
wbinvd_ipi, NULL, 1);
8292+
wbinvd_on_cpus_mask(vcpu->arch.wbinvd_dirty_mask);
82948293
put_cpu();
82958294
cpumask_clear(vcpu->arch.wbinvd_dirty_mask);
82968295
} else

arch/x86/lib/cache-smp.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ void wbinvd_on_all_cpus(void)
2020
}
2121
EXPORT_SYMBOL(wbinvd_on_all_cpus);
2222

23+
void wbinvd_on_cpus_mask(struct cpumask *cpus)
24+
{
25+
on_each_cpu_mask(cpus, __wbinvd, NULL, 1);
26+
}
27+
EXPORT_SYMBOL_GPL(wbinvd_on_cpus_mask);
28+
2329
static void __wbnoinvd(void *dummy)
2430
{
2531
wbnoinvd();
@@ -30,3 +36,9 @@ void wbnoinvd_on_all_cpus(void)
3036
on_each_cpu(__wbnoinvd, NULL, 1);
3137
}
3238
EXPORT_SYMBOL_GPL(wbnoinvd_on_all_cpus);
39+
40+
void wbnoinvd_on_cpus_mask(struct cpumask *cpus)
41+
{
42+
on_each_cpu_mask(cpus, __wbnoinvd, NULL, 1);
43+
}
44+
EXPORT_SYMBOL_GPL(wbnoinvd_on_cpus_mask);

0 commit comments

Comments
 (0)