[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH qom v1 3/4] irq: Allocate IRQs individually
From: |
Peter Crosthwaite |
Subject: |
[Qemu-devel] [PATCH qom v1 3/4] irq: Allocate IRQs individually |
Date: |
Mon, 2 Jun 2014 00:41:10 -0700 |
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: address@hidden
Cc: address@hidden
Signed-off-by: Peter Crosthwaite <address@hidden>
---
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 991c99f..73c1adb 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -148,7 +148,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 3d284c6..bc982a7 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 e65a5aa..02377c7 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -916,7 +916,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 ef032e6..59bfe28 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 d08bc02..9f34c96 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.0.0