qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro
@ 2023-02-13 10:56 Philippe Mathieu-Daudé
  2023-02-13 10:56 ` [RFC PATCH 1/3] hw/qdev: " Philippe Mathieu-Daudé
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-02-13 10:56 UTC (permalink / raw)
  To: qemu-devel, Eduardo Habkost
  Cc: Peter Maydell, Gerd Hoffmann, Edgar E . Iglesias, Igor Mammedov,
	Samuel Thibault, Paolo Bonzini, Markus Armbruster,
	Daniel P. Berrangé, Mark Cave-Ayland, Thomas Huth,
	Philippe Mathieu-Daudé

Experiment after discussing with Thomas around qdev_get_parent_bus:
https://lore.kernel.org/qemu-devel/ad356f64-dca0-8117-d22a-a530e620ddb0@redhat.com/

When a QDev plug on a QBus, we'll always use qdev_get_parent_bus()
at least once with this type. Why not provide a consistent defined
macro instead of:
 1/ adding an inlined helper such usb_bus_from_device()
    or scsi_bus_from_device() with different type checks,
 2/ open-code calls to qdev_get_parent_bus() with unsafe casts
?

This RFC series introduce a QDev-equivalent of QOM DECLARE_TYPES
macro, to be used with a (device, bus) tuple, and declaring the
equivalent device_GET_BUS() macro.

hw/usb/ is converted as an example.

Philippe Mathieu-Daudé (3):
  hw/qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro
  hw/usb: Declare QOM macros using QDEV_DECLARE_DEV_BUS_TYPES()
  hw/usb: Use USB_DEVICE_GET_BUS() macro

 hw/usb/bus.c           | 10 +++++-----
 hw/usb/core.c          |  6 +++---
 hw/usb/dev-hub.c       |  4 ++--
 hw/usb/dev-serial.c    | 10 +++++-----
 hw/usb/hcd-xhci.c      |  2 +-
 include/hw/qdev-core.h | 28 ++++++++++++++++++++++++++++
 include/hw/usb.h       | 13 ++++---------
 7 files changed, 48 insertions(+), 25 deletions(-)

-- 
2.38.1



^ permalink raw reply	[flat|nested] 7+ messages in thread

* [RFC PATCH 1/3] hw/qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro
  2023-02-13 10:56 [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro Philippe Mathieu-Daudé
@ 2023-02-13 10:56 ` Philippe Mathieu-Daudé
  2023-03-01 14:59   ` Daniel P. Berrangé
  2023-02-13 10:56 ` [RFC PATCH 2/3] hw/usb: Declare QOM macros using QDEV_DECLARE_DEV_BUS_TYPES() Philippe Mathieu-Daudé
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-02-13 10:56 UTC (permalink / raw)
  To: qemu-devel, Eduardo Habkost
  Cc: Peter Maydell, Gerd Hoffmann, Edgar E . Iglesias, Igor Mammedov,
	Samuel Thibault, Paolo Bonzini, Markus Armbruster,
	Daniel P. Berrangé, Mark Cave-Ayland, Thomas Huth,
	Philippe Mathieu-Daudé

Similarly to QOM OBJECT_DECLARE_TYPE() equivalent, introduce
a QDev macro to declare common helpers for device sitting on
a bus.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 include/hw/qdev-core.h | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index 93718be156..dc9909a2e7 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -717,6 +717,34 @@ void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
 
 BusState *qdev_get_parent_bus(const DeviceState *dev);
 
+/**
+ * QDEV_DECLARE_DEV_BUS_TYPES:
+ * @DeviceInstanceType: device instance struct name
+ * @DeviceClassType: device class struct name
+ * @DEVICE_OBJ_NAME: the device name in uppercase with underscore separators
+ * @BusInstanceType: bus instance struct name
+ * @DeviceClassType: bus class struct name
+ * @BUS_OBJ_NAME: the bus name in uppercase with underscore separators
+ *
+ * This macro is typically used in a header file, and will:
+ *
+ *   - create the typedefs for the object and class structs
+ *   - register the type for use with g_autoptr
+ *   - provide four standard type cast functions
+ *
+ * The device state struct, device class struct, bus state struct need
+ * to be declared manually.
+ */
+#define QDEV_DECLARE_DEV_BUS_TYPES(DeviceInstanceType, DeviceClassType, \
+                                                       DEVICE_OBJ_NAME, \
+                                   BusInstanceType, BUS_OBJ_NAME) \
+    OBJECT_DECLARE_TYPE(DeviceInstanceType, DeviceClassType, DEVICE_OBJ_NAME) \
+    OBJECT_DECLARE_SIMPLE_TYPE(BusInstanceType, BUS_OBJ_NAME) \
+    \
+    static inline G_GNUC_UNUSED BusInstanceType * \
+    DEVICE_OBJ_NAME##_GET_BUS(const DeviceInstanceType *dev) \
+    { return BUS_OBJ_NAME(qdev_get_parent_bus(DEVICE(dev))); }
+
 /*** BUS API. ***/
 
 DeviceState *qdev_find_recursive(BusState *bus, const char *id);
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [RFC PATCH 2/3] hw/usb: Declare QOM macros using QDEV_DECLARE_DEV_BUS_TYPES()
  2023-02-13 10:56 [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro Philippe Mathieu-Daudé
  2023-02-13 10:56 ` [RFC PATCH 1/3] hw/qdev: " Philippe Mathieu-Daudé
@ 2023-02-13 10:56 ` Philippe Mathieu-Daudé
  2023-02-13 10:56 ` [RFC PATCH 3/3] hw/usb: Use USB_DEVICE_GET_BUS() macro Philippe Mathieu-Daudé
  2023-03-01 14:42 ` [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro Igor Mammedov
  3 siblings, 0 replies; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-02-13 10:56 UTC (permalink / raw)
  To: qemu-devel, Eduardo Habkost
  Cc: Peter Maydell, Gerd Hoffmann, Edgar E . Iglesias, Igor Mammedov,
	Samuel Thibault, Paolo Bonzini, Markus Armbruster,
	Daniel P. Berrangé, Mark Cave-Ayland, Thomas Huth,
	Philippe Mathieu-Daudé

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 include/hw/usb.h | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/hw/usb.h b/include/hw/usb.h
index b2111bb1c7..09f345f5c5 100644
--- a/include/hw/usb.h
+++ b/include/hw/usb.h
@@ -266,8 +266,11 @@ struct USBDevice {
     const USBDescIface  *ifaces[USB_MAX_INTERFACES];
 };
 
+#define TYPE_USB_BUS "usb-bus"
 #define TYPE_USB_DEVICE "usb-device"
-OBJECT_DECLARE_TYPE(USBDevice, USBDeviceClass, USB_DEVICE)
+
+QDEV_DECLARE_DEV_BUS_TYPES(USBDevice, USBDeviceClass, USB_DEVICE,
+                           USBBus, USB_BUS)
 
 typedef void (*USBDeviceRealize)(USBDevice *dev, Error **errp);
 typedef void (*USBDeviceUnrealize)(USBDevice *dev);
@@ -473,9 +476,6 @@ void hmp_info_usbhost(Monitor *mon, const QDict *qdict);
 
 /* usb-bus.c */
 
-#define TYPE_USB_BUS "usb-bus"
-OBJECT_DECLARE_SIMPLE_TYPE(USBBus, USB_BUS)
-
 struct USBBus {
     BusState qbus;
     USBBusOps *ops;
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [RFC PATCH 3/3] hw/usb: Use USB_DEVICE_GET_BUS() macro
  2023-02-13 10:56 [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro Philippe Mathieu-Daudé
  2023-02-13 10:56 ` [RFC PATCH 1/3] hw/qdev: " Philippe Mathieu-Daudé
  2023-02-13 10:56 ` [RFC PATCH 2/3] hw/usb: Declare QOM macros using QDEV_DECLARE_DEV_BUS_TYPES() Philippe Mathieu-Daudé
@ 2023-02-13 10:56 ` Philippe Mathieu-Daudé
  2023-03-01 14:42 ` [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro Igor Mammedov
  3 siblings, 0 replies; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-02-13 10:56 UTC (permalink / raw)
  To: qemu-devel, Eduardo Habkost
  Cc: Peter Maydell, Gerd Hoffmann, Edgar E . Iglesias, Igor Mammedov,
	Samuel Thibault, Paolo Bonzini, Markus Armbruster,
	Daniel P. Berrangé, Mark Cave-Ayland, Thomas Huth,
	Philippe Mathieu-Daudé

Automatic conversion running:

  $ sed -i -e s/usb_bus_from_device/USB_DEVICE_GET_BUS/g \
    $(git grep -wl usb_bus_from_device)

then removing the usb_bus_from_device() function declaration.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/usb/bus.c        | 10 +++++-----
 hw/usb/core.c       |  6 +++---
 hw/usb/dev-hub.c    |  4 ++--
 hw/usb/dev-serial.c | 10 +++++-----
 hw/usb/hcd-xhci.c   |  2 +-
 include/hw/usb.h    |  5 -----
 6 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index d7c3c71435..fa154e1e79 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -427,7 +427,7 @@ void usb_unregister_port(USBBus *bus, USBPort *port)
 
 void usb_claim_port(USBDevice *dev, Error **errp)
 {
-    USBBus *bus = usb_bus_from_device(dev);
+    USBBus *bus = USB_DEVICE_GET_BUS(dev);
     USBPort *port;
     USBDevice *hub;
 
@@ -473,7 +473,7 @@ void usb_claim_port(USBDevice *dev, Error **errp)
 
 void usb_release_port(USBDevice *dev)
 {
-    USBBus *bus = usb_bus_from_device(dev);
+    USBBus *bus = USB_DEVICE_GET_BUS(dev);
     USBPort *port = dev->port;
 
     assert(port != NULL);
@@ -517,7 +517,7 @@ static void usb_mask_to_str(char *dest, size_t size,
 
 void usb_check_attach(USBDevice *dev, Error **errp)
 {
-    USBBus *bus = usb_bus_from_device(dev);
+    USBBus *bus = USB_DEVICE_GET_BUS(dev);
     USBPort *port = dev->port;
     char devspeed[32], portspeed[32];
 
@@ -555,7 +555,7 @@ void usb_device_attach(USBDevice *dev, Error **errp)
 
 int usb_device_detach(USBDevice *dev)
 {
-    USBBus *bus = usb_bus_from_device(dev);
+    USBBus *bus = USB_DEVICE_GET_BUS(dev);
     USBPort *port = dev->port;
 
     assert(port != NULL);
@@ -583,7 +583,7 @@ static const char *usb_speed(unsigned int speed)
 static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
 {
     USBDevice *dev = USB_DEVICE(qdev);
-    USBBus *bus = usb_bus_from_device(dev);
+    USBBus *bus = USB_DEVICE_GET_BUS(dev);
 
     monitor_printf(mon, "%*saddr %d.%d, port %s, speed %s, name %s%s\n",
                    indent, "", bus->busnr, dev->addr,
diff --git a/hw/usb/core.c b/hw/usb/core.c
index 975f76250a..849e95b9e2 100644
--- a/hw/usb/core.c
+++ b/hw/usb/core.c
@@ -95,7 +95,7 @@ void usb_device_reset(USBDevice *dev)
 void usb_wakeup(USBEndpoint *ep, unsigned int stream)
 {
     USBDevice *dev = ep->dev;
-    USBBus *bus = usb_bus_from_device(dev);
+    USBBus *bus = USB_DEVICE_GET_BUS(dev);
 
     if (!phase_check(PHASE_MACHINE_READY)) {
         /*
@@ -556,7 +556,7 @@ void usb_packet_check_state(USBPacket *p, USBPacketState expected)
         return;
     }
     dev = p->ep->dev;
-    bus = usb_bus_from_device(dev);
+    bus = USB_DEVICE_GET_BUS(dev);
     trace_usb_packet_state_fault(bus->busnr, dev->port->path, p->ep->nr, p,
                                  usb_packet_state_name(p->state),
                                  usb_packet_state_name(expected));
@@ -567,7 +567,7 @@ void usb_packet_set_state(USBPacket *p, USBPacketState state)
 {
     if (p->ep) {
         USBDevice *dev = p->ep->dev;
-        USBBus *bus = usb_bus_from_device(dev);
+        USBBus *bus = USB_DEVICE_GET_BUS(dev);
         trace_usb_packet_state_change(bus->busnr, dev->port->path, p->ep->nr, p,
                                       usb_packet_state_name(p->state),
                                       usb_packet_state_name(state));
diff --git a/hw/usb/dev-hub.c b/hw/usb/dev-hub.c
index a6b50dbc8d..fa094ec9bd 100644
--- a/hw/usb/dev-hub.c
+++ b/hw/usb/dev-hub.c
@@ -572,7 +572,7 @@ static void usb_hub_unrealize(USBDevice *dev)
     int i;
 
     for (i = 0; i < s->num_ports; i++) {
-        usb_unregister_port(usb_bus_from_device(dev),
+        usb_unregister_port(USB_DEVICE_GET_BUS(dev),
                             &s->ports[i].port);
     }
 
@@ -611,7 +611,7 @@ static void usb_hub_realize(USBDevice *dev, Error **errp)
     s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
     for (i = 0; i < s->num_ports; i++) {
         port = &s->ports[i];
-        usb_register_port(usb_bus_from_device(dev),
+        usb_register_port(USB_DEVICE_GET_BUS(dev),
                           &port->port, s, i, &usb_hub_port_ops,
                           USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL);
         usb_port_location(&port->port, dev->port, i+1);
diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c
index 63047d79cf..4cfe27818b 100644
--- a/hw/usb/dev-serial.c
+++ b/hw/usb/dev-serial.c
@@ -190,7 +190,7 @@ static void usb_serial_set_flow_control(USBSerialState *s,
                                         uint8_t flow_control)
 {
     USBDevice *dev = USB_DEVICE(s);
-    USBBus *bus = usb_bus_from_device(dev);
+    USBBus *bus = USB_DEVICE_GET_BUS(dev);
 
     /* TODO: ioctl */
     s->flow_control = flow_control;
@@ -200,7 +200,7 @@ static void usb_serial_set_flow_control(USBSerialState *s,
 static void usb_serial_set_xonxoff(USBSerialState *s, int xonxoff)
 {
     USBDevice *dev = USB_DEVICE(s);
-    USBBus *bus = usb_bus_from_device(dev);
+    USBBus *bus = USB_DEVICE_GET_BUS(dev);
 
     s->xon = xonxoff & 0xff;
     s->xoff = (xonxoff >> 8) & 0xff;
@@ -221,7 +221,7 @@ static void usb_serial_reset(USBSerialState *s)
 static void usb_serial_handle_reset(USBDevice *dev)
 {
     USBSerialState *s = USB_SERIAL(dev);
-    USBBus *bus = usb_bus_from_device(dev);
+    USBBus *bus = USB_DEVICE_GET_BUS(dev);
 
     trace_usb_serial_reset(bus->busnr, dev->addr);
 
@@ -261,7 +261,7 @@ static void usb_serial_handle_control(USBDevice *dev, USBPacket *p,
                                       int length, uint8_t *data)
 {
     USBSerialState *s = USB_SERIAL(dev);
-    USBBus *bus = usb_bus_from_device(dev);
+    USBBus *bus = USB_DEVICE_GET_BUS(dev);
     int ret;
 
     trace_usb_serial_handle_control(bus->busnr, dev->addr, request, value);
@@ -479,7 +479,7 @@ static void usb_serial_token_in(USBSerialState *s, USBPacket *p)
 static void usb_serial_handle_data(USBDevice *dev, USBPacket *p)
 {
     USBSerialState *s = USB_SERIAL(dev);
-    USBBus *bus = usb_bus_from_device(dev);
+    USBBus *bus = USB_DEVICE_GET_BUS(dev);
     uint8_t devep = p->ep->nr;
     struct iovec *iov;
     int i;
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
index b89b618ec2..7d2ff9d46a 100644
--- a/hw/usb/hcd-xhci.c
+++ b/hw/usb/hcd-xhci.c
@@ -3268,7 +3268,7 @@ static void xhci_complete(USBPort *port, USBPacket *packet)
 
 static void xhci_child_detach(USBPort *uport, USBDevice *child)
 {
-    USBBus *bus = usb_bus_from_device(child);
+    USBBus *bus = USB_DEVICE_GET_BUS(child);
     XHCIState *xhci = container_of(bus, XHCIState, bus);
 
     xhci_detach_slot(xhci, child->port);
diff --git a/include/hw/usb.h b/include/hw/usb.h
index 09f345f5c5..d859cdc11c 100644
--- a/include/hw/usb.h
+++ b/include/hw/usb.h
@@ -518,11 +518,6 @@ void usb_device_attach(USBDevice *dev, Error **errp);
 int usb_device_detach(USBDevice *dev);
 void usb_check_attach(USBDevice *dev, Error **errp);
 
-static inline USBBus *usb_bus_from_device(USBDevice *d)
-{
-    return DO_UPCAST(USBBus, qbus, qdev_get_parent_bus(DEVICE(d)));
-}
-
 extern const VMStateDescription vmstate_usb_device;
 
 #define VMSTATE_USB_DEVICE(_field, _state) {                         \
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro
  2023-02-13 10:56 [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro Philippe Mathieu-Daudé
                   ` (2 preceding siblings ...)
  2023-02-13 10:56 ` [RFC PATCH 3/3] hw/usb: Use USB_DEVICE_GET_BUS() macro Philippe Mathieu-Daudé
@ 2023-03-01 14:42 ` Igor Mammedov
  2023-03-01 15:02   ` Daniel P. Berrangé
  3 siblings, 1 reply; 7+ messages in thread
From: Igor Mammedov @ 2023-03-01 14:42 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Eduardo Habkost, Peter Maydell, Gerd Hoffmann,
	Edgar E . Iglesias, Samuel Thibault, Paolo Bonzini,
	Markus Armbruster, Daniel P. Berrangé, Mark Cave-Ayland,
	Thomas Huth

On Mon, 13 Feb 2023 11:56:06 +0100
Philippe Mathieu-Daudé <philmd@linaro.org> wrote:

> Experiment after discussing with Thomas around qdev_get_parent_bus:
> https://lore.kernel.org/qemu-devel/ad356f64-dca0-8117-d22a-a530e620ddb0@redhat.com/
> 
> When a QDev plug on a QBus, we'll always use qdev_get_parent_bus()
> at least once with this type. Why not provide a consistent defined
> macro instead of:
>  1/ adding an inlined helper such usb_bus_from_device()
>     or scsi_bus_from_device() with different type checks,
>  2/ open-code calls to qdev_get_parent_bus() with unsafe casts
> ?
> 
> This RFC series introduce a QDev-equivalent of QOM DECLARE_TYPES
> macro, to be used with a (device, bus) tuple, and declaring the
> equivalent device_GET_BUS() macro.
it's already bad having 2 ways to declare types (though SIMPLE was a huge LOC saving)
so question is where do we stop (API explosion ain't a good thing either).

I my opinion this is just code churn for nor tangible benefit,
given how qdev_get_parent_bus() is used.
Fixing unsafe casts and getting rid of DO_UPCAST you mentioned before,
would better use of resources.

> hw/usb/ is converted as an example.
> 
> Philippe Mathieu-Daudé (3):
>   hw/qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro
>   hw/usb: Declare QOM macros using QDEV_DECLARE_DEV_BUS_TYPES()
>   hw/usb: Use USB_DEVICE_GET_BUS() macro
> 
>  hw/usb/bus.c           | 10 +++++-----
>  hw/usb/core.c          |  6 +++---
>  hw/usb/dev-hub.c       |  4 ++--
>  hw/usb/dev-serial.c    | 10 +++++-----
>  hw/usb/hcd-xhci.c      |  2 +-
>  include/hw/qdev-core.h | 28 ++++++++++++++++++++++++++++
>  include/hw/usb.h       | 13 ++++---------
>  7 files changed, 48 insertions(+), 25 deletions(-)
> 



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC PATCH 1/3] hw/qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro
  2023-02-13 10:56 ` [RFC PATCH 1/3] hw/qdev: " Philippe Mathieu-Daudé
@ 2023-03-01 14:59   ` Daniel P. Berrangé
  0 siblings, 0 replies; 7+ messages in thread
From: Daniel P. Berrangé @ 2023-03-01 14:59 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Eduardo Habkost, Peter Maydell, Gerd Hoffmann,
	Edgar E . Iglesias, Igor Mammedov, Samuel Thibault, Paolo Bonzini,
	Markus Armbruster, Mark Cave-Ayland, Thomas Huth

On Mon, Feb 13, 2023 at 11:56:07AM +0100, Philippe Mathieu-Daudé wrote:
> Similarly to QOM OBJECT_DECLARE_TYPE() equivalent, introduce
> a QDev macro to declare common helpers for device sitting on
> a bus.
> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>  include/hw/qdev-core.h | 28 ++++++++++++++++++++++++++++
>  1 file changed, 28 insertions(+)
> 
> diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> index 93718be156..dc9909a2e7 100644
> --- a/include/hw/qdev-core.h
> +++ b/include/hw/qdev-core.h
> @@ -717,6 +717,34 @@ void qdev_pass_gpios(DeviceState *dev, DeviceState *container,
>  
>  BusState *qdev_get_parent_bus(const DeviceState *dev);
>  
> +/**
> + * QDEV_DECLARE_DEV_BUS_TYPES:
> + * @DeviceInstanceType: device instance struct name
> + * @DeviceClassType: device class struct name
> + * @DEVICE_OBJ_NAME: the device name in uppercase with underscore separators
> + * @BusInstanceType: bus instance struct name
> + * @DeviceClassType: bus class struct name
> + * @BUS_OBJ_NAME: the bus name in uppercase with underscore separators
> + *
> + * This macro is typically used in a header file, and will:
> + *
> + *   - create the typedefs for the object and class structs
> + *   - register the type for use with g_autoptr
> + *   - provide four standard type cast functions
> + *
> + * The device state struct, device class struct, bus state struct need
> + * to be declared manually.
> + */
> +#define QDEV_DECLARE_DEV_BUS_TYPES(DeviceInstanceType, DeviceClassType, \
> +                                                       DEVICE_OBJ_NAME, \
> +                                   BusInstanceType, BUS_OBJ_NAME) \
> +    OBJECT_DECLARE_TYPE(DeviceInstanceType, DeviceClassType, DEVICE_OBJ_NAME) \
> +    OBJECT_DECLARE_SIMPLE_TYPE(BusInstanceType, BUS_OBJ_NAME) \

I'm not especially a fan of putting the declaration of two distinct
types behind one macro. This also makes it mismatch with the need
to use distinct OBJECT_DEFINE macros for each of the types.

> +    \
> +    static inline G_GNUC_UNUSED BusInstanceType * \
> +    DEVICE_OBJ_NAME##_GET_BUS(const DeviceInstanceType *dev) \
> +    { return BUS_OBJ_NAME(qdev_get_parent_bus(DEVICE(dev))); }
> +
>  /*** BUS API. ***/
>  
>  DeviceState *qdev_find_recursive(BusState *bus, const char *id);
> -- 
> 2.38.1
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro
  2023-03-01 14:42 ` [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro Igor Mammedov
@ 2023-03-01 15:02   ` Daniel P. Berrangé
  0 siblings, 0 replies; 7+ messages in thread
From: Daniel P. Berrangé @ 2023-03-01 15:02 UTC (permalink / raw)
  To: Igor Mammedov
  Cc: Philippe Mathieu-Daudé, qemu-devel, Eduardo Habkost,
	Peter Maydell, Gerd Hoffmann, Edgar E . Iglesias, Samuel Thibault,
	Paolo Bonzini, Markus Armbruster, Mark Cave-Ayland, Thomas Huth

On Wed, Mar 01, 2023 at 03:42:44PM +0100, Igor Mammedov wrote:
> On Mon, 13 Feb 2023 11:56:06 +0100
> Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
> 
> > Experiment after discussing with Thomas around qdev_get_parent_bus:
> > https://lore.kernel.org/qemu-devel/ad356f64-dca0-8117-d22a-a530e620ddb0@redhat.com/
> > 
> > When a QDev plug on a QBus, we'll always use qdev_get_parent_bus()
> > at least once with this type. Why not provide a consistent defined
> > macro instead of:
> >  1/ adding an inlined helper such usb_bus_from_device()
> >     or scsi_bus_from_device() with different type checks,
> >  2/ open-code calls to qdev_get_parent_bus() with unsafe casts
> > ?
> > 
> > This RFC series introduce a QDev-equivalent of QOM DECLARE_TYPES
> > macro, to be used with a (device, bus) tuple, and declaring the
> > equivalent device_GET_BUS() macro.
> it's already bad having 2 ways to declare types (though SIMPLE was a huge LOC saving)
> so question is where do we stop (API explosion ain't a good thing either).
> 
> I my opinion this is just code churn for nor tangible benefit,
> given how qdev_get_parent_bus() is used.

Right so in the USB conversion the only improvement is the elimination of
this method:

-static inline USBBus *usb_bus_from_device(USBDevice *d)
-{
-    return DO_UPCAST(USBBus, qbus, qdev_get_parent_bus(DEVICE(d)));
-}

It strikes me that we don't have especially many (bus-type, device-type)
pairs that would benefit from this macro.

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-03-01 15:04 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-02-13 10:56 [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro Philippe Mathieu-Daudé
2023-02-13 10:56 ` [RFC PATCH 1/3] hw/qdev: " Philippe Mathieu-Daudé
2023-03-01 14:59   ` Daniel P. Berrangé
2023-02-13 10:56 ` [RFC PATCH 2/3] hw/usb: Declare QOM macros using QDEV_DECLARE_DEV_BUS_TYPES() Philippe Mathieu-Daudé
2023-02-13 10:56 ` [RFC PATCH 3/3] hw/usb: Use USB_DEVICE_GET_BUS() macro Philippe Mathieu-Daudé
2023-03-01 14:42 ` [RFC PATCH 0/3] qdev: Introduce QDEV_DECLARE_DEV_BUS_TYPES() macro Igor Mammedov
2023-03-01 15:02   ` Daniel P. Berrangé

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).