From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43093) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z7hNX-0000Ah-HN for qemu-devel@nongnu.org; Wed, 24 Jun 2015 05:54:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z7hNU-0002kX-8y for qemu-devel@nongnu.org; Wed, 24 Jun 2015 05:53:59 -0400 Received: from mail-wi0-x22b.google.com ([2a00:1450:400c:c05::22b]:36648) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z7hNT-0002kE-Uh for qemu-devel@nongnu.org; Wed, 24 Jun 2015 05:53:56 -0400 Received: by wicnd19 with SMTP id nd19so130116050wic.1 for ; Wed, 24 Jun 2015 02:53:55 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <558A7E31.8010303@redhat.com> Date: Wed, 24 Jun 2015 11:53:53 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1434386038-9246-1-git-send-email-eric.auger@linaro.org> <1434386038-9246-4-git-send-email-eric.auger@linaro.org> In-Reply-To: <1434386038-9246-4-git-send-email-eric.auger@linaro.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RESEND PATCH v16 3/6] kvm-all.c: add qemu_irq/gsi hash table and utility routines List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Eric Auger , eric.auger@st.com, qemu-devel@nongnu.org, peter.maydell@linaro.org, peter.crosthwaite@xilinx.com, alex.williamson@redhat.com Cc: b.reynal@virtualopensystems.com, christoffer.dall@linaro.org, vikrams@codeaurora.org, patches@linaro.org On 15/06/2015 18:33, Eric Auger wrote: > VFIO platform device needs to setup irqfd but it does not know the > gsi corresponding to the device qemu_irq. This series 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 > Tested-by: Vikram Sethi Acked-by: Paolo Bonzini > --- > > 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 | 37 +++++++++++++++++++++++++++++++++++++ > 2 files changed, 43 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 > @@ -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..939bfc4 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,39 @@ 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; > + } else { > + return kvm_irqchip_add_irqfd_notifier_gsi(s, n, rn, > + GPOINTER_TO_UINT(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; > + } else { > + 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 +1406,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; > } > >