From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41146) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSmSo-0008O1-Dl for qemu-devel@nongnu.org; Thu, 28 Jul 2016 10:39:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bSmSl-0000n5-Qb for qemu-devel@nongnu.org; Thu, 28 Jul 2016 10:39:05 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51096) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSmSl-0000n0-Ij for qemu-devel@nongnu.org; Thu, 28 Jul 2016 10:39:03 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2CC94811AC for ; Thu, 28 Jul 2016 14:39:03 +0000 (UTC) From: marcandre.lureau@redhat.com Date: Thu, 28 Jul 2016 18:37:44 +0400 Message-Id: <20160728143808.13707-14-marcandre.lureau@redhat.com> In-Reply-To: <20160728143808.13707-1-marcandre.lureau@redhat.com> References: <20160728143808.13707-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v2 13/37] portio: keep references on portio List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: eblake@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= From: Marc-Andr=C3=A9 Lureau The isa_register_portio_list() function allocates ioports data/state. Let's keep the reference to this data on some owner. This isn't enough to fix leaks, but at least, ASAN stops complaining of direct leaks. Further cleanup would require calling portio_list_del/destroy(). Signed-off-by: Marc-Andr=C3=A9 Lureau --- hw/audio/gus.c | 9 ++++++--- hw/audio/sb16.c | 4 +++- hw/block/fdc.c | 4 +++- hw/char/parallel.c | 3 ++- hw/display/vga-isa.c | 8 ++++++-- hw/dma/i8257.c | 6 ++++-- hw/ide/core.c | 6 ++++-- hw/isa/isa-bus.c | 14 +++++--------- include/hw/ide/internal.h | 2 ++ include/hw/isa/i8257.h | 2 ++ include/hw/isa/isa.h | 5 ++++- 11 files changed, 41 insertions(+), 22 deletions(-) diff --git a/hw/audio/gus.c b/hw/audio/gus.c index 6c02646..3d08a65 100644 --- a/hw/audio/gus.c +++ b/hw/audio/gus.c @@ -60,6 +60,8 @@ typedef struct GUSState { int64_t last_ticks; qemu_irq pic; IsaDma *isa_dma; + PortioList portio_list1; + PortioList portio_list2; } GUSState; =20 static uint32_t gus_readb(void *opaque, uint32_t nport) @@ -265,9 +267,10 @@ static void gus_realizefn (DeviceState *dev, Error *= *errp) s->samples =3D AUD_get_buffer_size_out (s->voice) >> s->shift; s->mixbuf =3D g_malloc0 (s->samples << s->shift); =20 - isa_register_portio_list (d, s->port, gus_portio_list1, s, "gus"); - isa_register_portio_list (d, (s->port + 0x100) & 0xf00, - gus_portio_list2, s, "gus"); + isa_register_portio_list(d, &s->portio_list1, s->port, + gus_portio_list1, s, "gus"); + isa_register_portio_list(d, &s->portio_list2, (s->port + 0x100) & 0x= f00, + gus_portio_list2, s, "gus"); =20 s->isa_dma =3D isa_get_dma(isa_bus_from_device(d), s->emu.gusdma); k =3D ISADMA_GET_CLASS(s->isa_dma); diff --git a/hw/audio/sb16.c b/hw/audio/sb16.c index 3a4a57a..6b4427f 100644 --- a/hw/audio/sb16.c +++ b/hw/audio/sb16.c @@ -106,6 +106,7 @@ typedef struct SB16State { /* mixer state */ int mixer_nreg; uint8_t mixer_regs[256]; + PortioList portio_list; } SB16State; =20 static void SB_audio_callback (void *opaque, int free); @@ -1378,7 +1379,8 @@ static void sb16_realizefn (DeviceState *dev, Error= **errp) dolog ("warning: Could not create auxiliary timer\n"); } =20 - isa_register_portio_list (isadev, s->port, sb16_ioport_list, s, "sb1= 6"); + isa_register_portio_list(isadev, &s->portio_list, s->port, + sb16_ioport_list, s, "sb16"); =20 s->isa_hdma =3D isa_get_dma(isa_bus_from_device(isadev), s->hdma); k =3D ISADMA_GET_CLASS(s->isa_hdma); diff --git a/hw/block/fdc.c b/hw/block/fdc.c index f73af7d..b79873a 100644 --- a/hw/block/fdc.c +++ b/hw/block/fdc.c @@ -692,6 +692,7 @@ struct FDCtrl { /* Timers state */ uint8_t timer0; uint8_t timer1; + PortioList portio_list; }; =20 static FloppyDriveType get_fallback_drive_type(FDrive *drv) @@ -2495,7 +2496,8 @@ static void isabus_fdc_realize(DeviceState *dev, Er= ror **errp) FDCtrl *fdctrl =3D &isa->state; Error *err =3D NULL; =20 - isa_register_portio_list(isadev, isa->iobase, fdc_portio_list, fdctr= l, + isa_register_portio_list(isadev, &fdctrl->portio_list, + isa->iobase, fdc_portio_list, fdctrl, "fdc"); =20 isa_init_irq(isadev, &fdctrl->irq, isa->irq); diff --git a/hw/char/parallel.c b/hw/char/parallel.c index 11c78fe..fa08566 100644 --- a/hw/char/parallel.c +++ b/hw/char/parallel.c @@ -80,6 +80,7 @@ typedef struct ParallelState { uint32_t last_read_offset; /* For debugging */ /* Memory-mapped interface */ int it_shift; + PortioList portio_list; } ParallelState; =20 #define TYPE_ISA_PARALLEL "isa-parallel" @@ -532,7 +533,7 @@ static void parallel_isa_realizefn(DeviceState *dev, = Error **errp) s->status =3D dummy; } =20 - isa_register_portio_list(isadev, base, + isa_register_portio_list(isadev, &s->portio_list, base, (s->hw_driver ? &isa_parallel_portio_hw_list[0] : &isa_parallel_portio_sw_list[0]), diff --git a/hw/display/vga-isa.c b/hw/display/vga-isa.c index f5aff1c..1af9556 100644 --- a/hw/display/vga-isa.c +++ b/hw/display/vga-isa.c @@ -39,6 +39,8 @@ typedef struct ISAVGAState { ISADevice parent_obj; =20 struct VGACommonState state; + PortioList portio_vga; + PortioList portio_vbe; } ISAVGAState; =20 static void vga_isa_reset(DeviceState *dev) @@ -60,9 +62,11 @@ static void vga_isa_realizefn(DeviceState *dev, Error = **errp) vga_common_init(s, OBJECT(dev), true); s->legacy_address_space =3D isa_address_space(isadev); vga_io_memory =3D vga_init_io(s, OBJECT(dev), &vga_ports, &vbe_ports= ); - isa_register_portio_list(isadev, 0x3b0, vga_ports, s, "vga"); + isa_register_portio_list(isadev, &d->portio_vga, + 0x3b0, vga_ports, s, "vga"); if (vbe_ports) { - isa_register_portio_list(isadev, 0x1ce, vbe_ports, s, "vbe"); + isa_register_portio_list(isadev, &d->portio_vbe, + 0x1ce, vbe_ports, s, "vbe"); } memory_region_add_subregion_overlap(isa_address_space(isadev), 0x000a0000, diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c index f345c54..bffbdea 100644 --- a/hw/dma/i8257.c +++ b/hw/dma/i8257.c @@ -553,10 +553,12 @@ static void i8257_realize(DeviceState *dev, Error *= *errp) memory_region_add_subregion(isa_address_space_io(isa), d->base, &d->channel_io); =20 - isa_register_portio_list(isa, d->page_base, page_portio_list, d, + isa_register_portio_list(isa, &d->portio_page, + d->page_base, page_portio_list, d, "dma-page"); if (d->pageh_base >=3D 0) { - isa_register_portio_list(isa, d->pageh_base, pageh_portio_list, = d, + isa_register_portio_list(isa, &d->portio_pageh, + d->pageh_base, pageh_portio_list, d, "dma-pageh"); } =20 diff --git a/hw/ide/core.c b/hw/ide/core.c index 081c9eb..95790cc 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -2617,10 +2617,12 @@ void ide_init_ioport(IDEBus *bus, ISADevice *dev,= int iobase, int iobase2) { /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA bridge has been setup properly to always register with ISA. */ - isa_register_portio_list(dev, iobase, ide_portio_list, bus, "ide"); + isa_register_portio_list(dev, &bus->portio_list, + iobase, ide_portio_list, bus, "ide"); =20 if (iobase2) { - isa_register_portio_list(dev, iobase2, ide_portio2_list, bus, "i= de"); + isa_register_portio_list(dev, &bus->portio2_list, + iobase2, ide_portio2_list, bus, "ide"); } } =20 diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c index ce74db2..9d07b11 100644 --- a/hw/isa/isa-bus.c +++ b/hw/isa/isa-bus.c @@ -131,24 +131,20 @@ void isa_register_ioport(ISADevice *dev, MemoryRegi= on *io, uint16_t start) isa_init_ioport(dev, start); } =20 -void isa_register_portio_list(ISADevice *dev, uint16_t start, +void isa_register_portio_list(ISADevice *dev, + PortioList *piolist, uint16_t start, const MemoryRegionPortio *pio_start, void *opaque, const char *name) { - PortioList piolist; + assert(piolist && !piolist->owner); =20 /* START is how we should treat DEV, regardless of the actual contents of the portio array. This is how the old code actually handled e.g. the FDC device. */ isa_init_ioport(dev, start); =20 - /* FIXME: the device should store created PortioList in its state. = Note - that DEV can be NULL here and that single device can register sev= eral - portio lists. Current implementation is leaking memory allocated - in portio_list_init. The leak is not critical because it happens= only - at initialization time. */ - portio_list_init(&piolist, OBJECT(dev), pio_start, opaque, name); - portio_list_add(&piolist, isabus->address_space_io, start); + portio_list_init(piolist, OBJECT(dev), pio_start, opaque, name); + portio_list_add(piolist, isabus->address_space_io, start); } =20 static void isa_device_init(Object *obj) diff --git a/include/hw/ide/internal.h b/include/hw/ide/internal.h index 7824bc3..a6dd2c3 100644 --- a/include/hw/ide/internal.h +++ b/include/hw/ide/internal.h @@ -480,6 +480,8 @@ struct IDEBus { uint8_t retry_unit; int64_t retry_sector_num; uint32_t retry_nsector; + PortioList portio_list; + PortioList portio2_list; }; =20 #define TYPE_IDE_DEVICE "ide-device" diff --git a/include/hw/isa/i8257.h b/include/hw/isa/i8257.h index aa211c0..88a2766 100644 --- a/include/hw/isa/i8257.h +++ b/include/hw/isa/i8257.h @@ -36,6 +36,8 @@ typedef struct I8257State { QEMUBH *dma_bh; bool dma_bh_scheduled; int running; + PortioList portio_page; + PortioList portio_pageh; } I8257State; =20 #endif diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h index 7693ac5..c2fdd70 100644 --- a/include/hw/isa/isa.h +++ b/include/hw/isa/isa.h @@ -134,12 +134,15 @@ void isa_register_ioport(ISADevice *dev, MemoryRegi= on *io, uint16_t start); * device and use the legacy portio routines. * * @dev: the ISADevice against which these are registered; may be NULL. + * @piolist: the PortioList associated with the io ports * @start: the base I/O port against which the portio->offset is applied= . * @portio: the ports, sorted by offset. * @opaque: passed into the portio callbacks. * @name: passed into memory_region_init_io. */ -void isa_register_portio_list(ISADevice *dev, uint16_t start, +void isa_register_portio_list(ISADevice *dev, + PortioList *piolist, + uint16_t start, const MemoryRegionPortio *portio, void *opaque, const char *name); =20 --=20 2.9.0