]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
KVM: x86: Optimization: Create SVM stubs for sync_pir_to_irr()
authorLiran Alon <liran.alon@oracle.com>
Sun, 24 Dec 2017 16:12:53 +0000 (18:12 +0200)
committerRadim Krčmář <rkrcmar@redhat.com>
Tue, 16 Jan 2018 15:40:09 +0000 (16:40 +0100)
sync_pir_to_irr() is only called if vcpu->arch.apicv_active()==true.
In case it is false, VMX code make sure to set sync_pir_to_irr
to NULL.

Therefore, having SVM stubs allows to remove check for if
sync_pir_to_irr != NULL from all calling sites.

Signed-off-by: Liran Alon <liran.alon@oracle.com>
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Nikita Leshenko <nikita.leshchenko@oracle.com>
Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
[Return highest IRR in the SVM case. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
arch/x86/kvm/lapic.c
arch/x86/kvm/svm.c
arch/x86/kvm/x86.c

index e2c1fb8d35cea28af684d4ba76d70a5e2e12e9a5..0928608750e371da0d0411efd098dbbec38a2491 100644 (file)
@@ -581,7 +581,7 @@ static void pv_eoi_clr_pending(struct kvm_vcpu *vcpu)
 static int apic_has_interrupt_for_ppr(struct kvm_lapic *apic, u32 ppr)
 {
        int highest_irr;
-       if (kvm_x86_ops->sync_pir_to_irr && apic->vcpu->arch.apicv_active)
+       if (apic->vcpu->arch.apicv_active)
                highest_irr = kvm_x86_ops->sync_pir_to_irr(apic->vcpu);
        else
                highest_irr = apic_find_highest_irr(apic);
index 5d83f0474020c5f669273179c2f191fccb405ee7..b613d331d0310e1d9acdb30a01d9182236cc761a 100644 (file)
@@ -6740,6 +6740,7 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = {
        .load_eoi_exitmap = svm_load_eoi_exitmap,
        .hwapic_irr_update = svm_hwapic_irr_update,
        .hwapic_isr_update = svm_hwapic_isr_update,
+       .sync_pir_to_irr = kvm_lapic_find_highest_irr,
        .apicv_post_state_restore = avic_post_state_restore,
 
        .set_tss_addr = svm_set_tss_addr,
index 6d2e1459adc97963410893bbbca0cb64539879b2..0204b2b8a293f10633a725e9f21f34f178fe5a7a 100644 (file)
@@ -2973,7 +2973,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
 static int kvm_vcpu_ioctl_get_lapic(struct kvm_vcpu *vcpu,
                                    struct kvm_lapic_state *s)
 {
-       if (kvm_x86_ops->sync_pir_to_irr && vcpu->arch.apicv_active)
+       if (vcpu->arch.apicv_active)
                kvm_x86_ops->sync_pir_to_irr(vcpu);
 
        return kvm_apic_get_state(vcpu, s);
@@ -6820,7 +6820,7 @@ static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu)
        if (irqchip_split(vcpu->kvm))
                kvm_scan_ioapic_routes(vcpu, vcpu->arch.ioapic_handled_vectors);
        else {
-               if (kvm_x86_ops->sync_pir_to_irr && vcpu->arch.apicv_active)
+               if (vcpu->arch.apicv_active)
                        kvm_x86_ops->sync_pir_to_irr(vcpu);
                kvm_ioapic_scan_entry(vcpu, vcpu->arch.ioapic_handled_vectors);
        }
@@ -7046,10 +7046,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
         * This handles the case where a posted interrupt was
         * notified with kvm_vcpu_kick.
         */
-       if (kvm_lapic_enabled(vcpu)) {
-               if (kvm_x86_ops->sync_pir_to_irr && vcpu->arch.apicv_active)
-                       kvm_x86_ops->sync_pir_to_irr(vcpu);
-       }
+       if (kvm_lapic_enabled(vcpu) && vcpu->arch.apicv_active)
+               kvm_x86_ops->sync_pir_to_irr(vcpu);
 
        if (vcpu->mode == EXITING_GUEST_MODE || kvm_request_pending(vcpu)
            || need_resched() || signal_pending(current)) {