diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2010-11-16 16:30:03 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-01-12 04:29:20 -0500 |
commit | 0645211c43df0b96c51e12980066b3227e10b164 (patch) | |
tree | 2c23ea65e07b9481681eb6bb7cc5d7d2fa109917 /include/linux/kvm_host.h | |
parent | 0c106b5aaa727c7f508828e94cff4a98874f930c (diff) |
KVM: Switch assigned device IRQ forwarding to threaded handler
This improves the IRQ forwarding for assigned devices: By using the
kernel's threaded IRQ scheme, we can get rid of the latency-prone work
queue and simplify the code in the same run.
Moreover, we no longer have to hold assigned_dev_lock while raising the
guest IRQ, which can be a lenghty operation as we may have to iterate
over all VCPUs. The lock is now only used for synchronizing masking vs.
unmasking of INTx-type IRQs, thus is renames to intx_lock.
Acked-by: Alex Williamson <alex.williamson@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'include/linux/kvm_host.h')
-rw-r--r-- | include/linux/kvm_host.h | 12 |
1 files changed, 2 insertions, 10 deletions
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 2d63f2c0137c..9fe7fefe76b1 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -470,16 +470,8 @@ struct kvm_irq_ack_notifier { | |||
470 | void (*irq_acked)(struct kvm_irq_ack_notifier *kian); | 470 | void (*irq_acked)(struct kvm_irq_ack_notifier *kian); |
471 | }; | 471 | }; |
472 | 472 | ||
473 | #define KVM_ASSIGNED_MSIX_PENDING 0x1 | ||
474 | struct kvm_guest_msix_entry { | ||
475 | u32 vector; | ||
476 | u16 entry; | ||
477 | u16 flags; | ||
478 | }; | ||
479 | |||
480 | struct kvm_assigned_dev_kernel { | 473 | struct kvm_assigned_dev_kernel { |
481 | struct kvm_irq_ack_notifier ack_notifier; | 474 | struct kvm_irq_ack_notifier ack_notifier; |
482 | struct work_struct interrupt_work; | ||
483 | struct list_head list; | 475 | struct list_head list; |
484 | int assigned_dev_id; | 476 | int assigned_dev_id; |
485 | int host_segnr; | 477 | int host_segnr; |
@@ -490,13 +482,13 @@ struct kvm_assigned_dev_kernel { | |||
490 | bool host_irq_disabled; | 482 | bool host_irq_disabled; |
491 | struct msix_entry *host_msix_entries; | 483 | struct msix_entry *host_msix_entries; |
492 | int guest_irq; | 484 | int guest_irq; |
493 | struct kvm_guest_msix_entry *guest_msix_entries; | 485 | struct msix_entry *guest_msix_entries; |
494 | unsigned long irq_requested_type; | 486 | unsigned long irq_requested_type; |
495 | int irq_source_id; | 487 | int irq_source_id; |
496 | int flags; | 488 | int flags; |
497 | struct pci_dev *dev; | 489 | struct pci_dev *dev; |
498 | struct kvm *kvm; | 490 | struct kvm *kvm; |
499 | spinlock_t assigned_dev_lock; | 491 | spinlock_t intx_lock; |
500 | }; | 492 | }; |
501 | 493 | ||
502 | struct kvm_irq_mask_notifier { | 494 | struct kvm_irq_mask_notifier { |