aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kvm/lapic.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index d67206a7b99a..629af0f1c5c4 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -683,8 +683,7 @@ bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src,
683 unsigned long bitmap = 1; 683 unsigned long bitmap = 1;
684 struct kvm_lapic **dst; 684 struct kvm_lapic **dst;
685 int i; 685 int i;
686 bool ret = false; 686 bool ret, x2apic_ipi;
687 bool x2apic_ipi = src && apic_x2apic_mode(src);
688 687
689 *r = -1; 688 *r = -1;
690 689
@@ -696,16 +695,18 @@ bool kvm_irq_delivery_to_apic_fast(struct kvm *kvm, struct kvm_lapic *src,
696 if (irq->shorthand) 695 if (irq->shorthand)
697 return false; 696 return false;
698 697
698 x2apic_ipi = src && apic_x2apic_mode(src);
699 if (irq->dest_id == (x2apic_ipi ? X2APIC_BROADCAST : APIC_BROADCAST)) 699 if (irq->dest_id == (x2apic_ipi ? X2APIC_BROADCAST : APIC_BROADCAST))
700 return false; 700 return false;
701 701
702 ret = true;
702 rcu_read_lock(); 703 rcu_read_lock();
703 map = rcu_dereference(kvm->arch.apic_map); 704 map = rcu_dereference(kvm->arch.apic_map);
704 705
705 if (!map) 706 if (!map) {
707 ret = false;
706 goto out; 708 goto out;
707 709 }
708 ret = true;
709 710
710 if (irq->dest_mode == APIC_DEST_PHYSICAL) { 711 if (irq->dest_mode == APIC_DEST_PHYSICAL) {
711 if (irq->dest_id >= ARRAY_SIZE(map->phys_map)) 712 if (irq->dest_id >= ARRAY_SIZE(map->phys_map))