From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46240) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bXv09-0004ct-IR for qemu-devel@nongnu.org; Thu, 11 Aug 2016 14:46:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bXv05-000368-Ca for qemu-devel@nongnu.org; Thu, 11 Aug 2016 14:46:44 -0400 Received: from mail-pa0-x242.google.com ([2607:f8b0:400e:c03::242]:34438) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bXv05-000361-1h for qemu-devel@nongnu.org; Thu, 11 Aug 2016 14:46:41 -0400 Received: by mail-pa0-x242.google.com with SMTP id hh10so179593pac.1 for ; Thu, 11 Aug 2016 11:46:40 -0700 (PDT) From: Ashijeet Acharya Date: Fri, 12 Aug 2016 00:15:58 +0530 Message-Id: <1470941158-7043-1-git-send-email-ashijeetacharya@gmail.com> In-Reply-To: References: Subject: [Qemu-devel] [PATCH] Fix memory leak in ide_register_restart_cb() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: jsnow@redhat.com Cc: pbonzini@redhat.com, qemu-devel@nongnu.org, Ashijeet Acharya Introduce VMChangeStateEntry parameter in ide_register_restart_cb() to handle possible memory leak from qemu_add_vm_change_state_handler(). Signed-off-by: Ashijeet Acharya --- hw/ide/ahci.c | 2 +- hw/ide/cmd646.c | 2 +- hw/ide/core.c | 4 ++-- hw/ide/isa.c | 3 ++- hw/ide/piix.c | 2 +- hw/ide/via.c | 2 +- include/hw/ide/ahci.h | 1 + include/hw/ide/internal.h | 2 +- include/hw/ide/pci.h | 1 + 9 files changed, 11 insertions(+), 8 deletions(-) diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index bcb9ff9..d7c96df 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -1476,7 +1476,7 @@ void ahci_realize(AHCIState *s, DeviceState *qdev, AddressSpace *as, int ports) ad->port_no = i; ad->port.dma = &ad->dma; ad->port.dma->ops = &ahci_dma_ops; - ide_register_restart_cb(&ad->port); + ide_register_restart_cb(&ad->port, s->vmstate); } } diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c index 9ebb8d4..b906aa7 100644 --- a/hw/ide/cmd646.c +++ b/hw/ide/cmd646.c @@ -369,7 +369,7 @@ static void pci_cmd646_ide_realize(PCIDevice *dev, Error **errp) bmdma_init(&d->bus[i], &d->bmdma[i], d); d->bmdma[i].bus = &d->bus[i]; - ide_register_restart_cb(&d->bus[i]); + ide_register_restart_cb(&d->bus[i], d->vmstate); } vmstate_register(DEVICE(dev), 0, &vmstate_ide_pci, d); diff --git a/hw/ide/core.c b/hw/ide/core.c index d117b7c..0a27d4d 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -2578,10 +2578,10 @@ static void ide_restart_cb(void *opaque, int running, RunState state) } } -void ide_register_restart_cb(IDEBus *bus) +void ide_register_restart_cb(IDEBus *bus, VMChangeStateEntry *e) { if (bus->dma->ops->restart_dma) { - qemu_add_vm_change_state_handler(ide_restart_cb, bus); + e = qemu_add_vm_change_state_handler(ide_restart_cb, bus); } } diff --git a/hw/ide/isa.c b/hw/ide/isa.c index 40213d6..74a5078 100644 --- a/hw/ide/isa.c +++ b/hw/ide/isa.c @@ -45,6 +45,7 @@ typedef struct ISAIDEState { uint32_t iobase2; uint32_t isairq; qemu_irq irq; + VMChangeStateEntry *vmstate; } ISAIDEState; static void isa_ide_reset(DeviceState *d) @@ -75,7 +76,7 @@ static void isa_ide_realizefn(DeviceState *dev, Error **errp) isa_init_irq(isadev, &s->irq, s->isairq); ide_init2(&s->bus, s->irq); vmstate_register(dev, 0, &vmstate_ide_isa, s); - ide_register_restart_cb(&s->bus); + ide_register_restart_cb(&s->bus, s->vmstate); } ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq, diff --git a/hw/ide/piix.c b/hw/ide/piix.c index c190fca..2c67508 100644 --- a/hw/ide/piix.c +++ b/hw/ide/piix.c @@ -144,7 +144,7 @@ static void pci_piix_init_ports(PCIIDEState *d) { bmdma_init(&d->bus[i], &d->bmdma[i], d); d->bmdma[i].bus = &d->bus[i]; - ide_register_restart_cb(&d->bus[i]); + ide_register_restart_cb(&d->bus[i], d->vmstate); } } diff --git a/hw/ide/via.c b/hw/ide/via.c index 5b32ecb..82fbbf0 100644 --- a/hw/ide/via.c +++ b/hw/ide/via.c @@ -167,7 +167,7 @@ static void vt82c686b_init_ports(PCIIDEState *d) { bmdma_init(&d->bus[i], &d->bmdma[i], d); d->bmdma[i].bus = &d->bus[i]; - ide_register_restart_cb(&d->bus[i]); + ide_register_restart_cb(&d->bus[i], d->vmstate); } } diff --git a/include/hw/ide/ahci.h b/include/hw/ide/ahci.h index 0ca7c65..fa4a680 100644 --- a/include/hw/ide/ahci.h +++ b/include/hw/ide/ahci.h @@ -298,6 +298,7 @@ typedef struct AHCIState { int32_t ports; qemu_irq irq; AddressSpace *as; + VMChangeStateEntry *vmstate; } AHCIState; typedef struct AHCIPCIState { diff --git a/include/hw/ide/internal.h b/include/hw/ide/internal.h index 7824bc3..a95e6e9 100644 --- a/include/hw/ide/internal.h +++ b/include/hw/ide/internal.h @@ -605,7 +605,7 @@ int ide_init_drive(IDEState *s, BlockBackend *blk, IDEDriveKind kind, int chs_trans); void ide_init2(IDEBus *bus, qemu_irq irq); void ide_init_ioport(IDEBus *bus, ISADevice *isa, int iobase, int iobase2); -void ide_register_restart_cb(IDEBus *bus); +void ide_register_restart_cb(IDEBus *bus, VMChangeStateEntry *e); void ide_exec_cmd(IDEBus *bus, uint32_t val); diff --git a/include/hw/ide/pci.h b/include/hw/ide/pci.h index dbc6a03..95df1c0 100644 --- a/include/hw/ide/pci.h +++ b/include/hw/ide/pci.h @@ -57,6 +57,7 @@ typedef struct PCIIDEState { uint32_t secondary; /* used only for cmd646 */ MemoryRegion bmdma_bar; CMD646BAR cmd646_bar[2]; /* used only for cmd646 */ + VMChangeStateEntry *vmstate; } PCIIDEState; -- 2.6.2