qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: anthony@codemonkey.ws
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 25/38] ide: Register vm change state handler once only
Date: Fri, 17 Dec 2010 18:44:40 +0100	[thread overview]
Message-ID: <1292607893-13461-26-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1292607893-13461-1-git-send-email-kwolf@redhat.com>

From: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>

We register the vm change state handler in a PCI BAR map() function.
This function can be called multiple times throughout the lifetime of a
PCI IDE device.  This results in duplicate vm change state handlers
being register, none of which are ever unregistered.

Instead, register the vm change state handler in the device's init
function once and for all.

piix tested, cmd646 and via not tested.

Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 hw/ide/cmd646.c |   18 ++++++++++--------
 hw/ide/piix.c   |   34 ++++++++++++++++++++++++----------
 hw/ide/via.c    |   34 ++++++++++++++++++++++++----------
 3 files changed, 58 insertions(+), 28 deletions(-)

diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c
index e191ee6..89ba836 100644
--- a/hw/ide/cmd646.c
+++ b/hw/ide/cmd646.c
@@ -167,10 +167,6 @@ static void bmdma_map(PCIDevice *pci_dev, int region_num,
 
     for(i = 0;i < 2; i++) {
         BMDMAState *bm = &d->bmdma[i];
-        bmdma_init(&d->bus[i], bm);
-        bm->bus = d->bus+i;
-        qemu_add_vm_change_state_handler(d->bus[i].dma->ops->restart_cb,
-                                         &bm->dma);
 
         if (i == 0) {
             register_ioport_write(addr, 4, 1, bmdma_writeb_0, d);
@@ -228,6 +224,7 @@ static int pci_cmd646_ide_initfn(PCIDevice *dev)
     PCIIDEState *d = DO_UPCAST(PCIIDEState, dev, dev);
     uint8_t *pci_conf = d->dev.config;
     qemu_irq *irq;
+    int i;
 
     pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_CMD);
     pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_CMD_646);
@@ -253,10 +250,15 @@ static int pci_cmd646_ide_initfn(PCIDevice *dev)
     pci_conf[PCI_INTERRUPT_PIN] = 0x01; // interrupt on pin 1
 
     irq = qemu_allocate_irqs(cmd646_set_irq, d, 2);
-    ide_bus_new(&d->bus[0], &d->dev.qdev, 0);
-    ide_bus_new(&d->bus[1], &d->dev.qdev, 1);
-    ide_init2(&d->bus[0], irq[0]);
-    ide_init2(&d->bus[1], irq[1]);
+    for (i = 0; i < 2; i++) {
+        ide_bus_new(&d->bus[i], &d->dev.qdev, i);
+        ide_init2(&d->bus[i], irq[i]);
+
+        bmdma_init(&d->bus[i], &d->bmdma[i]);
+        bm->bus = &d->bus[i];
+        qemu_add_vm_change_state_handler(d->bus[i].dma->ops->restart_cb,
+                                         &d->bmdma[i]->dma);
+    }
 
     vmstate_register(&dev->qdev, 0, &vmstate_ide_pci, d);
     qemu_register_reset(cmd646_reset, d);
diff --git a/hw/ide/piix.c b/hw/ide/piix.c
index a6b5d92..1cad906 100644
--- a/hw/ide/piix.c
+++ b/hw/ide/piix.c
@@ -76,10 +76,6 @@ static void bmdma_map(PCIDevice *pci_dev, int region_num,
 
     for(i = 0;i < 2; i++) {
         BMDMAState *bm = &d->bmdma[i];
-        bmdma_init(&d->bus[i], bm);
-        bm->bus = d->bus+i;
-        qemu_add_vm_change_state_handler(d->bus[i].dma->ops->restart_cb,
-                                         &bm->dma);
 
         register_ioport_write(addr, 1, 1, bmdma_cmd_writeb, bm);
 
@@ -112,6 +108,29 @@ static void piix3_reset(void *opaque)
     pci_conf[0x20] = 0x01; /* BMIBA: 20-23h */
 }
 
+static void pci_piix_init_ports(PCIIDEState *d) {
+    int i;
+    struct {
+        int iobase;
+        int iobase2;
+        int isairq;
+    } port_info[] = {
+        {0x1f0, 0x3f6, 14},
+        {0x170, 0x376, 15},
+    };
+
+    for (i = 0; i < 2; i++) {
+        ide_bus_new(&d->bus[i], &d->dev.qdev, i);
+        ide_init_ioport(&d->bus[i], port_info[i].iobase, port_info[i].iobase2);
+        ide_init2(&d->bus[i], isa_reserve_irq(port_info[i].isairq));
+
+        bmdma_init(&d->bus[i], &d->bmdma[i]);
+        d->bmdma[i].bus = &d->bus[i];
+        qemu_add_vm_change_state_handler(d->bus[i].dma->ops->restart_cb,
+                                         &d->bmdma[i].dma);
+    }
+}
+
 static int pci_piix_ide_initfn(PCIIDEState *d)
 {
     uint8_t *pci_conf = d->dev.config;
@@ -125,13 +144,8 @@ static int pci_piix_ide_initfn(PCIIDEState *d)
 
     vmstate_register(&d->dev.qdev, 0, &vmstate_ide_pci, d);
 
-    ide_bus_new(&d->bus[0], &d->dev.qdev, 0);
-    ide_bus_new(&d->bus[1], &d->dev.qdev, 1);
-    ide_init_ioport(&d->bus[0], 0x1f0, 0x3f6);
-    ide_init_ioport(&d->bus[1], 0x170, 0x376);
+    pci_piix_init_ports(d);
 
-    ide_init2(&d->bus[0], isa_reserve_irq(14));
-    ide_init2(&d->bus[1], isa_reserve_irq(15));
     return 0;
 }
 
diff --git a/hw/ide/via.c b/hw/ide/via.c
index 2603110..5b70bd2 100644
--- a/hw/ide/via.c
+++ b/hw/ide/via.c
@@ -78,10 +78,6 @@ static void bmdma_map(PCIDevice *pci_dev, int region_num,
 
     for(i = 0;i < 2; i++) {
         BMDMAState *bm = &d->bmdma[i];
-        bmdma_init(&d->bus[i], bm);
-        bm->bus = d->bus+i;
-        qemu_add_vm_change_state_handler(d->bus[i].dma->ops->restart_cb,
-                                         &bm->dma);
 
         register_ioport_write(addr, 1, 1, bmdma_cmd_writeb, bm);
 
@@ -135,6 +131,29 @@ static void via_reset(void *opaque)
     pci_set_long(pci_conf + 0xc0, 0x00020001);
 }
 
+static void vt82c686b_init_ports(PCIIDEState *d) {
+    int i;
+    struct {
+        int iobase;
+        int iobase2;
+        int isairq;
+    } port_info[] = {
+        {0x1f0, 0x3f6, 14},
+        {0x170, 0x376, 15},
+    };
+
+    for (i = 0; i < 2; i++) {
+        ide_bus_new(&d->bus[i], &d->dev.qdev, i);
+        ide_init_ioport(&d->bus[i], port_info[i].iobase, port_info[i].iobase2);
+        ide_init2(&d->bus[i], isa_reserve_irq(port_info[i].isairq));
+
+        bmdma_init(&d->bus[i], &d->bmdma[i]);
+        d->bmdma[i].bus = &d->bus[i];
+        qemu_add_vm_change_state_handler(d->bus[i].dma->ops->restart_cb,
+                                         &d->bmdma[i]->dma);
+    }
+}
+
 /* via ide func */
 static int vt82c686b_ide_initfn(PCIDevice *dev)
 {
@@ -154,12 +173,7 @@ static int vt82c686b_ide_initfn(PCIDevice *dev)
 
     vmstate_register(&dev->qdev, 0, &vmstate_ide_pci, d);
 
-    ide_bus_new(&d->bus[0], &d->dev.qdev, 0);
-    ide_bus_new(&d->bus[1], &d->dev.qdev, 1);
-    ide_init2(&d->bus[0], isa_reserve_irq(14));
-    ide_init2(&d->bus[1], isa_reserve_irq(15));
-    ide_init_ioport(&d->bus[0], 0x1f0, 0x3f6);
-    ide_init_ioport(&d->bus[1], 0x170, 0x376);
+    vt82c686b_init_ports(d);
 
     return 0;
 }
-- 
1.7.2.3

  parent reply	other threads:[~2010-12-17 17:46 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-17 17:44 [Qemu-devel] [PULL 00/38] Block patches Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 01/38] blockdev: check dinfo ptr before using Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 02/38] block: Introduce path_has_protocol() function Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 03/38] block: Fix the use of protocols in backing files Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 04/38] Introduce strtosz_suffix() Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 05/38] qemu-img.c: Clean up handling of image size in img_create() Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 06/38] ide: split ide command interpretation off Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 07/38] ide: fix whitespace gap in ide_exec_cmd Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 08/38] ide: Split out BMDMA code from ATA core Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 09/38] ide: move transfer_start after variable modification Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 10/38] ide: add ncq identify data for ahci sata drives Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 11/38] pci: add storage class for sata Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 12/38] pci: add ich9 pci id Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 13/38] ahci: add ahci emulation Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 14/38] config: move ide core and pci to pci.mak Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 15/38] config: add ahci for pci capable machines Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 16/38] ahci: set SATA Mode Select Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 17/38] ide: honor ncq for atapi Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 18/38] qemu-img: Call error_set_progname Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 19/38] qemu-img.c: Re-factor img_create() Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 20/38] Introduce do_snapshot_blkdev() and monitor command to handle it Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 21/38] Prevent creating an image with the same filename as backing file Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 22/38] bdrv_img_create() use proper errno return values Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 23/38] qemu.img.c: Use error_report() instead of own error() implementation Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 24/38] Remove NULL checks for bdrv_new return value Kevin Wolf
2010-12-17 17:44 ` Kevin Wolf [this message]
2010-12-17 17:44 ` [Qemu-devel] [PATCH 26/38] block: add discard support Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 27/38] scsi-disk: support WRITE SAME (16) with unmap bit Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 28/38] qemu-io: Add discard command Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 29/38] raw-posix: add discard support Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 30/38] qemu-io: Fix typo in help texts Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 31/38] docs: Add QED image format specification Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 32/38] qed: Add QEMU Enhanced Disk image format Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 33/38] qed: Table, L2 cache, and cluster functions Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 34/38] qed: Read/write support Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 35/38] qed: Consistency check support Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 36/38] block/qcow2.c: rename qcow_ functions to qcow2_ Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 37/38] Add proper -errno error return values to qcow2_open() Kevin Wolf
2010-12-17 17:44 ` [Qemu-devel] [PATCH 38/38] docs: Fix missing carets in QED specification Kevin Wolf
2010-12-17 17:52 ` [Qemu-devel] Re: [PULL 00/38] Block patches Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1292607893-13461-26-git-send-email-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=anthony@codemonkey.ws \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).