aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/kvm/ioapic.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/kvm/ioapic.c')
-rw-r--r--drivers/kvm/ioapic.c18
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
138static void ioapic_inj_irq(struct kvm_ioapic *ioapic, 138static 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
151static u32 ioapic_get_delivery_bitmask(struct kvm_ioapic *ioapic, u8 dest, 151static 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 }