diff options
author | Sheng Yang <sheng@linux.intel.com> | 2008-10-15 08:15:06 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2008-10-28 08:21:34 -0400 |
commit | 5550af4df179e52753d3a43a788a113ad8cd95cd (patch) | |
tree | f19274a4f7e345e70e7da713f44c1dcccdb134e8 /arch/ia64 | |
parent | 6ad9f15c94822c3f067a7d443f3b414e08b34460 (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/ia64')
-rw-r--r-- | arch/ia64/include/asm/kvm_host.h | 3 | ||||
-rw-r--r-- | arch/ia64/kvm/kvm-ia64.c | 8 |
2 files changed, 8 insertions, 3 deletions
diff --git a/arch/ia64/include/asm/kvm_host.h b/arch/ia64/include/asm/kvm_host.h index 85db124d37f6..04c0b88f7b3a 100644 --- a/arch/ia64/include/asm/kvm_host.h +++ b/arch/ia64/include/asm/kvm_host.h | |||
@@ -417,6 +417,9 @@ struct kvm_arch { | |||
417 | struct list_head assigned_dev_head; | 417 | struct list_head assigned_dev_head; |
418 | struct dmar_domain *intel_iommu_domain; | 418 | struct dmar_domain *intel_iommu_domain; |
419 | struct hlist_head irq_ack_notifier_list; | 419 | struct hlist_head irq_ack_notifier_list; |
420 | |||
421 | unsigned long irq_sources_bitmap; | ||
422 | unsigned long irq_states[KVM_IOAPIC_NUM_PINS]; | ||
420 | }; | 423 | }; |
421 | 424 | ||
422 | union cpuid3_t { | 425 | union cpuid3_t { |
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index a312c9e9b9ef..8a2b13ff0aff 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c | |||
@@ -778,6 +778,9 @@ static void kvm_init_vm(struct kvm *kvm) | |||
778 | kvm_build_io_pmt(kvm); | 778 | kvm_build_io_pmt(kvm); |
779 | 779 | ||
780 | INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); | 780 | INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); |
781 | |||
782 | /* Reserve bit 0 of irq_sources_bitmap for userspace irq source */ | ||
783 | set_bit(KVM_USERSPACE_IRQ_SOURCE_ID, &kvm->arch.irq_sources_bitmap); | ||
781 | } | 784 | } |
782 | 785 | ||
783 | struct kvm *kvm_arch_create_vm(void) | 786 | struct kvm *kvm_arch_create_vm(void) |
@@ -941,9 +944,8 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
941 | goto out; | 944 | goto out; |
942 | if (irqchip_in_kernel(kvm)) { | 945 | if (irqchip_in_kernel(kvm)) { |
943 | mutex_lock(&kvm->lock); | 946 | mutex_lock(&kvm->lock); |
944 | kvm_ioapic_set_irq(kvm->arch.vioapic, | 947 | kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, |
945 | irq_event.irq, | 948 | irq_event.irq, irq_event.level); |
946 | irq_event.level); | ||
947 | mutex_unlock(&kvm->lock); | 949 | mutex_unlock(&kvm->lock); |
948 | r = 0; | 950 | r = 0; |
949 | } | 951 | } |