Re: [PATCH v4] KVM: VMX: Execute WBINVD to keep data consistency with assigned devices

Avi Kivity
2010-06-28T09:35:15Z

On 06/28/2010 12:31 PM, Gleb Natapov wrote:
> On Mon, Jun 28, 2010 at 12:27:22PM +0300, Avi Kivity wrote:
>
>> nOn 06/28/2010 11:42 AM, Sheng Yang wrote:
>>
>>> 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.
>>>
>>>
>>> +int kvm_emulate_wbinvd(struct kvm_vcpu *vcpu)
>>> +{
>>> + if (need_emulate_wbinvd(vcpu)&& kvm_x86_ops->has_wbinvd_exit()) {
>>> + smp_call_function_many(vcpu->arch.wbinvd_dirty_mask,
>>> + wbinvd_ipi, NULL, 1);
>>> + cpumask_clear(vcpu->arch.wbinvd_dirty_mask);
>>> + } else
>>> + wbinvd();
>>> + return X86EMUL_CONTINUE;
>>> +}
>>> +EXPORT_SYMBOL_GPL(kvm_emulate_wbinvd);
>>>
>> Why check for has_wbinvd_exit()? If it's false, we don't get here anyway.
>>
>> If !need_emulate_wbinvd(), why call wbinvd()?
>>
>>
>>
> The function is called from emulator too. I guess that is why.
>

Ah, yes. But it needs to return, if !n_e_wbinvd(), not call wbinvd().

--
error compiling committee.c: too many arguments to function