aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/i8254.c
diff options
context:
space:
mode:
authorMarcelo Tosatti <mtosatti@redhat.com>2009-06-04 14:08:24 -0400
committerAvi Kivity <avi@redhat.com>2009-09-10 01:32:49 -0400
commitfa40a8214bb9bcae8d49c234c19d8b4a6c1f37ff (patch)
tree6449f27072f128a1c39faaaeef1787f754345aaf /arch/x86/kvm/i8254.c
parent60eead79ad8750f80384cbe48fc44edcc78a0305 (diff)
KVM: switch irq injection/acking data structures to irq_lock
Protect irq injection/acking data structures with a separate irq_lock mutex. This fixes the following deadlock: CPU A CPU B kvm_vm_ioctl_deassign_dev_irq() mutex_lock(&kvm->lock); worker_thread() -> kvm_deassign_irq() -> kvm_assigned_dev_interrupt_work_handler() -> deassign_host_irq() mutex_lock(&kvm->lock); -> cancel_work_sync() [blocked] [gleb: fix ia64 path] Reported-by: Alex Williamson <alex.williamson@hp.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/i8254.c')
-rw-r--r--arch/x86/kvm/i8254.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
index 977af7ab8193..3837db65d33e 100644
--- a/arch/x86/kvm/i8254.c
+++ b/arch/x86/kvm/i8254.c
@@ -654,10 +654,10 @@ static void __inject_pit_timer_intr(struct kvm *kvm)
654 struct kvm_vcpu *vcpu; 654 struct kvm_vcpu *vcpu;
655 int i; 655 int i;
656 656
657 mutex_lock(&kvm->lock); 657 mutex_lock(&kvm->irq_lock);
658 kvm_set_irq(kvm, kvm->arch.vpit->irq_source_id, 0, 1); 658 kvm_set_irq(kvm, kvm->arch.vpit->irq_source_id, 0, 1);
659 kvm_set_irq(kvm, kvm->arch.vpit->irq_source_id, 0, 0); 659 kvm_set_irq(kvm, kvm->arch.vpit->irq_source_id, 0, 0);
660 mutex_unlock(&kvm->lock); 660 mutex_unlock(&kvm->irq_lock);
661 661
662 /* 662 /*
663 * Provides NMI watchdog support via Virtual Wire mode. 663 * Provides NMI watchdog support via Virtual Wire mode.