diff options
Diffstat (limited to 'arch/x86/kvm/lapic.c')
-rw-r--r-- | arch/x86/kvm/lapic.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 7024224f0fc8..ba8c045da782 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #include <asm/current.h> | 32 | #include <asm/current.h> |
33 | #include <asm/apicdef.h> | 33 | #include <asm/apicdef.h> |
34 | #include <asm/atomic.h> | 34 | #include <asm/atomic.h> |
35 | #include <asm/apicdef.h> | ||
36 | #include "kvm_cache_regs.h" | 35 | #include "kvm_cache_regs.h" |
37 | #include "irq.h" | 36 | #include "irq.h" |
38 | #include "trace.h" | 37 | #include "trace.h" |
@@ -374,6 +373,12 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode, | |||
374 | if (unlikely(!apic_enabled(apic))) | 373 | if (unlikely(!apic_enabled(apic))) |
375 | break; | 374 | break; |
376 | 375 | ||
376 | if (trig_mode) { | ||
377 | apic_debug("level trig mode for vector %d", vector); | ||
378 | apic_set_vector(vector, apic->regs + APIC_TMR); | ||
379 | } else | ||
380 | apic_clear_vector(vector, apic->regs + APIC_TMR); | ||
381 | |||
377 | result = !apic_test_and_set_irr(vector, apic); | 382 | result = !apic_test_and_set_irr(vector, apic); |
378 | trace_kvm_apic_accept_irq(vcpu->vcpu_id, delivery_mode, | 383 | trace_kvm_apic_accept_irq(vcpu->vcpu_id, delivery_mode, |
379 | trig_mode, vector, !result); | 384 | trig_mode, vector, !result); |
@@ -384,11 +389,6 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode, | |||
384 | break; | 389 | break; |
385 | } | 390 | } |
386 | 391 | ||
387 | if (trig_mode) { | ||
388 | apic_debug("level trig mode for vector %d", vector); | ||
389 | apic_set_vector(vector, apic->regs + APIC_TMR); | ||
390 | } else | ||
391 | apic_clear_vector(vector, apic->regs + APIC_TMR); | ||
392 | kvm_vcpu_kick(vcpu); | 392 | kvm_vcpu_kick(vcpu); |
393 | break; | 393 | break; |
394 | 394 | ||
@@ -471,11 +471,8 @@ static void apic_set_eoi(struct kvm_lapic *apic) | |||
471 | trigger_mode = IOAPIC_LEVEL_TRIG; | 471 | trigger_mode = IOAPIC_LEVEL_TRIG; |
472 | else | 472 | else |
473 | trigger_mode = IOAPIC_EDGE_TRIG; | 473 | trigger_mode = IOAPIC_EDGE_TRIG; |
474 | if (!(apic_get_reg(apic, APIC_SPIV) & APIC_SPIV_DIRECTED_EOI)) { | 474 | if (!(apic_get_reg(apic, APIC_SPIV) & APIC_SPIV_DIRECTED_EOI)) |
475 | mutex_lock(&apic->vcpu->kvm->irq_lock); | ||
476 | kvm_ioapic_update_eoi(apic->vcpu->kvm, vector, trigger_mode); | 475 | kvm_ioapic_update_eoi(apic->vcpu->kvm, vector, trigger_mode); |
477 | mutex_unlock(&apic->vcpu->kvm->irq_lock); | ||
478 | } | ||
479 | } | 476 | } |
480 | 477 | ||
481 | static void apic_send_ipi(struct kvm_lapic *apic) | 478 | static void apic_send_ipi(struct kvm_lapic *apic) |
@@ -504,9 +501,7 @@ static void apic_send_ipi(struct kvm_lapic *apic) | |||
504 | irq.trig_mode, irq.level, irq.dest_mode, irq.delivery_mode, | 501 | irq.trig_mode, irq.level, irq.dest_mode, irq.delivery_mode, |
505 | irq.vector); | 502 | irq.vector); |
506 | 503 | ||
507 | mutex_lock(&apic->vcpu->kvm->irq_lock); | ||
508 | kvm_irq_delivery_to_apic(apic->vcpu->kvm, apic, &irq); | 504 | kvm_irq_delivery_to_apic(apic->vcpu->kvm, apic, &irq); |
509 | mutex_unlock(&apic->vcpu->kvm->irq_lock); | ||
510 | } | 505 | } |
511 | 506 | ||
512 | static u32 apic_get_tmcct(struct kvm_lapic *apic) | 507 | static u32 apic_get_tmcct(struct kvm_lapic *apic) |
@@ -521,7 +516,7 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic) | |||
521 | if (apic_get_reg(apic, APIC_TMICT) == 0) | 516 | if (apic_get_reg(apic, APIC_TMICT) == 0) |
522 | return 0; | 517 | return 0; |
523 | 518 | ||
524 | remaining = hrtimer_expires_remaining(&apic->lapic_timer.timer); | 519 | remaining = hrtimer_get_remaining(&apic->lapic_timer.timer); |
525 | if (ktime_to_ns(remaining) < 0) | 520 | if (ktime_to_ns(remaining) < 0) |
526 | remaining = ktime_set(0, 0); | 521 | remaining = ktime_set(0, 0); |
527 | 522 | ||
@@ -1156,6 +1151,7 @@ void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu) | |||
1156 | hrtimer_cancel(&apic->lapic_timer.timer); | 1151 | hrtimer_cancel(&apic->lapic_timer.timer); |
1157 | update_divide_count(apic); | 1152 | update_divide_count(apic); |
1158 | start_apic_timer(apic); | 1153 | start_apic_timer(apic); |
1154 | apic->irr_pending = true; | ||
1159 | } | 1155 | } |
1160 | 1156 | ||
1161 | void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu) | 1157 | void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu) |