All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v18 0/6] KVM platform device passthrough
@ 2015-06-26 17:29 Eric Auger
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 1/6] kvm: rename kvm_irqchip_[add, remove]_irqfd_notifier with gsi suffix Eric Auger
                   ` (5 more replies)
  0 siblings, 6 replies; 14+ messages in thread
From: Eric Auger @ 2015-06-26 17:29 UTC (permalink / raw)
  To: eric.auger, eric.auger, qemu-devel, peter.maydell,
	alex.williamson, pbonzini
  Cc: peter.crosthwaite, christoffer.dall, patches

Those remaining patches aim at enabling irqfd usage in the VFIO platform
device

They can be found at :
http://git.linaro.org/people/eric.auger/qemu.git
(branch vfio_integ_v18)

Tested by Vikram Sethi on a device featuring 2 MMIO regions.
Code also exercised successfully by VOSYS for AMBA derivative series.

Thanks

Eric

History:

v17 -> v18:
- remove found in vfio_start_irqfd_injection
- unconditionnally set sbc->connect_irq_notifier in the class_init
  function and do the proper checks in vfio_start_irqfd_injection

v16 -> v17:
- add Paolo's A-b on [1-3]
- Take into account Peter's comments
- add [kvm: some fixes to kvm_resamplefds_allowed] to bring non-KVM
  version of kvm_resamplefds_allowed
- remove #ifdef CONFIG_KVM in last patch

v15 -> v16:
- no code change
- add Vikram's T-b
- rebase on 0915aed
- remove linux header update patch file

v14 -> v15:
- add Peter R-b on sysbus: add irq_routing_notifier
- correct g_malloc0_n usage in skeleton
- correct return values of reset related functions
- include Cornelia's patch for header update

v13 -> v14:
- remove v13 9, 10, 11 patch files and replace them by a single patch file
  "sysbus: add irq_routing_notifier".
- in skeleton, fix ENAMETOOLONG sign
- remove VFIOINTp virtualID in "add irq assignment" patch file
- removed trace_vfio_platform_start_eventfd

v12 -> v13:
- header update but same update was already sent by Cornelia
- Rework VFIO signaling & irqfd setup: restored 2-step setup featuring
  eventfd setup on realize and then irqfd setup on irq binding.
- irqfd setup now uses kvm_irqchip_add_irqfd_notifier and
  sysbus irq_set_hook override. This leads to the introduction of 6 patch
  files enabling those 2 features. Paolo advised to introduce
  kvm_irqchip_add_irqfd_notifier series in the VFIO one. I did the
  same for irq_set_hook series but if it is better I can submit it aside.
- above changes made possible to remove
  x hw/vfio/platform: add capability to start IRQ propagation"
  x hw/arm/virt: start VFIO IRQ propagation
- in sysbus-fdt.c, use platform_bus_get_mmio_addr instead of deprecated
  mmio[0] property. Thanks to Bharat who pointed this issue out. also
  cpu_to_be32 was used for size and base (Vikram input) .
- in skeleton misc corrections following Alex review.

v11->v12:
- add x-mmap property definition, without which the default value of
  vbasedev.allow_mmap is false, hence preventing the reg space from
  being mmapped.

v10->v11:
- rebase onto v2.3.0-rc0 (mainly related to PCIe support in virt)
- add dma-coherent property for calxeda midway (fix revealed by removal
  of kernel-side "vfio: type1: support for ARM SMMUS with VFIO_IOMMU_TYPE1")
- virt modifications to start VFIO IRQ forwarding are now in a separate
  patch
- rearrange linux header exports (those are still partial exports
  waiting for definitive 4.1-rc0)
- take into account Alex Bennée comments:
  - use g_malloc0_n instead of g_malloc0
  - use block declarations when possible
  - rework readlink returned value treatment
  - use g_strlcat in place strncat
  - re-arrange mutex locking for multiple IRQ support (user-side handled
    eventfds)
- use g_snprintf instead of snprintf
- change the order of functions to avoid pre-declaration in platform.c
- add flags in VFIOINTp struct to detect whether the IRQ is automasked
- some comment rewriting

v9->v10:
- rebase on "vfio: cleanup vfio_get_device error path, remove
  vfio_populate_device": vfio_populate_device no more called in
  vfio_get_device but in vfio_base_device_init
- update VFIO header according to vfio platform driver v13 (no AMBA)

v8->v9:
- rebase on 2.2.0 and machvirt dynamic sysbus instantiation v10
- v8 1-11 were pulled
- patch files related to forwarding are moved in a seperate series since
  it depends on kernel series still in RFC.
- introduction of basic VFIO platform device split into 3 patch files to
  ease the review (hope it will help).
- add an author in platform.c
- add deallocation in vfio_populate_device error case
- add patch file doing the VFIO header sync
- use VFIO_DEVICE_FLAGS_PLATFORM in vfio_populate_device
- rename calxeda_xgmac.c into calxeda-xgmac.c
- sysbus-fdt: add_calxeda_midway_xgmac_fdt_node g_free in case of errors
- reword of linux-headers patch files

v7->v8:
- rebase on v2.2.0-rc3 and integrate
  "Add skip_dump flag to ignore memory region during dump"
- KVM header evolution with subindex addition in kvm_arch_forwarded_irq
- split [PATCH v7 03/16] hw/vfio/pci: introduce VFIODevice into 4 patches
- vfio_compute_needs_reset does not return bool anymore
- add some comments about exposed MMIO region and IRQ in calxeda xgmac
  device
- vfio_[un]mask_irqindex renamed into vfio_[un]mask_single_irqindex
- rework IRQ startup: former machine init done notifier is replaced by a
  reset notifier. machine file passes the interrupt controller
  DeviceState handle (not the platform bus first irq parameter).
- sysbus-fdt:
  - move the add_fdt_node_functions array declaration between the device
    specific code and the generic code to avoid forward declarations of
    decice specific functions
  - rename add_basic_vfio_fdt_node into add_calxeda_midway_xgmac_fdt_node
    emphasizing the fact it is xgmac specific

v6->v7:
- fake injection test modality removed
- VFIO_DEVICE_TYPE_PLATFORM only introduced with VFIO platform
- new helper functions to start VFIO IRQ on machine init done notifier
  (introduced in hw/vfio/platform: add vfio-platform support and notifier
  registration invoked in hw/arm/virt: add support for VFIO devices).
  vfio_start_irq_injection is replaced by vfio_register_irq_starter.

v5->v6:
- rebase on 2.1rc5 PCI code
- forwarded IRQ first integraton
- vfio_device property renamed into host property
- split IRQ setup in different functions that match the 3 supported
  injection techniques (user handled eventfd, irqfd, forwarded IRQ):
  removes dynamic switch between injection methods
- introduce fake interrupts as a test modality:
  x makes possible to test multiple IRQ user-side handling.
  x this is a test feature only: enable to trigger a fd as if the
    real physical IRQ hit. No virtual IRQ is injected into the guest
    but handling is simulated so that the state machine can be tested
- user handled eventfd:
  x add mutex to protect IRQ state & list manipulation,
  x correct misleading comment in vfio_intp_interrupt.
  x Fix bugs using fake interrupt modality
- irqfd no more advertised in this patchset (handled in [3])
- VFIOPlatformDeviceClass becomes abstract and Calxeda xgmac device
  and class is re-introduced (as per v4)
- all DPRINTF removed in platform and replaced by trace-points
- corrects compilation with configure --disable-kvm
- simplifies the split for vfio_get_device and introduce a unique
  specialized function named vfio_populate_device
- group_list renamed into vfio_group_list
- hw/arm/dyn_sysbus_devtree.c currently only support vfio-calxeda-xgmac
  instantiation. Needs to be specialized for other VFIO devices
- fix 2 bugs in dyn_sysbus_devtree(reg_attr index and compat)

v4->v5:
- rebase on v2.1.0 PCI code
- take into account Alex Williamson comments on PCI code rework
  - trace updates in vfio_region_write/read
  - remove fd from VFIORegion
  - get/put ckeanup
- bug fix: bar region's vbasedev field duly initialization
- misc cleanups in platform device
- device tree node generation removed from device and handled in
  hw/arm/dyn_sysbus_devtree.c
- remove "hw/vfio: add an example calxeda_xgmac": with removal of
  device tree node generation we do not have so many things to
  implement in that derived device yet. May be re-introduced later
  on if needed typically for reset/migration.
- no GSI routing table anymore

v3->v4 changes (Eric Auger, Alvise Rigo)
- rebase on last VFIO PCI code (v2.1.0-rc0)
- full git history rework to ease PCI code change review
- mv include files in hw/vfio
- DPRINTF reformatting temporarily moved out
- support of VFIO virq (removal of resamplefd handler on user-side)
- integration with sysbus dynamic instantiation framwork
- removal of unrealize and cleanup routines until it is better
  understood what is really needed
- Support of VFIO for Amba devices should be handled in an inherited
  device to specialize the device tree generation (clock handle currently
  missing in framework however)
- "Always use eventfd as notifying mechanism" temporarily moved out
- static instantiation is not mainstream (although it remains possible)
  note if static instantiation is used, irqfd must be setup in machine file
  when virtual IRQ is known
- create the GSI routing table on qemu side

v2->v3 changes (Alvise Rigo, Eric Auger):
- Following Alex W recommandations, further efforts to factorize the
  code between PCI:introduction of VFIODevice and VFIORegion
  as base classes
- unique reset handler for platform and PCI
- cleanup following Kim's comments
- multiple IRQ support mechanics should be in place although not
  tested
- Better handling of MMIO multiple regions
- New features and fixes by Alvise (multiple compat string, exec
  flag, force eventfd usage, amba device tree support)
- irqfd support

v1->v2 changes (Kim Phillips, Eric Auger):
- IRQ initial support (legacy mode where eventfds are handled on
  user side)
- hacked dynamic instantiation

v1 (Kim Phillips):
- initial split between PCI and platform
- MMIO support only
- static instantiation

Best Regards

Eric


Eric Auger (6):
  kvm: rename kvm_irqchip_[add,remove]_irqfd_notifier with gsi suffix
  kvm-all.c: add qemu_irq/gsi hash table and utility routines
  intc: arm_gic_kvm: set the qemu_irq/gsi mapping
  sysbus: add irq_routing_notifier
  kvm: some fixes to kvm_resamplefds_allowed
  hw/vfio/platform: add irqfd support

 hw/core/sysbus.c                |   6 +++
 hw/intc/arm_gic_kvm.c           |   6 +++
 hw/s390x/virtio-ccw.c           |   8 ++--
 hw/vfio/pci.c                   |   6 +--
 hw/vfio/platform.c              | 100 ++++++++++++++++++++++++++++++++++++++++
 hw/virtio/virtio-pci.c          |   4 +-
 include/hw/sysbus.h             |   1 +
 include/hw/vfio/vfio-platform.h |   2 +
 include/sysemu/kvm.h            |  12 ++++-
 kvm-all.c                       |  40 ++++++++++++++--
 kvm-stub.c                      |   8 ++--
 trace-events                    |   1 +
 12 files changed, 177 insertions(+), 17 deletions(-)

-- 
1.8.3.2

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v18 1/6] kvm: rename kvm_irqchip_[add, remove]_irqfd_notifier with gsi suffix
  2015-06-26 17:29 [Qemu-devel] [PATCH v18 0/6] KVM platform device passthrough Eric Auger
@ 2015-06-26 17:29 ` Eric Auger
  2015-06-29  9:37   ` Peter Maydell
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 2/6] kvm-all.c: add qemu_irq/gsi hash table and utility routines Eric Auger
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Eric Auger @ 2015-06-26 17:29 UTC (permalink / raw)
  To: eric.auger, eric.auger, qemu-devel, peter.maydell,
	alex.williamson, pbonzini
  Cc: peter.crosthwaite, christoffer.dall, patches

Anticipating for the introduction of new add/remove functions taking
a qemu_irq parameter, let's rename existing ones with a gsi suffix.

Signed-off-by: Eric Auger <eric.auger@linaro.org>
Tested-by: Vikram Sethi <vikrams@codeaurora.org>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>

---

v16 -> v17:
- added Paolo's A-b

v15 -> v16:
- added Vikram's T-b
- resolve rebase conflict in kvm.h
---
 hw/s390x/virtio-ccw.c  | 8 ++++----
 hw/vfio/pci.c          | 6 +++---
 hw/virtio/virtio-pci.c | 4 ++--
 include/sysemu/kvm.h   | 7 ++++---
 kvm-all.c              | 7 ++++---
 kvm-stub.c             | 7 ++++---
 6 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index 9605bf4..f1ab121 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -1186,8 +1186,8 @@ static int virtio_ccw_add_irqfd(VirtioCcwDevice *dev, int n)
     VirtQueue *vq = virtio_get_queue(vdev, n);
     EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
 
-    return kvm_irqchip_add_irqfd_notifier(kvm_state, notifier, NULL,
-                                          dev->routes.gsi[n]);
+    return kvm_irqchip_add_irqfd_notifier_gsi(kvm_state, notifier, NULL,
+                                              dev->routes.gsi[n]);
 }
 
 static void virtio_ccw_remove_irqfd(VirtioCcwDevice *dev, int n)
@@ -1197,8 +1197,8 @@ static void virtio_ccw_remove_irqfd(VirtioCcwDevice *dev, int n)
     EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
     int ret;
 
-    ret = kvm_irqchip_remove_irqfd_notifier(kvm_state, notifier,
-                                            dev->routes.gsi[n]);
+    ret = kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state, notifier,
+                                                dev->routes.gsi[n]);
     assert(ret == 0);
 }
 
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index e0e339a..ac85624 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -597,7 +597,7 @@ static void vfio_add_kvm_msi_virq(VFIOMSIVector *vector, MSIMessage *msg,
         return;
     }
 
-    if (kvm_irqchip_add_irqfd_notifier(kvm_state, &vector->kvm_interrupt,
+    if (kvm_irqchip_add_irqfd_notifier_gsi(kvm_state, &vector->kvm_interrupt,
                                        NULL, virq) < 0) {
         kvm_irqchip_release_virq(kvm_state, virq);
         event_notifier_cleanup(&vector->kvm_interrupt);
@@ -609,8 +609,8 @@ static void vfio_add_kvm_msi_virq(VFIOMSIVector *vector, MSIMessage *msg,
 
 static void vfio_remove_kvm_msi_virq(VFIOMSIVector *vector)
 {
-    kvm_irqchip_remove_irqfd_notifier(kvm_state, &vector->kvm_interrupt,
-                                      vector->virq);
+    kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state, &vector->kvm_interrupt,
+                                          vector->virq);
     kvm_irqchip_release_virq(kvm_state, vector->virq);
     vector->virq = -1;
     event_notifier_cleanup(&vector->kvm_interrupt);
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 70bc6d8..36f965c 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -495,7 +495,7 @@ static int kvm_virtio_pci_irqfd_use(VirtIOPCIProxy *proxy,
     VirtQueue *vq = virtio_get_queue(vdev, queue_no);
     EventNotifier *n = virtio_queue_get_guest_notifier(vq);
     int ret;
-    ret = kvm_irqchip_add_irqfd_notifier(kvm_state, n, NULL, irqfd->virq);
+    ret = kvm_irqchip_add_irqfd_notifier_gsi(kvm_state, n, NULL, irqfd->virq);
     return ret;
 }
 
@@ -509,7 +509,7 @@ static void kvm_virtio_pci_irqfd_release(VirtIOPCIProxy *proxy,
     VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector];
     int ret;
 
-    ret = kvm_irqchip_remove_irqfd_notifier(kvm_state, n, irqfd->virq);
+    ret = kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state, n, irqfd->virq);
     assert(ret == 0);
 }
 
diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index f459fbd..acb3025 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -416,9 +416,10 @@ void kvm_irqchip_release_virq(KVMState *s, int virq);
 
 int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter);
 
-int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
-                                   EventNotifier *rn, int virq);
-int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq);
+int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
+                                       EventNotifier *rn, int virq);
+int kvm_irqchip_remove_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
+                                          int virq);
 void kvm_pc_gsi_handler(void *opaque, int n, int level);
 void kvm_pc_setup_irq_routing(bool pci_enabled);
 void kvm_init_irq_routing(KVMState *s);
diff --git a/kvm-all.c b/kvm-all.c
index 53e01d4..730b818 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -1325,14 +1325,15 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg)
 }
 #endif /* !KVM_CAP_IRQ_ROUTING */
 
-int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
-                                   EventNotifier *rn, int virq)
+int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
+                                       EventNotifier *rn, int virq)
 {
     return kvm_irqchip_assign_irqfd(s, event_notifier_get_fd(n),
            rn ? event_notifier_get_fd(rn) : -1, virq, true);
 }
 
-int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq)
+int kvm_irqchip_remove_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
+                                          int virq)
 {
     return kvm_irqchip_assign_irqfd(s, event_notifier_get_fd(n), -1, virq,
            false);
diff --git a/kvm-stub.c b/kvm-stub.c
index 7ba90c5..977de21 100644
--- a/kvm-stub.c
+++ b/kvm-stub.c
@@ -137,13 +137,14 @@ int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter)
     return -ENOSYS;
 }
 
-int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
-                                   EventNotifier *rn, int virq)
+int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
+                                       EventNotifier *rn, int virq)
 {
     return -ENOSYS;
 }
 
-int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq)
+int kvm_irqchip_remove_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
+                                          int virq)
 {
     return -ENOSYS;
 }
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v18 2/6] kvm-all.c: add qemu_irq/gsi hash table and utility routines
  2015-06-26 17:29 [Qemu-devel] [PATCH v18 0/6] KVM platform device passthrough Eric Auger
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 1/6] kvm: rename kvm_irqchip_[add, remove]_irqfd_notifier with gsi suffix Eric Auger
@ 2015-06-26 17:29 ` Eric Auger
  2015-06-29  9:42   ` Peter Maydell
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 3/6] intc: arm_gic_kvm: set the qemu_irq/gsi mapping Eric Auger
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Eric Auger @ 2015-06-26 17:29 UTC (permalink / raw)
  To: eric.auger, eric.auger, qemu-devel, peter.maydell,
	alex.williamson, pbonzini
  Cc: peter.crosthwaite, christoffer.dall, patches

VFIO platform device needs to setup irqfd but it does not know the
gsi corresponding to the device qemu_irq. This patch proposes to
store a hash table in kvm_state using the qemu_irq as key and the gsi
as a value.

kvm_irqchip_set_qemuirq_gsi allows to insert such a pair. The interrupt
controller is supposed to use it.

kvm_irqchip_[add, remove]_irqfd_notifier allows to setup/tear down
irqfd directly from the qemu_irq.

Signed-off-by: Eric Auger <eric.auger@linaro.org>
Tested-by: Vikram Sethi <vikrams@codeaurora.org>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>

---

v16 -> v17
- replace GPOINTER_TO_UINT by GPOINTER_TO_INT
- add Paolo's ack

v15 -> v16:
- Added Vikram's T-b

v13 -> v14:
- correct checkpatch warning

v2 -> v3 (integration into VFIO series v13):
- rename kvm_irqchip_[add, remove]_qemuirq_irqfd_notifier into
  kvm_irqchip_[add, remove]_irqfd_notifier. Possible since legacy
  functions were also renamed with _gsi suffix.

V1 -> v2:
- qemu_irq get_gsi callback replaced by hash table stored in kvm
---
 include/sysemu/kvm.h |  6 ++++++
 kvm-all.c            | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index acb3025..ba612fc 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -19,6 +19,7 @@
 #include "qemu/queue.h"
 #include "qom/cpu.h"
 #include "exec/memattrs.h"
+#include "hw/irq.h"
 
 #ifdef CONFIG_KVM
 #include <linux/kvm.h>
@@ -420,6 +421,11 @@ int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
                                        EventNotifier *rn, int virq);
 int kvm_irqchip_remove_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
                                           int virq);
+int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
+                                   EventNotifier *rn, qemu_irq irq);
+int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n,
+                                      qemu_irq irq);
+void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi);
 void kvm_pc_gsi_handler(void *opaque, int n, int level);
 void kvm_pc_setup_irq_routing(bool pci_enabled);
 void kvm_init_irq_routing(KVMState *s);
diff --git a/kvm-all.c b/kvm-all.c
index 730b818..cb76b38 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -37,6 +37,7 @@
 #include "exec/address-spaces.h"
 #include "qemu/event_notifier.h"
 #include "trace.h"
+#include "hw/irq.h"
 
 #include "hw/boards.h"
 
@@ -98,6 +99,7 @@ struct KVMState
      * unsigned, and treating them as signed here can break things */
     unsigned irq_set_ioctl;
     unsigned int sigmask_len;
+    GHashTable *gsimap;
 #ifdef KVM_CAP_IRQ_ROUTING
     struct kvm_irq_routing *irq_routes;
     int nr_allocated_irq_routes;
@@ -1339,6 +1341,35 @@ int kvm_irqchip_remove_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
            false);
 }
 
+int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
+                                   EventNotifier *rn, qemu_irq irq)
+{
+    gpointer key, gsi;
+    gboolean found = g_hash_table_lookup_extended(s->gsimap, irq, &key, &gsi);
+
+    if (!found) {
+        return -ENXIO;
+    }
+    return kvm_irqchip_add_irqfd_notifier_gsi(s, n, rn, GPOINTER_TO_INT(gsi));
+}
+
+int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n,
+                                      qemu_irq irq)
+{
+    gpointer key, gsi;
+    gboolean found = g_hash_table_lookup_extended(s->gsimap, irq, &key, &gsi);
+
+    if (!found) {
+        return -ENXIO;
+    }
+    return kvm_irqchip_remove_irqfd_notifier_gsi(s, n, GPOINTER_TO_INT(gsi));
+}
+
+void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi)
+{
+    g_hash_table_insert(s->gsimap, irq, GINT_TO_POINTER(gsi));
+}
+
 static int kvm_irqchip_create(MachineState *machine, KVMState *s)
 {
     int ret;
@@ -1371,6 +1402,8 @@ static int kvm_irqchip_create(MachineState *machine, KVMState *s)
 
     kvm_init_irq_routing(s);
 
+    s->gsimap = g_hash_table_new(g_direct_hash, g_direct_equal);
+
     return 0;
 }
 
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v18 3/6] intc: arm_gic_kvm: set the qemu_irq/gsi mapping
  2015-06-26 17:29 [Qemu-devel] [PATCH v18 0/6] KVM platform device passthrough Eric Auger
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 1/6] kvm: rename kvm_irqchip_[add, remove]_irqfd_notifier with gsi suffix Eric Auger
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 2/6] kvm-all.c: add qemu_irq/gsi hash table and utility routines Eric Auger
@ 2015-06-26 17:29 ` Eric Auger
  2015-06-29  9:43   ` Peter Maydell
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 4/6] sysbus: add irq_routing_notifier Eric Auger
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Eric Auger @ 2015-06-26 17:29 UTC (permalink / raw)
  To: eric.auger, eric.auger, qemu-devel, peter.maydell,
	alex.williamson, pbonzini
  Cc: peter.crosthwaite, christoffer.dall, patches

The arm_gic_kvm now calls kvm_irqchip_set_qemuirq_gsi to build
the hash table storing qemu_irq/gsi mappings. From that point on
irqfd can be setup directly from the qemu_irq using
kvm_irqchip_add_irqfd_notifier.

Signed-off-by: Eric Auger <eric.auger@linaro.org>
Tested-by: Vikram Sethi <vikrams@codeaurora.org>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>

---
v16 -> v17:
- add Paolo's A-b

v15 -> v16:
- added Vikram's T-b
- Resolve rebase conflict

v2 -> v3:
- kvm_irqchip_add_qemuirq_irqfd_notifier renamed into
  kvm_irqchip_add_irqfd_notifier
---
 hw/intc/arm_gic_kvm.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
index 2cb7d25..f56bff1 100644
--- a/hw/intc/arm_gic_kvm.c
+++ b/hw/intc/arm_gic_kvm.c
@@ -570,6 +570,12 @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
      */
     i += (GIC_INTERNAL * s->num_cpu);
     qdev_init_gpio_in(dev, kvm_arm_gic_set_irq, i);
+
+    for (i = 0; i < s->num_irq - GIC_INTERNAL; i++) {
+        qemu_irq irq = qdev_get_gpio_in(dev, i);
+        kvm_irqchip_set_qemuirq_gsi(kvm_state, irq, i);
+    }
+
     /* We never use our outbound IRQ/FIQ lines but provide them so that
      * we maintain the same interface as the non-KVM GIC.
      */
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v18 4/6] sysbus: add irq_routing_notifier
  2015-06-26 17:29 [Qemu-devel] [PATCH v18 0/6] KVM platform device passthrough Eric Auger
                   ` (2 preceding siblings ...)
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 3/6] intc: arm_gic_kvm: set the qemu_irq/gsi mapping Eric Auger
@ 2015-06-26 17:29 ` Eric Auger
  2015-06-29  9:44   ` Peter Maydell
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 5/6] kvm: some fixes to kvm_resamplefds_allowed Eric Auger
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 6/6] hw/vfio/platform: add irqfd support Eric Auger
  5 siblings, 1 reply; 14+ messages in thread
From: Eric Auger @ 2015-06-26 17:29 UTC (permalink / raw)
  To: eric.auger, eric.auger, qemu-devel, peter.maydell,
	alex.williamson, pbonzini
  Cc: peter.crosthwaite, christoffer.dall, patches

Add a new connect_irq_notifier notifier in the SysBusDeviceClass. This
notifier, if populated, is called after sysbus_connect_irq.

This mechanism is used to setup VFIO signaling once VFIO platform
devices get attached to their platform bus, on a machine init done
notifier.

Signed-off-by: Eric Auger <eric.auger@linaro.org>
Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Tested-by: Vikram Sethi <vikrams@codeaurora.org>

---
v15 -> v16:
- add Vikram's T-b

v14 -> v15:
- add Peter R-b

v2 -> v3 (integrated into this series v14):
- rename irq_routing_notifier into connect_irq_notifier

v1 -> v2:
- duly put the notifier in the class and not in the device
---
 hw/core/sysbus.c    | 6 ++++++
 include/hw/sysbus.h | 1 +
 2 files changed, 7 insertions(+)

diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index 92eced9..b1f7fab 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -109,7 +109,13 @@ qemu_irq sysbus_get_connected_irq(SysBusDevice *dev, int n)
 
 void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq)
 {
+    SysBusDeviceClass *sbd = SYS_BUS_DEVICE_GET_CLASS(dev);
+
     qdev_connect_gpio_out_named(DEVICE(dev), SYSBUS_DEVICE_GPIO_IRQ, n, irq);
+
+    if (sbd->connect_irq_notifier) {
+        sbd->connect_irq_notifier(dev, irq);
+    }
 }
 
 /* Check whether an MMIO region exists */
diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
index d1f3f00..e80b26d 100644
--- a/include/hw/sysbus.h
+++ b/include/hw/sysbus.h
@@ -41,6 +41,7 @@ typedef struct SysBusDeviceClass {
     /*< public >*/
 
     int (*init)(SysBusDevice *dev);
+    void (*connect_irq_notifier)(SysBusDevice *dev, qemu_irq irq);
 } SysBusDeviceClass;
 
 struct SysBusDevice {
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v18 5/6] kvm: some fixes to kvm_resamplefds_allowed
  2015-06-26 17:29 [Qemu-devel] [PATCH v18 0/6] KVM platform device passthrough Eric Auger
                   ` (3 preceding siblings ...)
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 4/6] sysbus: add irq_routing_notifier Eric Auger
@ 2015-06-26 17:29 ` Eric Auger
  2015-06-29  9:47   ` Peter Maydell
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 6/6] hw/vfio/platform: add irqfd support Eric Auger
  5 siblings, 1 reply; 14+ messages in thread
From: Eric Auger @ 2015-06-26 17:29 UTC (permalink / raw)
  To: eric.auger, eric.auger, qemu-devel, peter.maydell,
	alex.williamson, pbonzini
  Cc: peter.crosthwaite, christoffer.dall, patches

Commit f41389ae3c54b introduced kvm_resamplefds_enabled() and
associated kvm_resamplefds_allowed boolean. This patch adds
non-KVM version for kvm_resamplefds_enabled and also declares
kvm_resamplefds_allowed in kvm-stub as it is done for fellow
kvm_irqfds_allowed.

Signed-off-by: Eric Auger <eric.auger@linaro.org>
---
 include/sysemu/kvm.h | 1 +
 kvm-stub.c           | 1 +
 2 files changed, 2 insertions(+)

diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index ba612fc..983e99e 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -152,6 +152,7 @@ extern bool kvm_readonly_mem_allowed;
 #define kvm_halt_in_kernel() (false)
 #define kvm_eventfds_enabled() (false)
 #define kvm_irqfds_enabled() (false)
+#define kvm_resamplefds_enabled() (false)
 #define kvm_msi_via_irqfd_enabled() (false)
 #define kvm_gsi_routing_allowed() (false)
 #define kvm_gsi_direct_mapping() (false)
diff --git a/kvm-stub.c b/kvm-stub.c
index 977de21..d9ad624 100644
--- a/kvm-stub.c
+++ b/kvm-stub.c
@@ -24,6 +24,7 @@ bool kvm_kernel_irqchip;
 bool kvm_async_interrupts_allowed;
 bool kvm_eventfds_allowed;
 bool kvm_irqfds_allowed;
+bool kvm_resamplefds_allowed;
 bool kvm_msi_via_irqfd_allowed;
 bool kvm_gsi_routing_allowed;
 bool kvm_gsi_direct_mapping;
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v18 6/6] hw/vfio/platform: add irqfd support
  2015-06-26 17:29 [Qemu-devel] [PATCH v18 0/6] KVM platform device passthrough Eric Auger
                   ` (4 preceding siblings ...)
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 5/6] kvm: some fixes to kvm_resamplefds_allowed Eric Auger
@ 2015-06-26 17:29 ` Eric Auger
  2015-06-29  9:49   ` Peter Maydell
  5 siblings, 1 reply; 14+ messages in thread
From: Eric Auger @ 2015-06-26 17:29 UTC (permalink / raw)
  To: eric.auger, eric.auger, qemu-devel, peter.maydell,
	alex.williamson, pbonzini
  Cc: peter.crosthwaite, christoffer.dall, patches

This patch aims at optimizing IRQ handling using irqfd framework.

Instead of handling the eventfds on user-side they are handled on
kernel side using
- the KVM irqfd framework,
- the VFIO driver virqfd framework.

the virtual IRQ completion is trapped at interrupt controller
This removes the need for fast/slow path swap.

Overall this brings significant performance improvements.

Signed-off-by: Alvise Rigo <a.rigo@virtualopensystems.com>
Signed-off-by: Eric Auger <eric.auger@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Tested-by: Vikram Sethi <vikrams@codeaurora.org>

---
v17 -> v18:
- remove found in vfio_start_irqfd_injection
- unconditionnally set sbc->connect_irq_notifier in the class_init
  function and do the proper check in vfio_start_irqfd_injection

v16 -> v17:
- Take into account Peter's comments
- most importantly remove #ifdef CONFIG_KVM

v15 -> v16:
- add Vikram's T-b

v13 -> v14:
- use connect_irq_notifier
- remove trace_vfio_platform_start_eventfd

v12 -> v13:
- setup the new mechanism for starting irqfd, based on
  LinkPropertySetter override
- use kvm_irqchip_[add,remove]_irqfd_notifier new functions: no need
  to bother about gsi (hence virtualID could be removed with small
  change in trace-events)

v10 -> v11:
- Add Alex' Reviewed-by
- introduce kvm_accel in this patch and initialize it

v5 -> v6
- rely on kvm_irqfds_enabled() and kvm_resamplefds_enabled()
- guard KVM code with #ifdef CONFIG_KVM

v3 -> v4:
[Alvise Rigo]
Use of VFIO Platform driver v6 unmask/virqfd feature and removal
of resamplefd handler. Physical IRQ unmasking is now done in
VFIO driver.

v3:
[Eric Auger]
initial support with resamplefd handled on QEMU side since the
unmask was not supported on VFIO platform driver v5.
---
 hw/vfio/platform.c              | 100 ++++++++++++++++++++++++++++++++++++++++
 include/hw/vfio/vfio-platform.h |   2 +
 trace-events                    |   1 +
 3 files changed, 103 insertions(+)

diff --git a/hw/vfio/platform.c b/hw/vfio/platform.c
index 5c678b9..60365d1 100644
--- a/hw/vfio/platform.c
+++ b/hw/vfio/platform.c
@@ -26,6 +26,7 @@
 #include "hw/sysbus.h"
 #include "trace.h"
 #include "hw/platform-bus.h"
+#include "sysemu/kvm.h"
 
 /*
  * Functions used whatever the injection method
@@ -51,6 +52,7 @@ static VFIOINTp *vfio_init_intp(VFIODevice *vbasedev,
     intp->pin = info.index;
     intp->flags = info.flags;
     intp->state = VFIO_IRQ_INACTIVE;
+    intp->kvm_accel = false;
 
     sysbus_init_irq(sbdev, &intp->qemuirq);
 
@@ -61,6 +63,13 @@ static VFIOINTp *vfio_init_intp(VFIODevice *vbasedev,
         error_report("vfio: Error: trigger event_notifier_init failed ");
         return NULL;
     }
+    /* Get an eventfd for resample/unmask */
+    ret = event_notifier_init(&intp->unmask, 0);
+    if (ret) {
+        g_free(intp);
+        error_report("vfio: Error: resamplefd event_notifier_init failed");
+        return NULL;
+    }
 
     QLIST_INSERT_HEAD(&vdev->intp_list, intp, next);
     return intp;
@@ -315,6 +324,94 @@ static int vfio_start_eventfd_injection(VFIOINTp *intp)
     return ret;
 }
 
+/*
+ * Functions used for irqfd
+ */
+
+/**
+ * vfio_set_resample_eventfd - sets the resamplefd for an IRQ
+ * @intp: the IRQ struct handle
+ * programs the VFIO driver to unmask this IRQ when the
+ * intp->unmask eventfd is triggered
+ */
+static int vfio_set_resample_eventfd(VFIOINTp *intp)
+{
+    VFIODevice *vbasedev = &intp->vdev->vbasedev;
+    struct vfio_irq_set *irq_set;
+    int argsz, ret;
+    int32_t *pfd;
+
+    argsz = sizeof(*irq_set) + sizeof(*pfd);
+    irq_set = g_malloc0(argsz);
+    irq_set->argsz = argsz;
+    irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_UNMASK;
+    irq_set->index = intp->pin;
+    irq_set->start = 0;
+    irq_set->count = 1;
+    pfd = (int32_t *)&irq_set->data;
+    *pfd = event_notifier_get_fd(&intp->unmask);
+    qemu_set_fd_handler(*pfd, NULL, NULL, NULL);
+    ret = ioctl(vbasedev->fd, VFIO_DEVICE_SET_IRQS, irq_set);
+    g_free(irq_set);
+    if (ret < 0) {
+        error_report("vfio: Failed to set resample eventfd: %m");
+    }
+    return ret;
+}
+
+static void vfio_start_irqfd_injection(SysBusDevice *sbdev, qemu_irq irq)
+{
+    VFIOPlatformDevice *vdev = VFIO_PLATFORM_DEVICE(sbdev);
+    VFIOINTp *intp;
+
+    if (!kvm_irqfds_enabled() || !kvm_resamplefds_enabled() ||
+        !vdev->irqfd_allowed) {
+        return;
+    }
+
+    QLIST_FOREACH(intp, &vdev->intp_list, next) {
+        if (intp->qemuirq == irq) {
+            break;
+        }
+    }
+    assert(intp);
+
+    /* Get to a known interrupt state */
+    qemu_set_fd_handler(event_notifier_get_fd(&intp->interrupt),
+                        NULL, NULL, vdev);
+
+    vfio_mask_single_irqindex(&vdev->vbasedev, intp->pin);
+    qemu_set_irq(intp->qemuirq, 0);
+
+    if (kvm_irqchip_add_irqfd_notifier(kvm_state, &intp->interrupt,
+                                   &intp->unmask, irq) < 0) {
+        goto fail_irqfd;
+    }
+
+    if (vfio_set_trigger_eventfd(intp, NULL) < 0) {
+        goto fail_vfio;
+    }
+    if (vfio_set_resample_eventfd(intp) < 0) {
+        goto fail_vfio;
+    }
+
+    /* Let's resume injection with irqfd setup */
+    vfio_unmask_single_irqindex(&vdev->vbasedev, intp->pin);
+
+    intp->kvm_accel = true;
+
+    trace_vfio_platform_start_irqfd_injection(intp->pin,
+                                     event_notifier_get_fd(&intp->interrupt),
+                                     event_notifier_get_fd(&intp->unmask));
+    return;
+fail_vfio:
+    kvm_irqchip_remove_irqfd_notifier(kvm_state, &intp->interrupt, irq);
+fail_irqfd:
+    vfio_start_eventfd_injection(intp);
+    vfio_unmask_single_irqindex(&vdev->vbasedev, intp->pin);
+    return;
+}
+
 /* VFIO skeleton */
 
 static void vfio_platform_compute_needs_reset(VFIODevice *vbasedev)
@@ -584,17 +681,20 @@ static Property vfio_platform_dev_properties[] = {
     DEFINE_PROP_BOOL("x-mmap", VFIOPlatformDevice, vbasedev.allow_mmap, true),
     DEFINE_PROP_UINT32("mmap-timeout-ms", VFIOPlatformDevice,
                        mmap_timeout, 1100),
+    DEFINE_PROP_BOOL("x-irqfd", VFIOPlatformDevice, irqfd_allowed, true),
     DEFINE_PROP_END_OF_LIST(),
 };
 
 static void vfio_platform_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
+    SysBusDeviceClass *sbc = SYS_BUS_DEVICE_CLASS(klass);
 
     dc->realize = vfio_platform_realize;
     dc->props = vfio_platform_dev_properties;
     dc->vmsd = &vfio_platform_vmstate;
     dc->desc = "VFIO-based platform device assignment";
+    sbc->connect_irq_notifier = vfio_start_irqfd_injection;
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 }
 
diff --git a/include/hw/vfio/vfio-platform.h b/include/hw/vfio/vfio-platform.h
index 26b2ad6..c5cf1d7 100644
--- a/include/hw/vfio/vfio-platform.h
+++ b/include/hw/vfio/vfio-platform.h
@@ -41,6 +41,7 @@ typedef struct VFIOINTp {
     int state; /* inactive, pending, active */
     uint8_t pin; /* index */
     uint32_t flags; /* IRQ info flags */
+    bool kvm_accel; /* set when QEMU bypass through KVM enabled */
 } VFIOINTp;
 
 /* function type for user side eventfd handler */
@@ -57,6 +58,7 @@ typedef struct VFIOPlatformDevice {
     uint32_t mmap_timeout; /* delay to re-enable mmaps after interrupt */
     QEMUTimer *mmap_timer; /* allows fast-path resume after IRQ hit */
     QemuMutex intp_mutex; /* protect the intp_list IRQ state */
+    bool irqfd_allowed; /* debug option to force irqfd on/off */
 } VFIOPlatformDevice;
 
 typedef struct VFIOPlatformDeviceClass {
diff --git a/trace-events b/trace-events
index 52b7efa..d24d80a 100644
--- a/trace-events
+++ b/trace-events
@@ -1594,6 +1594,7 @@ vfio_platform_intp_interrupt(int pin, int fd) "Inject IRQ #%d (fd = %d)"
 vfio_platform_intp_inject_pending_lockheld(int pin, int fd) "Inject pending IRQ #%d (fd = %d)"
 vfio_platform_populate_interrupts(int pin, int count, int flags) "- IRQ index %d: count %d, flags=0x%x"
 vfio_intp_interrupt_set_pending(int index) "irq %d is set PENDING"
+vfio_platform_start_irqfd_injection(int index, int fd, int resamplefd) "IRQ index=%d, fd = %d, resamplefd = %d"
 
 #hw/acpi/memory_hotplug.c
 mhp_acpi_invalid_slot_selected(uint32_t slot) "0x%"PRIx32
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v18 1/6] kvm: rename kvm_irqchip_[add, remove]_irqfd_notifier with gsi suffix
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 1/6] kvm: rename kvm_irqchip_[add, remove]_irqfd_notifier with gsi suffix Eric Auger
@ 2015-06-29  9:37   ` Peter Maydell
  0 siblings, 0 replies; 14+ messages in thread
From: Peter Maydell @ 2015-06-29  9:37 UTC (permalink / raw)
  To: Eric Auger
  Cc: Peter Crosthwaite, eric.auger, Patch Tracking, QEMU Developers,
	Alex Williamson, Paolo Bonzini, Christoffer Dall

On 26 June 2015 at 18:29, Eric Auger <eric.auger@linaro.org> wrote:
> Anticipating for the introduction of new add/remove functions taking
> a qemu_irq parameter, let's rename existing ones with a gsi suffix.
>
> Signed-off-by: Eric Auger <eric.auger@linaro.org>
> Tested-by: Vikram Sethi <vikrams@codeaurora.org>
> Acked-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v18 2/6] kvm-all.c: add qemu_irq/gsi hash table and utility routines
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 2/6] kvm-all.c: add qemu_irq/gsi hash table and utility routines Eric Auger
@ 2015-06-29  9:42   ` Peter Maydell
  0 siblings, 0 replies; 14+ messages in thread
From: Peter Maydell @ 2015-06-29  9:42 UTC (permalink / raw)
  To: Eric Auger
  Cc: Peter Crosthwaite, eric.auger, Patch Tracking, QEMU Developers,
	Alex Williamson, Paolo Bonzini, Christoffer Dall

On 26 June 2015 at 18:29, Eric Auger <eric.auger@linaro.org> wrote:
> VFIO platform device needs to setup irqfd but it does not know the
> gsi corresponding to the device qemu_irq. This patch proposes to
> store a hash table in kvm_state using the qemu_irq as key and the gsi
> as a value.
>
> kvm_irqchip_set_qemuirq_gsi allows to insert such a pair. The interrupt
> controller is supposed to use it.
>
> kvm_irqchip_[add, remove]_irqfd_notifier allows to setup/tear down
> irqfd directly from the qemu_irq.
>
> Signed-off-by: Eric Auger <eric.auger@linaro.org>
> Tested-by: Vikram Sethi <vikrams@codeaurora.org>
> Acked-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v18 3/6] intc: arm_gic_kvm: set the qemu_irq/gsi mapping
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 3/6] intc: arm_gic_kvm: set the qemu_irq/gsi mapping Eric Auger
@ 2015-06-29  9:43   ` Peter Maydell
  0 siblings, 0 replies; 14+ messages in thread
From: Peter Maydell @ 2015-06-29  9:43 UTC (permalink / raw)
  To: Eric Auger
  Cc: Peter Crosthwaite, eric.auger, Patch Tracking, QEMU Developers,
	Alex Williamson, Paolo Bonzini, Christoffer Dall

On 26 June 2015 at 18:29, Eric Auger <eric.auger@linaro.org> wrote:
> The arm_gic_kvm now calls kvm_irqchip_set_qemuirq_gsi to build
> the hash table storing qemu_irq/gsi mappings. From that point on
> irqfd can be setup directly from the qemu_irq using
> kvm_irqchip_add_irqfd_notifier.
>
> Signed-off-by: Eric Auger <eric.auger@linaro.org>
> Tested-by: Vikram Sethi <vikrams@codeaurora.org>
> Acked-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v18 4/6] sysbus: add irq_routing_notifier
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 4/6] sysbus: add irq_routing_notifier Eric Auger
@ 2015-06-29  9:44   ` Peter Maydell
  0 siblings, 0 replies; 14+ messages in thread
From: Peter Maydell @ 2015-06-29  9:44 UTC (permalink / raw)
  To: Eric Auger
  Cc: Peter Crosthwaite, eric.auger, Patch Tracking, QEMU Developers,
	Alex Williamson, Paolo Bonzini, Christoffer Dall

On 26 June 2015 at 18:29, Eric Auger <eric.auger@linaro.org> wrote:
> Add a new connect_irq_notifier notifier in the SysBusDeviceClass. This
> notifier, if populated, is called after sysbus_connect_irq.
>
> This mechanism is used to setup VFIO signaling once VFIO platform
> devices get attached to their platform bus, on a machine init done
> notifier.
>
> Signed-off-by: Eric Auger <eric.auger@linaro.org>
> Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> Tested-by: Vikram Sethi <vikrams@codeaurora.org>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v18 5/6] kvm: some fixes to kvm_resamplefds_allowed
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 5/6] kvm: some fixes to kvm_resamplefds_allowed Eric Auger
@ 2015-06-29  9:47   ` Peter Maydell
  2015-06-29  9:49     ` Eric Auger
  0 siblings, 1 reply; 14+ messages in thread
From: Peter Maydell @ 2015-06-29  9:47 UTC (permalink / raw)
  To: Eric Auger
  Cc: Peter Crosthwaite, eric.auger, Patch Tracking, QEMU Developers,
	Alex Williamson, Paolo Bonzini, Christoffer Dall

On 26 June 2015 at 18:29, Eric Auger <eric.auger@linaro.org> wrote:
> Commit f41389ae3c54b introduced kvm_resamplefds_enabled() and
> associated kvm_resamplefds_allowed boolean. This patch adds
> non-KVM version for kvm_resamplefds_enabled and also declares
> kvm_resamplefds_allowed in kvm-stub as it is done for fellow
> kvm_irqfds_allowed.
>
> Signed-off-by: Eric Auger <eric.auger@linaro.org>
> ---
>  include/sysemu/kvm.h | 1 +
>  kvm-stub.c           | 1 +
>  2 files changed, 2 insertions(+)
>
> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> index ba612fc..983e99e 100644
> --- a/include/sysemu/kvm.h
> +++ b/include/sysemu/kvm.h
> @@ -152,6 +152,7 @@ extern bool kvm_readonly_mem_allowed;
>  #define kvm_halt_in_kernel() (false)
>  #define kvm_eventfds_enabled() (false)
>  #define kvm_irqfds_enabled() (false)
> +#define kvm_resamplefds_enabled() (false)
>  #define kvm_msi_via_irqfd_enabled() (false)
>  #define kvm_gsi_routing_allowed() (false)
>  #define kvm_gsi_direct_mapping() (false)
> diff --git a/kvm-stub.c b/kvm-stub.c
> index 977de21..d9ad624 100644
> --- a/kvm-stub.c
> +++ b/kvm-stub.c
> @@ -24,6 +24,7 @@ bool kvm_kernel_irqchip;
>  bool kvm_async_interrupts_allowed;
>  bool kvm_eventfds_allowed;
>  bool kvm_irqfds_allowed;
> +bool kvm_resamplefds_allowed;
>  bool kvm_msi_via_irqfd_allowed;
>  bool kvm_gsi_routing_allowed;
>  bool kvm_gsi_direct_mapping;
> --
> 1.8.3.2

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

though "kvm: implement kvm_resamplefds_enabled() for !CONFIG_KVM"
might be a more informative subject line if you need to respin
for some other reason.

thanks
-- PMM

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v18 5/6] kvm: some fixes to kvm_resamplefds_allowed
  2015-06-29  9:47   ` Peter Maydell
@ 2015-06-29  9:49     ` Eric Auger
  0 siblings, 0 replies; 14+ messages in thread
From: Eric Auger @ 2015-06-29  9:49 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Peter Crosthwaite, eric.auger, Patch Tracking, QEMU Developers,
	Alex Williamson, Paolo Bonzini, Christoffer Dall

On 06/29/2015 11:47 AM, Peter Maydell wrote:
> On 26 June 2015 at 18:29, Eric Auger <eric.auger@linaro.org> wrote:
>> Commit f41389ae3c54b introduced kvm_resamplefds_enabled() and
>> associated kvm_resamplefds_allowed boolean. This patch adds
>> non-KVM version for kvm_resamplefds_enabled and also declares
>> kvm_resamplefds_allowed in kvm-stub as it is done for fellow
>> kvm_irqfds_allowed.
>>
>> Signed-off-by: Eric Auger <eric.auger@linaro.org>
>> ---
>>  include/sysemu/kvm.h | 1 +
>>  kvm-stub.c           | 1 +
>>  2 files changed, 2 insertions(+)
>>
>> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
>> index ba612fc..983e99e 100644
>> --- a/include/sysemu/kvm.h
>> +++ b/include/sysemu/kvm.h
>> @@ -152,6 +152,7 @@ extern bool kvm_readonly_mem_allowed;
>>  #define kvm_halt_in_kernel() (false)
>>  #define kvm_eventfds_enabled() (false)
>>  #define kvm_irqfds_enabled() (false)
>> +#define kvm_resamplefds_enabled() (false)
>>  #define kvm_msi_via_irqfd_enabled() (false)
>>  #define kvm_gsi_routing_allowed() (false)
>>  #define kvm_gsi_direct_mapping() (false)
>> diff --git a/kvm-stub.c b/kvm-stub.c
>> index 977de21..d9ad624 100644
>> --- a/kvm-stub.c
>> +++ b/kvm-stub.c
>> @@ -24,6 +24,7 @@ bool kvm_kernel_irqchip;
>>  bool kvm_async_interrupts_allowed;
>>  bool kvm_eventfds_allowed;
>>  bool kvm_irqfds_allowed;
>> +bool kvm_resamplefds_allowed;
>>  bool kvm_msi_via_irqfd_allowed;
>>  bool kvm_gsi_routing_allowed;
>>  bool kvm_gsi_direct_mapping;
>> --
>> 1.8.3.2
> 
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> 
> though "kvm: implement kvm_resamplefds_enabled() for !CONFIG_KVM"
> might be a more informative subject line if you need to respin
> for some other reason.

OK. Thanks for the whole review

Best Regards

Eric
> 
> thanks
> -- PMM
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v18 6/6] hw/vfio/platform: add irqfd support
  2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 6/6] hw/vfio/platform: add irqfd support Eric Auger
@ 2015-06-29  9:49   ` Peter Maydell
  0 siblings, 0 replies; 14+ messages in thread
From: Peter Maydell @ 2015-06-29  9:49 UTC (permalink / raw)
  To: Eric Auger
  Cc: Peter Crosthwaite, eric.auger, Patch Tracking, QEMU Developers,
	Alex Williamson, Paolo Bonzini, Christoffer Dall

On 26 June 2015 at 18:29, Eric Auger <eric.auger@linaro.org> wrote:
> This patch aims at optimizing IRQ handling using irqfd framework.
>
> Instead of handling the eventfds on user-side they are handled on
> kernel side using
> - the KVM irqfd framework,
> - the VFIO driver virqfd framework.
>
> the virtual IRQ completion is trapped at interrupt controller
> This removes the need for fast/slow path swap.
>
> Overall this brings significant performance improvements.
>
> Signed-off-by: Alvise Rigo <a.rigo@virtualopensystems.com>
> Signed-off-by: Eric Auger <eric.auger@linaro.org>
> Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
> Tested-by: Vikram Sethi <vikrams@codeaurora.org>

Acked-by: Peter Maydell <peter.maydell@linaro.org>

(by which I mean that I can't see anything obviously
wrong and am happy for this mostly-ARM-related feature
to go in, but am not qualified to review or test it;
I think we've agreed that this patchset will all go
in via Alex Williamson's tree.)

thanks
-- PMM

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2015-06-29  9:50 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-26 17:29 [Qemu-devel] [PATCH v18 0/6] KVM platform device passthrough Eric Auger
2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 1/6] kvm: rename kvm_irqchip_[add, remove]_irqfd_notifier with gsi suffix Eric Auger
2015-06-29  9:37   ` Peter Maydell
2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 2/6] kvm-all.c: add qemu_irq/gsi hash table and utility routines Eric Auger
2015-06-29  9:42   ` Peter Maydell
2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 3/6] intc: arm_gic_kvm: set the qemu_irq/gsi mapping Eric Auger
2015-06-29  9:43   ` Peter Maydell
2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 4/6] sysbus: add irq_routing_notifier Eric Auger
2015-06-29  9:44   ` Peter Maydell
2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 5/6] kvm: some fixes to kvm_resamplefds_allowed Eric Auger
2015-06-29  9:47   ` Peter Maydell
2015-06-29  9:49     ` Eric Auger
2015-06-26 17:29 ` [Qemu-devel] [PATCH v18 6/6] hw/vfio/platform: add irqfd support Eric Auger
2015-06-29  9:49   ` Peter Maydell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.