diff options
| author | Gleb Natapov <gleb@redhat.com> | 2009-03-05 09:35:04 -0500 |
|---|---|---|
| committer | Avi Kivity <avi@redhat.com> | 2009-06-10 04:48:27 -0400 |
| commit | 58c2dde17d6eb6c8c0566e52d184aa16755d890f (patch) | |
| tree | a968731cbce73932decd63e00be313cebfd2f57f /arch/x86/kvm/lapic.c | |
| parent | e1035715ef8d3171e29f9c6aee6f40d57b3fead5 (diff) | |
KVM: APIC: get rid of deliver_bitmask
Deliver interrupt during destination matching loop.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Acked-by: Xiantao Zhang <xiantao.zhang@intel.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kvm/lapic.c')
| -rw-r--r-- | arch/x86/kvm/lapic.c | 59 |
1 files changed, 16 insertions, 43 deletions
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 814466f455d9..dd934d27040f 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
| @@ -199,27 +199,12 @@ EXPORT_SYMBOL_GPL(kvm_lapic_find_highest_irr); | |||
| 199 | static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode, | 199 | static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode, |
| 200 | int vector, int level, int trig_mode); | 200 | int vector, int level, int trig_mode); |
| 201 | 201 | ||
| 202 | int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 dmode, u8 trig) | 202 | int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq) |
| 203 | { | 203 | { |
| 204 | struct kvm_lapic *apic = vcpu->arch.apic; | 204 | struct kvm_lapic *apic = vcpu->arch.apic; |
| 205 | int lapic_dmode; | ||
| 206 | 205 | ||
| 207 | switch (dmode) { | 206 | return __apic_accept_irq(apic, irq->delivery_mode, irq->vector, |
| 208 | case IOAPIC_LOWEST_PRIORITY: | 207 | irq->level, irq->trig_mode); |
| 209 | lapic_dmode = APIC_DM_LOWEST; | ||
| 210 | break; | ||
| 211 | case IOAPIC_FIXED: | ||
| 212 | lapic_dmode = APIC_DM_FIXED; | ||
| 213 | break; | ||
| 214 | case IOAPIC_NMI: | ||
| 215 | lapic_dmode = APIC_DM_NMI; | ||
| 216 | break; | ||
| 217 | default: | ||
| 218 | printk(KERN_DEBUG"Ignoring delivery mode %d\n", dmode); | ||
| 219 | return 0; | ||
| 220 | break; | ||
| 221 | } | ||
| 222 | return __apic_accept_irq(apic, lapic_dmode, vec, 1, trig); | ||
| 223 | } | 208 | } |
| 224 | 209 | ||
| 225 | static inline int apic_find_highest_isr(struct kvm_lapic *apic) | 210 | static inline int apic_find_highest_isr(struct kvm_lapic *apic) |
| @@ -447,36 +432,24 @@ static void apic_send_ipi(struct kvm_lapic *apic) | |||
| 447 | { | 432 | { |
| 448 | u32 icr_low = apic_get_reg(apic, APIC_ICR); | 433 | u32 icr_low = apic_get_reg(apic, APIC_ICR); |
| 449 | u32 icr_high = apic_get_reg(apic, APIC_ICR2); | 434 | u32 icr_high = apic_get_reg(apic, APIC_ICR2); |
| 435 | struct kvm_lapic_irq irq; | ||
| 450 | 436 | ||
| 451 | unsigned int dest = GET_APIC_DEST_FIELD(icr_high); | 437 | irq.vector = icr_low & APIC_VECTOR_MASK; |
| 452 | unsigned int short_hand = icr_low & APIC_SHORT_MASK; | 438 | irq.delivery_mode = icr_low & APIC_MODE_MASK; |
| 453 | unsigned int trig_mode = icr_low & APIC_INT_LEVELTRIG; | 439 | irq.dest_mode = icr_low & APIC_DEST_MASK; |
| 454 | unsigned int level = icr_low & APIC_INT_ASSERT; | 440 | irq.level = icr_low & APIC_INT_ASSERT; |
| 455 | unsigned int dest_mode = icr_low & APIC_DEST_MASK; | 441 | irq.trig_mode = icr_low & APIC_INT_LEVELTRIG; |
| 456 | unsigned int delivery_mode = icr_low & APIC_MODE_MASK; | 442 | irq.shorthand = icr_low & APIC_SHORT_MASK; |
| 457 | unsigned int vector = icr_low & APIC_VECTOR_MASK; | 443 | irq.dest_id = GET_APIC_DEST_FIELD(icr_high); |
| 458 | |||
| 459 | DECLARE_BITMAP(deliver_bitmask, KVM_MAX_VCPUS); | ||
| 460 | int i; | ||
| 461 | 444 | ||
| 462 | apic_debug("icr_high 0x%x, icr_low 0x%x, " | 445 | apic_debug("icr_high 0x%x, icr_low 0x%x, " |
| 463 | "short_hand 0x%x, dest 0x%x, trig_mode 0x%x, level 0x%x, " | 446 | "short_hand 0x%x, dest 0x%x, trig_mode 0x%x, level 0x%x, " |
| 464 | "dest_mode 0x%x, delivery_mode 0x%x, vector 0x%x\n", | 447 | "dest_mode 0x%x, delivery_mode 0x%x, vector 0x%x\n", |
| 465 | icr_high, icr_low, short_hand, dest, | 448 | icr_high, icr_low, irq.shorthand, irq.dest, |
| 466 | trig_mode, level, dest_mode, delivery_mode, vector); | 449 | irq.trig_mode, irq.level, irq.dest_mode, irq.delivery_mode, |
| 467 | 450 | irq.vector); | |
| 468 | kvm_get_intr_delivery_bitmask(apic->vcpu->kvm, apic, dest, dest_mode, | 451 | |
| 469 | delivery_mode == APIC_DM_LOWEST, short_hand, | 452 | kvm_irq_delivery_to_apic(apic->vcpu->kvm, apic, &irq); |
| 470 | deliver_bitmask); | ||
| 471 | |||
| 472 | while ((i = find_first_bit(deliver_bitmask, KVM_MAX_VCPUS)) | ||
| 473 | < KVM_MAX_VCPUS) { | ||
| 474 | struct kvm_vcpu *vcpu = apic->vcpu->kvm->vcpus[i]; | ||
| 475 | __clear_bit(i, deliver_bitmask); | ||
| 476 | if (vcpu) | ||
| 477 | __apic_accept_irq(vcpu->arch.apic, delivery_mode, | ||
| 478 | vector, level, trig_mode); | ||
| 479 | } | ||
| 480 | } | 453 | } |
| 481 | 454 | ||
| 482 | static u32 apic_get_tmcct(struct kvm_lapic *apic) | 455 | static u32 apic_get_tmcct(struct kvm_lapic *apic) |
