diff options
Diffstat (limited to 'drivers/kvm/ioapic.c')
-rw-r--r-- | drivers/kvm/ioapic.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/drivers/kvm/ioapic.c b/drivers/kvm/ioapic.c index cf1d50b3549b..3629867a76bc 100644 --- a/drivers/kvm/ioapic.c +++ b/drivers/kvm/ioapic.c | |||
@@ -136,7 +136,7 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val) | |||
136 | } | 136 | } |
137 | 137 | ||
138 | static void ioapic_inj_irq(struct kvm_ioapic *ioapic, | 138 | static void ioapic_inj_irq(struct kvm_ioapic *ioapic, |
139 | struct kvm_lapic *target, | 139 | struct kvm_vcpu *vcpu, |
140 | u8 vector, u8 trig_mode, u8 delivery_mode) | 140 | u8 vector, u8 trig_mode, u8 delivery_mode) |
141 | { | 141 | { |
142 | ioapic_debug("irq %d trig %d deliv %d\n", vector, trig_mode, | 142 | ioapic_debug("irq %d trig %d deliv %d\n", vector, trig_mode, |
@@ -145,7 +145,7 @@ static void ioapic_inj_irq(struct kvm_ioapic *ioapic, | |||
145 | ASSERT((delivery_mode == dest_Fixed) || | 145 | ASSERT((delivery_mode == dest_Fixed) || |
146 | (delivery_mode == dest_LowestPrio)); | 146 | (delivery_mode == dest_LowestPrio)); |
147 | 147 | ||
148 | kvm_apic_set_irq(target, vector, trig_mode); | 148 | kvm_apic_set_irq(vcpu, vector, trig_mode); |
149 | } | 149 | } |
150 | 150 | ||
151 | static u32 ioapic_get_delivery_bitmask(struct kvm_ioapic *ioapic, u8 dest, | 151 | static u32 ioapic_get_delivery_bitmask(struct kvm_ioapic *ioapic, u8 dest, |
@@ -196,7 +196,6 @@ static void ioapic_deliver(struct kvm_ioapic *ioapic, int irq) | |||
196 | u8 vector = ioapic->redirtbl[irq].fields.vector; | 196 | u8 vector = ioapic->redirtbl[irq].fields.vector; |
197 | u8 trig_mode = ioapic->redirtbl[irq].fields.trig_mode; | 197 | u8 trig_mode = ioapic->redirtbl[irq].fields.trig_mode; |
198 | u32 deliver_bitmask; | 198 | u32 deliver_bitmask; |
199 | struct kvm_lapic *target; | ||
200 | struct kvm_vcpu *vcpu; | 199 | struct kvm_vcpu *vcpu; |
201 | int vcpu_id; | 200 | int vcpu_id; |
202 | 201 | ||
@@ -212,13 +211,13 @@ static void ioapic_deliver(struct kvm_ioapic *ioapic, int irq) | |||
212 | 211 | ||
213 | switch (delivery_mode) { | 212 | switch (delivery_mode) { |
214 | case dest_LowestPrio: | 213 | case dest_LowestPrio: |
215 | target = | 214 | vcpu = kvm_get_lowest_prio_vcpu(ioapic->kvm, vector, |
216 | kvm_apic_round_robin(ioapic->kvm, vector, deliver_bitmask); | 215 | deliver_bitmask); |
217 | if (target != NULL) | 216 | if (vcpu != NULL) |
218 | ioapic_inj_irq(ioapic, target, vector, | 217 | ioapic_inj_irq(ioapic, vcpu, vector, |
219 | trig_mode, delivery_mode); | 218 | trig_mode, delivery_mode); |
220 | else | 219 | else |
221 | ioapic_debug("null round robin: " | 220 | ioapic_debug("null lowest prio vcpu: " |
222 | "mask=%x vector=%x delivery_mode=%x\n", | 221 | "mask=%x vector=%x delivery_mode=%x\n", |
223 | deliver_bitmask, vector, dest_LowestPrio); | 222 | deliver_bitmask, vector, dest_LowestPrio); |
224 | break; | 223 | break; |
@@ -229,8 +228,7 @@ static void ioapic_deliver(struct kvm_ioapic *ioapic, int irq) | |||
229 | deliver_bitmask &= ~(1 << vcpu_id); | 228 | deliver_bitmask &= ~(1 << vcpu_id); |
230 | vcpu = ioapic->kvm->vcpus[vcpu_id]; | 229 | vcpu = ioapic->kvm->vcpus[vcpu_id]; |
231 | if (vcpu) { | 230 | if (vcpu) { |
232 | target = vcpu->apic; | 231 | ioapic_inj_irq(ioapic, vcpu, vector, |
233 | ioapic_inj_irq(ioapic, target, vector, | ||
234 | trig_mode, delivery_mode); | 232 | trig_mode, delivery_mode); |
235 | } | 233 | } |
236 | } | 234 | } |