On 21/06/2016 09:47, Peter Xu wrote: > In the past, we are doing gsi route commit for each irqchip route > update. This is not efficient if we are updating lots of routes in the > same time. This patch removes the committing phase in > kvm_irqchip_update_msi_route(). Instead, we do explicit commit after all > routes updated. > > Signed-off-by: Peter Xu <[email protected]> > --- > hw/i386/kvm/pci-assign.c | 2 ++ > hw/misc/ivshmem.c | 1 + > hw/vfio/pci.c | 1 + > hw/virtio/virtio-pci.c | 1 + > include/sysemu/kvm.h | 2 +- > kvm-all.c | 2 -- > kvm-stub.c | 4 ++++ > target-i386/kvm.c | 1 + > 8 files changed, 11 insertions(+), 3 deletions(-) > > diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c > index 62dec5f..a79557f 100644 > --- a/hw/i386/kvm/pci-assign.c > +++ b/hw/i386/kvm/pci-assign.c > @@ -1015,6 +1015,7 @@ static void assigned_dev_update_msi_msg(PCIDevice > *pci_dev) > > kvm_irqchip_update_msi_route(kvm_state, assigned_dev->msi_virq[0], > msi_get_message(pci_dev, 0), pci_dev); > + kvm_irqchip_commit_routes(kvm_state); > } > > static bool assigned_dev_msix_masked(MSIXTableEntry *entry) > @@ -1601,6 +1602,7 @@ static void assigned_dev_msix_mmio_write(void *opaque, > hwaddr addr, > if (ret) { > error_report("Error updating irq routing entry (%d)", > ret); > } > + kvm_irqchip_commit_routes(kvm_state); > } > } > } > diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c > index 8512523..241a70c 100644 > --- a/hw/misc/ivshmem.c > +++ b/hw/misc/ivshmem.c > @@ -322,6 +322,7 @@ static int ivshmem_vector_unmask(PCIDevice *dev, unsigned > vector, > if (ret < 0) { > return ret; > } > + kvm_irqchip_commit_routes(kvm_state); > > return kvm_irqchip_add_irqfd_notifier_gsi(kvm_state, n, NULL, v->virq); > } > diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c > index cc4e60c..56b13f9 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -457,6 +457,7 @@ static void vfio_update_kvm_msi_virq(VFIOMSIVector > *vector, MSIMessage msg, > PCIDevice *pdev) > { > kvm_irqchip_update_msi_route(kvm_state, vector->virq, msg, pdev); > + kvm_irqchip_commit_routes(kvm_state); > } > > static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr, > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c > index 184570d..aad0f3d 100644 > --- a/hw/virtio/virtio-pci.c > +++ b/hw/virtio/virtio-pci.c > @@ -870,6 +870,7 @@ static int virtio_pci_vq_vector_unmask(VirtIOPCIProxy > *proxy, > if (ret < 0) { > return ret; > } > + kvm_irqchip_commit_routes(kvm_state); > } > } > > diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h > index 0a16e0e..c9c2436 100644 > --- a/include/sysemu/kvm.h > +++ b/include/sysemu/kvm.h > @@ -371,7 +371,6 @@ int kvm_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); > -void 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); > @@ -494,6 +493,7 @@ static inline void cpu_synchronize_post_init(CPUState > *cpu) > int kvm_irqchip_add_msi_route(KVMState *s, int vector, PCIDevice *dev); > int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg, > PCIDevice *dev); > +void kvm_irqchip_commit_routes(KVMState *s); > void kvm_irqchip_release_virq(KVMState *s, int virq); > > int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter); > diff --git a/kvm-all.c b/kvm-all.c > index ca30a58..3764ba9 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -1094,8 +1094,6 @@ static int kvm_update_routing_entry(KVMState *s, > > *entry = *new_entry; > > - kvm_irqchip_commit_routes(s); > - > return 0; > } > > diff --git a/kvm-stub.c b/kvm-stub.c > index 982e590..64e23f6 100644 > --- a/kvm-stub.c > +++ b/kvm-stub.c > @@ -135,6 +135,10 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, > MSIMessage msg, > return -ENOSYS; > } > > +void kvm_irqchip_commit_routes(KVMState *s) > +{ > +} > + > int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter) > { > return -ENOSYS; > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > index f02ba0a..0e26862 100644 > --- a/target-i386/kvm.c > +++ b/target-i386/kvm.c > @@ -3379,6 +3379,7 @@ static void kvm_update_msi_routes_all(void *private, > bool global, > kvm_irqchip_update_msi_route(kvm_state, entry->virq, > msg, entry->dev); > } > + kvm_irqchip_commit_routes(kvm_state); > trace_kvm_x86_update_msi_routes(cnt); > } > >
FWIW I prefer this to the "v10.2". Paolo
