aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/irq_comm.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/irq_comm.c')
-rw-r--r--virt/kvm/irq_comm.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c
index e43701c0a5c4..f5e059b67cd4 100644
--- a/virt/kvm/irq_comm.c
+++ b/virt/kvm/irq_comm.c
@@ -47,7 +47,7 @@ void kvm_get_intr_delivery_bitmask(struct kvm *kvm, struct kvm_lapic *src,
47 int dest_id, int dest_mode, bool low_prio, int short_hand, 47 int dest_id, int dest_mode, bool low_prio, int short_hand,
48 unsigned long *deliver_bitmask) 48 unsigned long *deliver_bitmask)
49{ 49{
50 int i; 50 int i, lowest = -1;
51 struct kvm_vcpu *vcpu; 51 struct kvm_vcpu *vcpu;
52 52
53 if (dest_mode == 0 && dest_id == 0xff && low_prio) 53 if (dest_mode == 0 && dest_id == 0xff && low_prio)
@@ -64,15 +64,18 @@ void kvm_get_intr_delivery_bitmask(struct kvm *kvm, struct kvm_lapic *src,
64 dest_mode)) 64 dest_mode))
65 continue; 65 continue;
66 66
67 __set_bit(i, deliver_bitmask); 67 if (!low_prio) {
68 __set_bit(i, deliver_bitmask);
69 } else {
70 if (lowest < 0)
71 lowest = i;
72 if (kvm_apic_compare_prio(vcpu, kvm->vcpus[lowest]) < 0)
73 lowest = i;
74 }
68 } 75 }
69 76
70 if (low_prio) { 77 if (lowest != -1)
71 vcpu = kvm_get_lowest_prio_vcpu(kvm, 0, deliver_bitmask); 78 __set_bit(lowest, deliver_bitmask);
72 bitmap_zero(deliver_bitmask, KVM_MAX_VCPUS);
73 if (vcpu)
74 __set_bit(vcpu->vcpu_id, deliver_bitmask);
75 }
76} 79}
77 80
78static int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, 81static int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,