diff options
Diffstat (limited to 'virt/kvm/irq_comm.c')
-rw-r--r-- | virt/kvm/irq_comm.c | 19 |
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 | ||
78 | static int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, | 81 | static int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, |