Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753004AbcCGPjv (ORCPT ); Mon, 7 Mar 2016 10:39:51 -0500 Received: from mx1.redhat.com ([209.132.183.28]:57388 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752413AbcCGPjl (ORCPT ); Mon, 7 Mar 2016 10:39:41 -0500 Subject: Re: [PART1 RFC v2 09/10] svm: Do not intercept CR8 when enable AVIC To: Suravee Suthikulpanit , rkrcmar@redhat.com, joro@8bytes.org, bp@alien8.de, gleb@kernel.org, alex.williamson@redhat.com References: <1457124368-2025-1-git-send-email-Suravee.Suthikulpanit@amd.com> <1457124368-2025-10-git-send-email-Suravee.Suthikulpanit@amd.com> Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, wei@redhat.com, sherry.hurwitz@amd.com From: Paolo Bonzini Message-ID: <56DDA0B7.4010709@redhat.com> Date: Mon, 7 Mar 2016 16:39:35 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <1457124368-2025-10-git-send-email-Suravee.Suthikulpanit@amd.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 07 Mar 2016 15:39:41 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1550 Lines: 49 On 04/03/2016 21:46, Suravee Suthikulpanit wrote: > + > + /* Do not do cr8 intercept if AVIC is enabled. */ No need for this comment. > + svm_x86_ops.update_cr8_intercept = NULL; > } else { > svm_x86_ops.deliver_posted_interrupt = NULL; > } > @@ -1116,7 +1119,8 @@ static void init_vmcb(struct vcpu_svm *svm) > set_cr_intercept(svm, INTERCEPT_CR0_WRITE); > set_cr_intercept(svm, INTERCEPT_CR3_WRITE); > set_cr_intercept(svm, INTERCEPT_CR4_WRITE); > - set_cr_intercept(svm, INTERCEPT_CR8_WRITE); > + if (!avic) Remember that AVIC enabled/disabled must be refreshed when the .refresh_apicv_exec_ctrl callback is invoked, so it is not enough to use the global variable. Paolo > + set_cr_intercept(svm, INTERCEPT_CR8_WRITE); > > set_dr_intercepts(svm); > > @@ -4277,7 +4281,8 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu, int tpr, int irr) > { > struct vcpu_svm *svm = to_svm(vcpu); > > - if (is_guest_mode(vcpu) && (vcpu->arch.hflags & HF_VINTR_MASK)) > + if ((is_guest_mode(vcpu) && (vcpu->arch.hflags & HF_VINTR_MASK)) || > + avic) > return; > > clr_cr_intercept(svm, INTERCEPT_CR8_WRITE); > @@ -4472,8 +4477,10 @@ static inline void sync_lapic_to_cr8(struct kvm_vcpu *vcpu) > if (is_guest_mode(vcpu) && (vcpu->arch.hflags & HF_VINTR_MASK)) > return; > > - cr8 = kvm_get_cr8(vcpu); > - svm->vmcb->control.v_tpr = cr8 & V_TPR_MASK; > + svm->vmcb->control.v_tpr = cr8 = kvm_get_cr8(vcpu) & V_TPR_MASK; > + > + if (avic) > + *(avic_get_bk_page_entry(svm, APIC_TASKPRI)) = (u32)cr8 << 4;