aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86.c
diff options
context:
space:
mode:
authorSheng Yang <sheng@linux.intel.com>2008-10-15 08:15:06 -0400
committerAvi Kivity <avi@redhat.com>2008-10-28 08:21:34 -0400
commit5550af4df179e52753d3a43a788a113ad8cd95cd (patch)
treef19274a4f7e345e70e7da713f44c1dcccdb134e8 /arch/x86/kvm/x86.c
parent6ad9f15c94822c3f067a7d443f3b414e08b34460 (diff)
KVM: Fix guest shared interrupt with in-kernel irqchip
Every call of kvm_set_irq() should offer an irq_source_id, which is allocated by kvm_request_irq_source_id(). Based on irq_source_id, we identify the irq source and implement logical OR for shared level interrupts. The allocated irq_source_id can be freed by kvm_free_irq_source_id(). Currently, we support at most sizeof(unsigned long) different irq sources. [Amit: - rebase to kvm.git HEAD - move definition of KVM_USERSPACE_IRQ_SOURCE_ID to common file - move kvm_request_irq_source_id to the update_irq ioctl] [Xiantao: - Add kvm/ia64 stuff and make it work for kvm/ia64 guests] Signed-off-by: Sheng Yang <sheng@linux.intel.com> Signed-off-by: Amit Shah <amit.shah@redhat.com> Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r--arch/x86/kvm/x86.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 4f0677d1eae8..f1f8ff2f1fa2 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1742,7 +1742,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
1742 goto out; 1742 goto out;
1743 if (irqchip_in_kernel(kvm)) { 1743 if (irqchip_in_kernel(kvm)) {
1744 mutex_lock(&kvm->lock); 1744 mutex_lock(&kvm->lock);
1745 kvm_set_irq(kvm, irq_event.irq, irq_event.level); 1745 kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID,
1746 irq_event.irq, irq_event.level);
1746 mutex_unlock(&kvm->lock); 1747 mutex_unlock(&kvm->lock);
1747 r = 0; 1748 r = 0;
1748 } 1749 }
@@ -4013,6 +4014,9 @@ struct kvm *kvm_arch_create_vm(void)
4013 INIT_LIST_HEAD(&kvm->arch.active_mmu_pages); 4014 INIT_LIST_HEAD(&kvm->arch.active_mmu_pages);
4014 INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); 4015 INIT_LIST_HEAD(&kvm->arch.assigned_dev_head);
4015 4016
4017 /* Reserve bit 0 of irq_sources_bitmap for userspace irq source */
4018 set_bit(KVM_USERSPACE_IRQ_SOURCE_ID, &kvm->arch.irq_sources_bitmap);
4019
4016 return kvm; 4020 return kvm;
4017} 4021}
4018 4022