[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v10 24/26] kvm-irqchip: do explicit commit when
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH v10 24/26] kvm-irqchip: do explicit commit when update irq |
Date: |
Mon, 4 Jul 2016 16:23:32 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 |
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 <address@hidden>
> ---
> 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
- Re: [Qemu-devel] [PATCH v10 24/26] kvm-irqchip: do explicit commit when update irq,
Paolo Bonzini <=