[PATCH v2 13/18] qdev: Clean up qdev_connect_gpio_out_named()

Markus Armbruster posted 18 patches 5 years, 9 months ago
Maintainers: Dmitry Fleytman <dmitry.fleytman@gmail.com>, "Dr. David Alan Gilbert" <dgilbert@redhat.com>, Alberto Garcia <berto@igalia.com>, Jiri Slaby <jslaby@suse.cz>, Markus Armbruster <armbru@redhat.com>, Aleksandar Markovic <aleksandar.qemu.devel@gmail.com>, Halil Pasic <pasic@linux.ibm.com>, Andrzej Zaborowski <balrogg@gmail.com>, Max Reitz <mreitz@redhat.com>, Christian Schoenebeck <qemu_oss@crudebyte.com>, Jean-Christophe Dubois <jcd@tribudubois.net>, "Daniel P. Berrangé" <berrange@redhat.com>, Sven Schnelle <svens@stackframe.org>, "Edgar E. Iglesias" <edgar.iglesias@gmail.com>, Igor Mammedov <imammedo@redhat.com>, Alex Williamson <alex.williamson@redhat.com>, "Philippe Mathieu-Daudé" <philmd@redhat.com>, Bastian Koppelmann <kbastian@mail.uni-paderborn.de>, Tony Krowiak <akrowiak@linux.ibm.com>, David Hildenbrand <david@redhat.com>, Aurelien Jarno <aurelien@aurel32.net>, Jason Wang <jasowang@redhat.com>, Chris Wulff <crwulff@gmail.com>, Eric Auger <eric.auger@redhat.com>, Andrew Baumann <Andrew.Baumann@microsoft.com>, Gerd Hoffmann <kraxel@redhat.com>, John Snow <jsnow@redhat.com>, Alistair Francis <alistair@alistair23.me>, David Gibson <david@gibson.dropbear.id.au>, Beniamino Galvani <b.galvani@gmail.com>, Sergio Lopez <slp@redhat.com>, "Gonglei (Arei)" <arei.gonglei@huawei.com>, Raphael Norwitz <raphael.norwitz@nutanix.com>, Peter Maydell <peter.maydell@linaro.org>, Zhang Chen <chen.zhang@intel.com>, Andrew Jeffery <andrew@aj.id.au>, Greg Kurz <groug@kaod.org>, Li Zhijian <lizhijian@cn.fujitsu.com>, Keith Busch <kbusch@kernel.org>, "Michael S. Tsirkin" <mst@redhat.com>, Sagar Karandikar <sagark@eecs.berkeley.edu>, BALATON Zoltan <balaton@eik.bme.hu>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Niek Linnenbank <nieklinnenbank@gmail.com>, Xiao Guangrong <xiaoguangrong.eric@gmail.com>, Cornelia Huck <cohuck@redhat.com>, Pierre Morel <pmorel@linux.ibm.com>, Stefan Weil <sw@weilnetz.de>, Kevin Wolf <kwolf@redhat.com>, Marek Vasut <marex@denx.de>, Paolo Bonzini <pbonzini@redhat.com>, Radoslaw Biernacki <radoslaw.biernacki@linaro.org>, Joel Stanley <joel@jms.id.au>, Paul Durrant <paul@xen.org>, Matthew Rosato <mjrosato@linux.ibm.com>, Corey Minyard <minyard@acm.org>, "Hervé Poussineau" <hpoussin@reactos.org>, Palmer Dabbelt <palmer@dabbelt.com>, Aleksandar Rikalo <aleksandar.rikalo@rt-rk.com>, "Marc-André Lureau" <marcandre.lureau@redhat.com>, Richard Henderson <rth@twiddle.net>, Laurent Vivier <lvivier@redhat.com>, Eduardo Habkost <ehabkost@redhat.com>, Amit Shah <amit@kernel.org>, Stefan Hajnoczi <stefanha@redhat.com>, Artyom Tarasenko <atar4qemu@gmail.com>, Laszlo Ersek <lersek@redhat.com>, Eric Farman <farman@linux.ibm.com>, Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>, Stefano Stabellini <sstabellini@kernel.org>, Andrey Smirnov <andrew.smirnov@gmail.com>, Anthony Perard <anthony.perard@citrix.com>, "Cédric Le Goater" <clg@kaod.org>, Leif Lindholm <leif@nuviainc.com>, Fam Zheng <fam@euphon.net>, Christian Borntraeger <borntraeger@de.ibm.com>, Subbaraya Sundeep <sundeep.lkml@gmail.com>
[PATCH v2 13/18] qdev: Clean up qdev_connect_gpio_out_named()
Posted by Markus Armbruster 5 years, 9 months ago
Both qdev_connect_gpio_out_named() and device_set_realized() put
objects without a parent into the "/machine/unattached/" orphanage.

qdev_connect_gpio_out_named() needs a lengthy comment to explain how
it works.  It exploits that object_property_add_child() can fail only
when we got a parent already, and ignoring that error does what we
want.  True.  If it failed due to "duplicate property", we'd be in
trouble, but that would be a programming error.

device_set_realized() is cleaner: it checks whether we need a parent,
then calls object_property_add_child(), aborting on failure.  No need
for a comment, and programming errors get caught.

Change qdev_connect_gpio_out_named() to match.

Cc: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 hw/core/qdev.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index ea7118ab0e..2e6c29ba78 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -542,15 +542,12 @@ void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
 {
     char *propname = g_strdup_printf("%s[%d]",
                                      name ? name : "unnamed-gpio-out", n);
-    if (pin) {
-        /* We need a name for object_property_set_link to work.  If the
-         * object has a parent, object_property_add_child will come back
-         * with an error without doing anything.  If it has none, it will
-         * never fail.  So we can just call it with a NULL Error pointer.
-         */
+    if (pin && !OBJECT(pin)->parent) {
+        /* We need a name for object_property_set_link to work */
         object_property_add_child(container_get(qdev_get_machine(),
                                                 "/unattached"),
-                                  "non-qdev-gpio[*]", OBJECT(pin), NULL);
+                                  "non-qdev-gpio[*]", OBJECT(pin),
+                                  &error_abort);
     }
     object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
     g_free(propname);
-- 
2.21.1