KVM: VMX: Execute WBINVD to keep data consistency with assigned devices
Some guest device driver may leverage the "Non-Snoop" I/O, and explicitly WBINVD or CLFLUSH to a RAM space. Since migration may occur before WBINVD or CLFLUSH, we need to maintain data consistency either by: 1: flushing cache (wbinvd) when the guest is scheduled out if there is no wbinvd exit, or 2: execute wbinvd on all dirty physical CPUs when guest wbinvd exits. Signed-off-by: Yaozu (Eddie) Dong <eddie.dong@intel.com> Signed-off-by: Sheng Yang <sheng@linux.intel.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
@@ -412,6 +412,12 @@ static inline bool cpu_has_virtual_nmis(void)
|
||||
return vmcs_config.pin_based_exec_ctrl & PIN_BASED_VIRTUAL_NMIS;
|
||||
}
|
||||
|
||||
static inline bool cpu_has_vmx_wbinvd_exit(void)
|
||||
{
|
||||
return vmcs_config.cpu_based_2nd_exec_ctrl &
|
||||
SECONDARY_EXEC_WBINVD_EXITING;
|
||||
}
|
||||
|
||||
static inline bool report_flexpriority(void)
|
||||
{
|
||||
return flexpriority_enabled;
|
||||
@@ -3397,7 +3403,7 @@ static int handle_invlpg(struct kvm_vcpu *vcpu)
|
||||
static int handle_wbinvd(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
skip_emulated_instruction(vcpu);
|
||||
/* TODO: Add support for VT-d/pass-through device */
|
||||
kvm_emulate_wbinvd(vcpu);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -4347,6 +4353,8 @@ static struct kvm_x86_ops vmx_x86_ops = {
|
||||
.rdtscp_supported = vmx_rdtscp_supported,
|
||||
|
||||
.set_supported_cpuid = vmx_set_supported_cpuid,
|
||||
|
||||
.has_wbinvd_exit = cpu_has_vmx_wbinvd_exit,
|
||||
};
|
||||
|
||||
static int __init vmx_init(void)
|
||||
|
Reference in New Issue
Block a user