qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]