|
@@ -4007,13 +4007,15 @@ int kvm_emulate_wbinvd(struct kvm_vcpu *vcpu)
|
|
return X86EMUL_CONTINUE;
|
|
return X86EMUL_CONTINUE;
|
|
|
|
|
|
if (kvm_x86_ops->has_wbinvd_exit()) {
|
|
if (kvm_x86_ops->has_wbinvd_exit()) {
|
|
- preempt_disable();
|
|
|
|
|
|
+ int cpu = get_cpu();
|
|
|
|
+
|
|
|
|
+ cpumask_set_cpu(cpu, vcpu->arch.wbinvd_dirty_mask);
|
|
smp_call_function_many(vcpu->arch.wbinvd_dirty_mask,
|
|
smp_call_function_many(vcpu->arch.wbinvd_dirty_mask,
|
|
wbinvd_ipi, NULL, 1);
|
|
wbinvd_ipi, NULL, 1);
|
|
- preempt_enable();
|
|
|
|
|
|
+ put_cpu();
|
|
cpumask_clear(vcpu->arch.wbinvd_dirty_mask);
|
|
cpumask_clear(vcpu->arch.wbinvd_dirty_mask);
|
|
- }
|
|
|
|
- wbinvd();
|
|
|
|
|
|
+ } else
|
|
|
|
+ wbinvd();
|
|
return X86EMUL_CONTINUE;
|
|
return X86EMUL_CONTINUE;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(kvm_emulate_wbinvd);
|
|
EXPORT_SYMBOL_GPL(kvm_emulate_wbinvd);
|