From: Kevin Wolf <kwolf@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Cc: pkrempa@redhat.com, berrange@redhat.com, ehabkost@redhat.com,
qemu-block@nongnu.org, libvir-list@redhat.com,
qemu-devel@nongnu.org, armbru@redhat.com, its@irrelevant.dk,
pbonzini@redhat.com
Subject: Re: [PATCH 05/11] qdev: Make DeviceState.id independent of QemuOpts
Date: Fri, 24 Sep 2021 17:10:33 +0200 [thread overview]
Message-ID: <YU3qaUd4jDdcdOrB@redhat.com> (raw)
In-Reply-To: <ee35074e-b4aa-7566-4ae8-57cee895cd72@virtuozzo.com>
Am 24.09.2021 um 16:02 hat Vladimir Sementsov-Ogievskiy geschrieben:
> 24.09.2021 12:04, Kevin Wolf wrote:
> > DeviceState.id is a pointer to a string that is stored in the QemuOpts
> > object DeviceState.opts and freed together with it. We want to create
> > devices without going through QemuOpts in the future, so make this a
> > separately allocated string.
> >
> > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
>
> Interesting that in hw/xen/xen-legacy-backend.c
> g_strdup_printf-allocated id is passed to qdev_set_id prior this
> patch. So, the patch seems to fix that small leak. Worth to mention?
Ok, I can mention it explicitly.
> > ---
> > include/hw/qdev-core.h | 2 +-
> > include/monitor/qdev.h | 2 +-
> > hw/arm/virt.c | 2 +-
> > hw/core/qdev.c | 1 +
> > hw/pci-bridge/pci_expander_bridge.c | 2 +-
> > hw/ppc/e500.c | 2 +-
> > softmmu/qdev-monitor.c | 5 +++--
> > 7 files changed, 9 insertions(+), 7 deletions(-)
> >
> > diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> > index 34c8a7506a..1857d9698e 100644
> > --- a/include/hw/qdev-core.h
> > +++ b/include/hw/qdev-core.h
> > @@ -176,7 +176,7 @@ struct DeviceState {
> > Object parent_obj;
> > /*< public >*/
> > - const char *id;
> > + char *id;
> > char *canonical_path;
> > bool realized;
> > bool pending_deleted_event;
> > diff --git a/include/monitor/qdev.h b/include/monitor/qdev.h
> > index eaa947d73a..389287eb44 100644
> > --- a/include/monitor/qdev.h
> > +++ b/include/monitor/qdev.h
> > @@ -9,6 +9,6 @@ void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp);
> > int qdev_device_help(QemuOpts *opts);
> > DeviceState *qdev_device_add(QemuOpts *opts, Error **errp);
> > -void qdev_set_id(DeviceState *dev, const char *id);
> > +void qdev_set_id(DeviceState *dev, char *id);
> > #endif
> > diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> > index 1d59f0e59f..f933d48d3b 100644
> > --- a/hw/arm/virt.c
> > +++ b/hw/arm/virt.c
> > @@ -1459,7 +1459,7 @@ static void create_platform_bus(VirtMachineState *vms)
> > MemoryRegion *sysmem = get_system_memory();
> > dev = qdev_new(TYPE_PLATFORM_BUS_DEVICE);
> > - dev->id = TYPE_PLATFORM_BUS_DEVICE;
> > + dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
> > qdev_prop_set_uint32(dev, "num_irqs", PLATFORM_BUS_NUM_IRQS);
> > qdev_prop_set_uint32(dev, "mmio_size", vms->memmap[VIRT_PLATFORM_BUS].size);
> > sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
> > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > index cefc5eaa0a..d918b50a1d 100644
> > --- a/hw/core/qdev.c
> > +++ b/hw/core/qdev.c
> > @@ -956,6 +956,7 @@ static void device_finalize(Object *obj)
> > }
> > qemu_opts_del(dev->opts);
> > + g_free(dev->id);
> > }
> > static void device_class_base_init(ObjectClass *class, void *data)
> > diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
> > index 7112dc3062..10e6e7c2ab 100644
> > --- a/hw/pci-bridge/pci_expander_bridge.c
> > +++ b/hw/pci-bridge/pci_expander_bridge.c
> > @@ -245,7 +245,7 @@ static void pxb_dev_realize_common(PCIDevice *dev, bool pcie, Error **errp)
> > } else {
> > bus = pci_root_bus_new(ds, "pxb-internal", NULL, NULL, 0, TYPE_PXB_BUS);
> > bds = qdev_new("pci-bridge");
> > - bds->id = dev_name;
> > + bds->id = g_strdup(dev_name);
> > qdev_prop_set_uint8(bds, PCI_BRIDGE_DEV_PROP_CHASSIS_NR, pxb->bus_nr);
> > qdev_prop_set_bit(bds, PCI_BRIDGE_DEV_PROP_SHPC, false);
> > }
> > diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> > index 95451414dd..960e7efcd3 100644
> > --- a/hw/ppc/e500.c
> > +++ b/hw/ppc/e500.c
> > @@ -1006,7 +1006,7 @@ void ppce500_init(MachineState *machine)
> > /* Platform Bus Device */
> > if (pmc->has_platform_bus) {
> > dev = qdev_new(TYPE_PLATFORM_BUS_DEVICE);
> > - dev->id = TYPE_PLATFORM_BUS_DEVICE;
> > + dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE);
> > qdev_prop_set_uint32(dev, "num_irqs", pmc->platform_bus_num_irqs);
> > qdev_prop_set_uint32(dev, "mmio_size", pmc->platform_bus_size);
> > sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
> > diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c
> > index 034b999401..1207e57a46 100644
> > --- a/softmmu/qdev-monitor.c
> > +++ b/softmmu/qdev-monitor.c
> > @@ -592,7 +592,8 @@ static BusState *qbus_find(const char *path, Error **errp)
> > return bus;
> > }
> > -void qdev_set_id(DeviceState *dev, const char *id)
> > +/* Takes ownership of @id, will be freed when deleting the device */
> > +void qdev_set_id(DeviceState *dev, char *id)
> > {
> > if (id) {
> > dev->id = id;
> > @@ -690,7 +691,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
> > }
> > }
> > - qdev_set_id(dev, qemu_opts_id(opts));
> > + qdev_set_id(dev, g_strdup(qemu_opts_id(opts)));
> > /* set properties */
> > if (qemu_opt_foreach(opts, set_property, dev, errp)) {
> >
>
> In hw/pci/pci_bridge.c
>
> we do
>
> br->bus_name = dev->qdev.id
>
> It seems bad, as we now stole dynamic pointer, that may be freed later.
If it's bad now, it was as bad before because previously it was just a
pointer stolen from the QemuOpts that is freed in the same function as
dev->id after this patch.
I think the code is correct (it's just another field of the same device,
the real bus name is just a copy of it, and the bus can't outlive the
device that owns it anyway), but it might be bad style.
Kevin
next prev parent reply other threads:[~2021-09-24 15:11 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-24 9:04 [PATCH 00/11] qdev: Add JSON -device and fix QMP device_add Kevin Wolf
2021-09-24 9:04 ` [PATCH 01/11] qom: Reduce use of error_propagate() Kevin Wolf
2021-09-24 13:23 ` Vladimir Sementsov-Ogievskiy
2021-09-24 14:04 ` Markus Armbruster
2021-09-24 18:14 ` Eric Blake
2021-09-24 9:04 ` [PATCH 02/11] iotests/245: Fix type for iothread property Kevin Wolf
2021-09-24 13:33 ` Vladimir Sementsov-Ogievskiy
2021-09-24 9:04 ` [PATCH 03/11] iotests/051: Fix typo Kevin Wolf
2021-09-24 13:35 ` Vladimir Sementsov-Ogievskiy
2021-09-24 9:04 ` [PATCH 04/11] qdev: Avoid using string visitor for properties Kevin Wolf
2021-09-24 18:40 ` Eric Blake
2021-09-24 9:04 ` [PATCH 05/11] qdev: Make DeviceState.id independent of QemuOpts Kevin Wolf
2021-09-24 14:02 ` Vladimir Sementsov-Ogievskiy
2021-09-24 15:10 ` Kevin Wolf [this message]
2021-09-24 15:14 ` Vladimir Sementsov-Ogievskiy
2021-09-24 9:04 ` [PATCH 06/11] qdev: Add Error parameter to qdev_set_id() Kevin Wolf
2021-09-24 14:09 ` Vladimir Sementsov-Ogievskiy
2021-09-27 10:33 ` Damien Hedde
2021-10-05 11:09 ` Kevin Wolf
2021-09-24 9:04 ` [PATCH 07/11] qemu-option: Allow deleting opts during qemu_opts_foreach() Kevin Wolf
2021-09-24 14:14 ` Vladimir Sementsov-Ogievskiy
2021-09-24 9:04 ` [PATCH 08/11] qdev: Base object creation on QDict rather than QemuOpts Kevin Wolf
2021-09-24 18:53 ` Eric Blake
2021-09-24 9:04 ` [PATCH 09/11] qdev: Avoid QemuOpts in QMP device_add Kevin Wolf
2021-09-24 18:56 ` Eric Blake
2021-09-27 11:06 ` Damien Hedde
2021-09-27 11:39 ` Kevin Wolf
2021-10-05 14:37 ` Kevin Wolf
2021-10-05 15:52 ` Damien Hedde
2021-10-05 17:33 ` Kevin Wolf
2021-10-06 8:21 ` Juan Quintela
2021-10-06 9:20 ` Laurent Vivier
2021-10-06 10:53 ` Kevin Wolf
2021-10-06 11:09 ` Laurent Vivier
2021-10-01 14:42 ` Peter Krempa
2021-10-04 12:18 ` Damien Hedde
2021-10-04 14:22 ` Kevin Wolf
2021-09-24 9:04 ` [PATCH 10/11] vl: Enable JSON syntax for -device Kevin Wolf
2021-09-24 19:00 ` Eric Blake
2021-09-24 9:04 ` [PATCH 11/11] Deprecate stable non-JSON -device and -object Kevin Wolf
2021-09-24 19:02 ` Eric Blake
2021-09-27 8:15 ` Paolo Bonzini
2021-09-27 8:21 ` Daniel P. Berrangé
2021-09-27 10:17 ` Kevin Wolf
2021-09-27 10:37 ` Daniel P. Berrangé
2021-09-27 9:00 ` Peter Maydell
2021-09-27 11:27 ` Kevin Wolf
2021-09-27 12:52 ` Peter Maydell
2021-09-27 16:10 ` Kevin Wolf
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=YU3qaUd4jDdcdOrB@redhat.com \
--to=kwolf@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=ehabkost@redhat.com \
--cc=its@irrelevant.dk \
--cc=libvir-list@redhat.com \
--cc=pbonzini@redhat.com \
--cc=pkrempa@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@virtuozzo.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.