diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2012-05-17 10:32:35 -0300 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-05-21 19:22:49 +0300 |
commit | e7b2030862f63ee02331940b9f1742cd025c1908 (patch) | |
tree | 0e90e3c833df6e435e288c623cf53e429b5623a3 | |
parent | 1e2aa8be09184156f438ba5199eaa12190c39acc (diff) | |
download | qemu-e7b2030862f63ee02331940b9f1742cd025c1908.zip qemu-e7b2030862f63ee02331940b9f1742cd025c1908.tar.gz qemu-e7b2030862f63ee02331940b9f1742cd025c1908.tar.bz2 |
kvm: Make kvm_irqchip_commit_routes an internal service
Automatically commit route changes after kvm_add_routing_entry and
kvm_irqchip_release_virq. There is no performance relevant use case for
which collecting multiple route changes is beneficial. This makes
kvm_irqchip_commit_routes an internal service which assert()s that the
corresponding IOCTL will always succeed.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r-- | hw/pc_piix.c | 6 | ||||
-rw-r--r-- | kvm-all.c | 26 | ||||
-rw-r--r-- | kvm.h | 1 |
3 files changed, 15 insertions, 18 deletions
diff --git a/hw/pc_piix.c b/hw/pc_piix.c index c17f906..044dfcb 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -56,7 +56,7 @@ static void kvm_piix3_setup_irq_routing(bool pci_enabled) { #ifdef CONFIG_KVM KVMState *s = kvm_state; - int ret, i; + int i; if (kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) { for (i = 0; i < 8; ++i) { @@ -77,10 +77,6 @@ static void kvm_piix3_setup_irq_routing(bool pci_enabled) } } } - ret = kvm_irqchip_commit_routes(s); - if (ret < 0) { - hw_error("KVM IRQ routing setup failed"); - } } #endif /* CONFIG_KVM */ } @@ -908,6 +908,15 @@ static void kvm_init_irq_routing(KVMState *s) kvm_arch_init_irq_routing(s); } +static void kvm_irqchip_commit_routes(KVMState *s) +{ + int ret; + + s->irq_routes->flags = 0; + ret = kvm_vm_ioctl(s, KVM_SET_GSI_ROUTING, s->irq_routes); + assert(ret == 0); +} + static void kvm_add_routing_entry(KVMState *s, struct kvm_irq_routing_entry *entry) { @@ -933,6 +942,8 @@ static void kvm_add_routing_entry(KVMState *s, new->u = entry->u; set_gsi(s, entry->gsi); + + kvm_irqchip_commit_routes(s); } void kvm_irqchip_add_irq_route(KVMState *s, int irq, int irqchip, int pin) @@ -949,12 +960,6 @@ void kvm_irqchip_add_irq_route(KVMState *s, int irq, int irqchip, int pin) kvm_add_routing_entry(s, &e); } -int kvm_irqchip_commit_routes(KVMState *s) -{ - s->irq_routes->flags = 0; - return kvm_vm_ioctl(s, KVM_SET_GSI_ROUTING, s->irq_routes); -} - void kvm_irqchip_release_virq(KVMState *s, int virq) { struct kvm_irq_routing_entry *e; @@ -968,6 +973,8 @@ void kvm_irqchip_release_virq(KVMState *s, int virq) } } clear_gsi(s, virq); + + kvm_irqchip_commit_routes(s); } static unsigned int kvm_hash_msi(uint32_t data) @@ -1049,7 +1056,7 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) route = kvm_lookup_msi_route(s, msg); if (!route) { - int virq, ret; + int virq; virq = kvm_irqchip_get_virq(s); if (virq < 0) { @@ -1068,11 +1075,6 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg) QTAILQ_INSERT_TAIL(&s->msi_hashtab[kvm_hash_msi(msg.data)], route, entry); - - ret = kvm_irqchip_commit_routes(s); - if (ret < 0) { - return ret; - } } assert(route->kroute.type == KVM_IRQ_ROUTING_MSI); @@ -135,7 +135,6 @@ int kvm_irqchip_set_irq(KVMState *s, int irq, int level); int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg); void kvm_irqchip_add_irq_route(KVMState *s, int gsi, int irqchip, int pin); -int kvm_irqchip_commit_routes(KVMState *s); void kvm_put_apic_state(DeviceState *d, struct kvm_lapic_state *kapic); void kvm_get_apic_state(DeviceState *d, struct kvm_lapic_state *kapic); |