diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2012-03-29 15:14:12 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-04-24 08:59:47 -0400 |
commit | 07975ad3b30579ca27d880491ad992326b930c63 (patch) | |
tree | fea166a02c387949a09a948a51781074bdc9ed68 /virt/kvm/irq_comm.c | |
parent | 1f15d10984c854e077da5aa1a23f901496b49773 (diff) |
KVM: Introduce direct MSI message injection for in-kernel irqchips
Currently, MSI messages can only be injected to in-kernel irqchips by
defining a corresponding IRQ route for each message. This is not only
unhandy if the MSI messages are generated "on the fly" by user space,
IRQ routes are a limited resource that user space has to manage
carefully.
By providing a direct injection path, we can both avoid using up limited
resources and simplify the necessary steps for user land.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'virt/kvm/irq_comm.c')
-rw-r--r-- | virt/kvm/irq_comm.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c index 9f614b4e365f..a6a0365475ed 100644 --- a/virt/kvm/irq_comm.c +++ b/virt/kvm/irq_comm.c | |||
@@ -138,6 +138,20 @@ int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, | |||
138 | return kvm_irq_delivery_to_apic(kvm, NULL, &irq); | 138 | return kvm_irq_delivery_to_apic(kvm, NULL, &irq); |
139 | } | 139 | } |
140 | 140 | ||
141 | int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi) | ||
142 | { | ||
143 | struct kvm_kernel_irq_routing_entry route; | ||
144 | |||
145 | if (!irqchip_in_kernel(kvm) || msi->flags != 0) | ||
146 | return -EINVAL; | ||
147 | |||
148 | route.msi.address_lo = msi->address_lo; | ||
149 | route.msi.address_hi = msi->address_hi; | ||
150 | route.msi.data = msi->data; | ||
151 | |||
152 | return kvm_set_msi(&route, kvm, KVM_USERSPACE_IRQ_SOURCE_ID, 1); | ||
153 | } | ||
154 | |||
141 | /* | 155 | /* |
142 | * Return value: | 156 | * Return value: |
143 | * < 0 Interrupt was ignored (masked or not delivered for other reasons) | 157 | * < 0 Interrupt was ignored (masked or not delivered for other reasons) |