From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49463) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YpFp6-0004hA-Fg for qemu-devel@nongnu.org; Mon, 04 May 2015 08:50:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YpFp3-0007BA-OW for qemu-devel@nongnu.org; Mon, 04 May 2015 08:50:12 -0400 Received: from mail-wg0-f52.google.com ([74.125.82.52]:35926) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YpFp3-0007Au-F4 for qemu-devel@nongnu.org; Mon, 04 May 2015 08:50:09 -0400 Received: by wgen6 with SMTP id n6so148981049wge.3 for ; Mon, 04 May 2015 05:50:08 -0700 (PDT) From: Eric Auger Date: Mon, 4 May 2015 13:49:57 +0100 Message-Id: <1430743798-8839-4-git-send-email-eric.auger@linaro.org> In-Reply-To: <1430743798-8839-1-git-send-email-eric.auger@linaro.org> References: <1430743798-8839-1-git-send-email-eric.auger@linaro.org> Subject: [Qemu-devel] [RFC v2 3/4] kvm: add kvm_vfio_get_device_irq List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: eric.auger@st.com, eric.auger@linaro.org, qemu-devel@nongnu.org, alex.williamson@redhat.com Cc: b.reynal@virtualopensystems.com, kvmarm@lists.cs.columbia.edu, christoffer.dall@linaro.org, patches@linaro.org Since the introduction of the qemu_irq/gsi hash table in kvm, the gsi information is stored in kvm. New functions are introduced to allocate/populate a kvm_vfio_dev_irq struct pointer from a qemu_irq object and free it. Signed-off-by: Eric Auger --- include/sysemu/kvm.h | 5 +++++ kvm-all.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h index bc3f230..42cc6c4 100644 --- a/include/sysemu/kvm.h +++ b/include/sysemu/kvm.h @@ -423,6 +423,11 @@ int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n, 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); +struct kvm_vfio_dev_irq; +int kvm_vfio_get_device_irq(KVMState *s, int fd, int index, + int start, int count, qemu_irq irq, + struct kvm_vfio_dev_irq **vfio_dev_irq); +void kvm_vfio_put_device_irq(struct kvm_vfio_dev_irq *vfio_dev_irq); 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 d2cb7ed..83a9689 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1454,6 +1454,38 @@ static int kvm_irqchip_create(MachineState *machine, KVMState *s) return 0; } +int kvm_vfio_get_device_irq(KVMState *s, int fd, int index, + int start, int count, qemu_irq irq, + struct kvm_vfio_dev_irq **vfio_dev_irq) +{ + gpointer key, gsi; + gboolean found = g_hash_table_lookup_extended(s->gsimap, irq, &key, &gsi); + struct kvm_vfio_dev_irq *pirq; + __u32 *pgsi; + int argsz; + + if (!found) { + return -ENXIO; + } + + argsz = sizeof(*pirq) + sizeof(*pgsi); + pirq = g_malloc0(argsz); + pirq->argsz = argsz; + pirq->fd = fd; + pirq->index = index; + pirq->start = start; + pirq->count = count; + pgsi = (__u32 *)&pirq->gsi; + *pgsi = GPOINTER_TO_INT(gsi); + *vfio_dev_irq = pirq; + return 0; +} + +void kvm_vfio_put_device_irq(struct kvm_vfio_dev_irq *vfio_dev_irq) +{ + g_free(vfio_dev_irq); +} + /* Find number of supported CPUs using the recommended * procedure from the kernel API documentation to cope with * older kernels that may be missing capabilities. -- 1.8.3.2