From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 4/5] KVM: Lazify fpu activation and deactivation Date: Wed, 06 Jan 2010 08:21:54 +0200 Message-ID: <4B442C02.3070105@redhat.com> References: <1262190342-18611-1-git-send-email-avi@redhat.com> <1262190342-18611-5-git-send-email-avi@redhat.com> <20100106002529.GA11233@amt.cnet> <4B4400F5.2010309@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Sheng Yang , Joerg Roedel , kvm@vger.kernel.org To: Marcelo Tosatti Return-path: Received: from mx1.redhat.com ([209.132.183.28]:48394 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751314Ab0AFGWE (ORCPT ); Wed, 6 Jan 2010 01:22:04 -0500 In-Reply-To: <4B4400F5.2010309@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 01/06/2010 05:18 AM, Avi Kivity wrote: >>> +static void svm_fpu_deactivate(struct kvm_vcpu *vcpu) >>> +{ >>> + struct vcpu_svm *svm = to_svm(vcpu); >>> + >>> + if (npt_enabled) { >>> + /* hack: npt requires active fpu at this time */ >>> + vcpu->fpu_active = 1; >>> + return; >>> + } >> Why is that ? > > A guest context switch will involve setting cr0.ts and possibly > issuing clts after the fpu is first used: > > _switch_to() > unlazy_fpu() > stts() > > So we will get an exit on cr0 writes on every guest context switch > until the fpu is loaded. vmx avoids this by allowing writes that > don't change important bits to proceed. > > Hmm, I see the write is conditional, so it may not be as bad as > that. We'll have to test other guests to make sure they all do > conditional stts(). It can be done. If we see a cr0 write that doesn't change cr0, we can assume it's an stts(), load the guest fpu, and turn on selective cr0 intercepts. So the net effect will be: - guests which only stts() when cr0.ts is clear will behave much like vmx - guests which stts() unconditionally will see one extra exit and then load the fpu, like current behaviour The only tricky bit is guests with cr0.wp=0 when npt is disabled, we have to keep cr0 intercepts there. But that's fine. I'll write a patch. -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain.