diff options
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r-- | arch/x86/kvm/i8254.c | 15 | ||||
-rw-r--r-- | arch/x86/kvm/i8254.h | 1 |
2 files changed, 16 insertions, 0 deletions
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 69d1bbff3fd3..c13bb92d3157 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c | |||
@@ -539,6 +539,16 @@ void kvm_pit_reset(struct kvm_pit *pit) | |||
539 | pit->pit_state.irq_ack = 1; | 539 | pit->pit_state.irq_ack = 1; |
540 | } | 540 | } |
541 | 541 | ||
542 | static void pit_mask_notifer(struct kvm_irq_mask_notifier *kimn, bool mask) | ||
543 | { | ||
544 | struct kvm_pit *pit = container_of(kimn, struct kvm_pit, mask_notifier); | ||
545 | |||
546 | if (!mask) { | ||
547 | atomic_set(&pit->pit_state.pit_timer.pending, 0); | ||
548 | pit->pit_state.irq_ack = 1; | ||
549 | } | ||
550 | } | ||
551 | |||
542 | struct kvm_pit *kvm_create_pit(struct kvm *kvm) | 552 | struct kvm_pit *kvm_create_pit(struct kvm *kvm) |
543 | { | 553 | { |
544 | struct kvm_pit *pit; | 554 | struct kvm_pit *pit; |
@@ -586,6 +596,9 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm) | |||
586 | 596 | ||
587 | kvm_pit_reset(pit); | 597 | kvm_pit_reset(pit); |
588 | 598 | ||
599 | pit->mask_notifier.func = pit_mask_notifer; | ||
600 | kvm_register_irq_mask_notifier(kvm, 0, &pit->mask_notifier); | ||
601 | |||
589 | return pit; | 602 | return pit; |
590 | } | 603 | } |
591 | 604 | ||
@@ -594,6 +607,8 @@ void kvm_free_pit(struct kvm *kvm) | |||
594 | struct hrtimer *timer; | 607 | struct hrtimer *timer; |
595 | 608 | ||
596 | if (kvm->arch.vpit) { | 609 | if (kvm->arch.vpit) { |
610 | kvm_unregister_irq_mask_notifier(kvm, 0, | ||
611 | &kvm->arch.vpit->mask_notifier); | ||
597 | mutex_lock(&kvm->arch.vpit->pit_state.lock); | 612 | mutex_lock(&kvm->arch.vpit->pit_state.lock); |
598 | timer = &kvm->arch.vpit->pit_state.pit_timer.timer; | 613 | timer = &kvm->arch.vpit->pit_state.pit_timer.timer; |
599 | hrtimer_cancel(timer); | 614 | hrtimer_cancel(timer); |
diff --git a/arch/x86/kvm/i8254.h b/arch/x86/kvm/i8254.h index 76959c4b500e..6acbe4b505d5 100644 --- a/arch/x86/kvm/i8254.h +++ b/arch/x86/kvm/i8254.h | |||
@@ -46,6 +46,7 @@ struct kvm_pit { | |||
46 | struct kvm *kvm; | 46 | struct kvm *kvm; |
47 | struct kvm_kpit_state pit_state; | 47 | struct kvm_kpit_state pit_state; |
48 | int irq_source_id; | 48 | int irq_source_id; |
49 | struct kvm_irq_mask_notifier mask_notifier; | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | #define KVM_PIT_BASE_ADDRESS 0x40 | 52 | #define KVM_PIT_BASE_ADDRESS 0x40 |