From f173d57a4cd3bb2a8362fe376cd9fd776b2f57d5 Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Wed, 18 Jun 2014 00:56:31 -0700 Subject: [PATCH] irq: Allocate IRQs individually MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Allocate each IRQ individually on array allocations. This prepares for QOMification of IRQs, where pointers to individual IRQs may be taken and handed around for usage as QOM Links. The g_renew() scheme used here is too fragile and would break all existing links should an IRQ list be extended. We now have to pass the IRQ count to qemu_free_irqs(). We have so few call sites however, so this change is reasonably trivial. Cc: agarcia@igalia.com Cc: mst@redhat.com Reviewed-by: Peter Maydell Acked-by: Alberto Garcia Signed-off-by: Peter Crosthwaite Signed-off-by: Andreas Färber --- hw/char/serial-pci.c | 2 +- hw/core/irq.c | 20 +++++++------------- hw/core/qdev.c | 2 +- hw/ipack/ipack.c | 2 +- include/hw/irq.h | 2 +- 5 files changed, 11 insertions(+), 17 deletions(-) diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c index 6c252966d5..f53bb9c5d0 100644 --- a/hw/char/serial-pci.c +++ b/hw/char/serial-pci.c @@ -152,7 +152,7 @@ static void multi_serial_pci_exit(PCIDevice *dev) g_free(pci->name[i]); } memory_region_destroy(&pci->iobar); - qemu_free_irqs(pci->irqs); + qemu_free_irqs(pci->irqs, pci->ports); } static const VMStateDescription vmstate_pci_serial = { diff --git a/hw/core/irq.c b/hw/core/irq.c index 3d284c6482..bc982a7dfa 100644 --- a/hw/core/irq.c +++ b/hw/core/irq.c @@ -42,23 +42,14 @@ qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler, void *opaque, int n) { qemu_irq *s; - struct IRQState *p; int i; if (!old) { n_old = 0; } s = old ? g_renew(qemu_irq, old, n + n_old) : g_new(qemu_irq, n); - p = old ? g_renew(struct IRQState, s[0], n + n_old) : - g_new(struct IRQState, n); - for (i = 0; i < n + n_old; i++) { - if (i >= n_old) { - p->handler = handler; - p->opaque = opaque; - p->n = i; - } - s[i] = p; - p++; + for (i = n_old; i < n + n_old; i++) { + s[i] = qemu_allocate_irq(handler, opaque, i); } return s; } @@ -80,9 +71,12 @@ qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n) return irq; } -void qemu_free_irqs(qemu_irq *s) +void qemu_free_irqs(qemu_irq *s, int n) { - g_free(s[0]); + int i; + for (i = 0; i < n; i++) { + qemu_free_irq(s[i]); + } g_free(s); } diff --git a/hw/core/qdev.c b/hw/core/qdev.c index d1eba3cc3d..371b42745e 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -949,7 +949,7 @@ static void device_finalize(Object *obj) QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) { QLIST_REMOVE(ngl, node); - qemu_free_irqs(ngl->in); + qemu_free_irqs(ngl->in, ngl->num_in); g_free(ngl->name); g_free(ngl); /* ngl->out irqs are owned by the other end and should not be freed diff --git a/hw/ipack/ipack.c b/hw/ipack/ipack.c index ef032e6604..59bfe2869e 100644 --- a/hw/ipack/ipack.c +++ b/hw/ipack/ipack.c @@ -66,7 +66,7 @@ static void ipack_device_unrealize(DeviceState *dev, Error **errp) return; } - qemu_free_irqs(idev->irq); + qemu_free_irqs(idev->irq, 2); } static Property ipack_device_props[] = { diff --git a/include/hw/irq.h b/include/hw/irq.h index d08bc02a0d..9f34c96aab 100644 --- a/include/hw/irq.h +++ b/include/hw/irq.h @@ -42,7 +42,7 @@ qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n); qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler, void *opaque, int n); -void qemu_free_irqs(qemu_irq *s); +void qemu_free_irqs(qemu_irq *s, int n); void qemu_free_irq(qemu_irq irq); /* Returns a new IRQ with opposite polarity. */ -- 2.11.4.GIT