From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH v4] KVM: VMX: Execute WBINVD to keep data consistency with assigned devices Date: Mon, 28 Jun 2010 12:35:10 +0300 Message-ID: <4C286CCE.10309@redhat.com> References: <4C285842.3060406@redhat.com> <1277714558-6451-1-git-send-email-sheng@linux.intel.com> <4C286AFA.9010802@redhat.com> <20100628093159.GH4689@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Sheng Yang , Marcelo Tosatti , Jan Kiszka , kvm@vger.kernel.org, "Yaozu (Eddie) Dong" To: Gleb Natapov Return-path: Received: from mx1.redhat.com ([209.132.183.28]:59383 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751036Ab0F1JfP (ORCPT ); Mon, 28 Jun 2010 05:35:15 -0400 In-Reply-To: <20100628093159.GH4689@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: 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