diff options
author | Alex Williamson <alex.williamson@redhat.com> | 2012-09-21 13:58:03 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-09-23 07:50:15 -0400 |
commit | 7a84428af7ca6a847f058c9ff244a18a2664fd1b (patch) | |
tree | e6c573c701736a75d618b670d66e98398b62769f /virt/kvm/irq_comm.c | |
parent | 1e08ec4a130e2745d96df169e67c58df98a07311 (diff) |
KVM: Add resampling irqfds for level triggered interrupts
To emulate level triggered interrupts, add a resample option to
KVM_IRQFD. When specified, a new resamplefd is provided that notifies
the user when the irqchip has been resampled by the VM. This may, for
instance, indicate an EOI. Also in this mode, posting of an interrupt
through an irqfd only asserts the interrupt. On resampling, the
interrupt is automatically de-asserted prior to user notification.
This enables level triggered interrupts to be posted and re-enabled
from vfio with no userspace intervention.
All resampling irqfds can make use of a single irq source ID, so we
reserve a new one for this interface.
Signed-off-by: Alex Williamson <alex.williamson@redhat.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 | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c index 3ca89c451d6b..2eb58af7ee99 100644 --- a/virt/kvm/irq_comm.c +++ b/virt/kvm/irq_comm.c | |||
@@ -228,6 +228,9 @@ int kvm_request_irq_source_id(struct kvm *kvm) | |||
228 | } | 228 | } |
229 | 229 | ||
230 | ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID); | 230 | ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID); |
231 | #ifdef CONFIG_X86 | ||
232 | ASSERT(irq_source_id != KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID); | ||
233 | #endif | ||
231 | set_bit(irq_source_id, bitmap); | 234 | set_bit(irq_source_id, bitmap); |
232 | unlock: | 235 | unlock: |
233 | mutex_unlock(&kvm->irq_lock); | 236 | mutex_unlock(&kvm->irq_lock); |
@@ -238,6 +241,9 @@ unlock: | |||
238 | void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id) | 241 | void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id) |
239 | { | 242 | { |
240 | ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID); | 243 | ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID); |
244 | #ifdef CONFIG_X86 | ||
245 | ASSERT(irq_source_id != KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID); | ||
246 | #endif | ||
241 | 247 | ||
242 | mutex_lock(&kvm->irq_lock); | 248 | mutex_lock(&kvm->irq_lock); |
243 | if (irq_source_id < 0 || | 249 | if (irq_source_id < 0 || |