mbox series

[00/36] Make qdev static property API usable by any QOM type

Message ID 20201029220246.472693-1-ehabkost@redhat.com
Headers show
Series Make qdev static property API usable by any QOM type | expand

Message

Eduardo Habkost Oct. 29, 2020, 10:02 p.m. UTC
This series refactor the qdev property code so the static
property system can be used by any QOM type.  As an example, at
the end of the series some properties in TYPE_MACHINE are
converted to static properties.

Eduardo Habkost (36):
  cs4231: Get rid of empty property array
  cpu: Move cpu_common_props to hw/core/cpu.c
  qdev: Move property code to qdev-properties.[ch]
  qdev: Check dev->realized at set_size()
  sparc: Check dev->realized at sparc_set_nwindows()
  qdev: Don't use dev->id on set_size32() error message
  qdev: Make PropertyInfo.print method get Object* argument
  qdev: Make bit_prop_set() get Object* argument
  qdev: Make qdev_get_prop_ptr() get Object* arg
  qdev: Make qdev_find_global_prop() get Object* argument
  qdev: Make check_prop_still_unset() get Object* argument
  qdev: Make error_set_from_qdev_prop_error() get Object* argument
  qdev: Wrap getters and setters in separate helpers
  qdev: Move dev->realized check to qdev_property_set()
  qdev: Make PropertyInfo.create return ObjectProperty*
  qdev: Make qdev_class_add_property() more flexible
  qdev: Separate generic and device-specific property registration
  qdev: Avoid unnecessary DeviceState* variable at set_prop_arraylen()
  qdev: Move array property creation/registration to separate functions
  qdev: Reuse object_property_add_static() when adding array elements
  qom: Add allow_set callback to ObjectProperty
  qdev: Make qdev_prop_allow_set() a property allow_set callback
  qdev: Make qdev_propinfo_get_uint16() static
  qdev: Rename qdev_propinfo_* to object_propinfo_*
  qdev: Rename qdev_get_prop_ptr() to object_static_prop_ptr()
  qdev: Move softmmu properties to qdev-properties-system.h
  qdev: Reuse DEFINE_PROP in all DEFINE_PROP_* macros
  qdev: Move core static property code to QOM
  qdev: Move qdev_prop_tpm declaration to tpm_prop.h
  qdev: Rename qdev_prop_* to prop_info_*
  qdev: Stop using error_set_from_qdev_prop_error() for UUID property
  qdev: Move base property types to qom/property-types.c
  tests: Use static properties at check-qom-proplist test case
  machine: Use DEFINE_PROP_STRING for string properties
  machine: Use DEFINE_PROP_BOOL for boolean properties
  qom: Include static property API reference in documentation

 docs/devel/qom.rst                     |   6 +
 audio/audio.h                          |   1 +
 hw/core/qdev-prop-internal.h           |  30 -
 hw/tpm/tpm_prop.h                      |   2 +
 include/hw/block/block.h               |   1 +
 include/hw/core/cpu.h                  |   1 -
 include/hw/qdev-core.h                 |  47 +-
 include/hw/qdev-properties-system.h    |  68 +++
 include/hw/qdev-properties.h           | 241 +-------
 include/net/net.h                      |   1 +
 include/qom/object.h                   |  16 +
 include/qom/static-property-internal.h |  41 ++
 include/qom/static-property.h          | 343 +++++++++++
 backends/tpm/tpm_util.c                |  14 +-
 cpu.c                                  |  15 -
 hw/arm/pxa2xx.c                        |   1 +
 hw/arm/strongarm.c                     |   1 +
 hw/audio/cs4231.c                      |   5 -
 hw/block/fdc.c                         |   1 +
 hw/block/m25p80.c                      |   1 +
 hw/block/nand.c                        |   1 +
 hw/block/onenand.c                     |   1 +
 hw/block/pflash_cfi01.c                |   1 +
 hw/block/pflash_cfi02.c                |   1 +
 hw/block/vhost-user-blk.c              |   1 +
 hw/block/xen-block.c                   |  11 +-
 hw/char/avr_usart.c                    |   1 +
 hw/char/bcm2835_aux.c                  |   1 +
 hw/char/cadence_uart.c                 |   1 +
 hw/char/cmsdk-apb-uart.c               |   1 +
 hw/char/debugcon.c                     |   1 +
 hw/char/digic-uart.c                   |   1 +
 hw/char/escc.c                         |   1 +
 hw/char/etraxfs_ser.c                  |   1 +
 hw/char/exynos4210_uart.c              |   1 +
 hw/char/grlib_apbuart.c                |   1 +
 hw/char/ibex_uart.c                    |   1 +
 hw/char/imx_serial.c                   |   1 +
 hw/char/ipoctal232.c                   |   1 +
 hw/char/lm32_juart.c                   |   1 +
 hw/char/lm32_uart.c                    |   1 +
 hw/char/mcf_uart.c                     |   1 +
 hw/char/milkymist-uart.c               |   1 +
 hw/char/nrf51_uart.c                   |   1 +
 hw/char/parallel.c                     |   1 +
 hw/char/pl011.c                        |   1 +
 hw/char/renesas_sci.c                  |   1 +
 hw/char/sclpconsole-lm.c               |   1 +
 hw/char/sclpconsole.c                  |   1 +
 hw/char/serial-pci-multi.c             |   1 +
 hw/char/serial.c                       |   1 +
 hw/char/spapr_vty.c                    |   1 +
 hw/char/stm32f2xx_usart.c              |   1 +
 hw/char/terminal3270.c                 |   1 +
 hw/char/virtio-console.c               |   1 +
 hw/char/xilinx_uartlite.c              |   1 +
 hw/core/cpu.c                          |  15 +
 hw/core/machine.c                      | 241 +-------
 hw/core/qdev-properties-system.c       | 193 ++----
 hw/core/qdev-properties.c              | 801 +++----------------------
 hw/core/qdev.c                         | 120 ----
 hw/i386/kvm/i8254.c                    |   1 +
 hw/ide/qdev.c                          |   1 +
 hw/intc/arm_gicv3_common.c             |   2 +-
 hw/intc/rx_icu.c                       |   4 +-
 hw/ipmi/ipmi_bmc_extern.c              |   1 +
 hw/misc/arm_sysctl.c                   |   4 +-
 hw/misc/ivshmem.c                      |   1 +
 hw/misc/mac_via.c                      |   1 +
 hw/misc/sifive_u_otp.c                 |   1 +
 hw/net/e1000e.c                        |   6 +-
 hw/net/rocker/rocker.c                 |   1 +
 hw/nvram/eeprom_at24c.c                |   1 +
 hw/nvram/spapr_nvram.c                 |   1 +
 hw/pci-bridge/gen_pcie_root_port.c     |   1 +
 hw/pci/pci.c                           |   1 +
 hw/ppc/pnv_pnor.c                      |   1 +
 hw/rdma/vmw/pvrdma_main.c              |   1 +
 hw/rtc/mc146818rtc.c                   |   1 +
 hw/s390x/css.c                         |  13 +-
 hw/s390x/s390-pci-bus.c                |  10 +-
 hw/scsi/scsi-disk.c                    |   1 +
 hw/scsi/scsi-generic.c                 |   1 +
 hw/scsi/vhost-user-scsi.c              |   1 +
 hw/sd/sd.c                             |   1 +
 hw/usb/ccid-card-passthru.c            |   1 +
 hw/usb/dev-serial.c                    |   1 +
 hw/usb/redirect.c                      |   1 +
 hw/vfio/pci-quirks.c                   |  11 +-
 hw/vfio/pci.c                          |   1 +
 hw/virtio/vhost-user-fs.c              |   1 +
 hw/virtio/vhost-user-vsock.c           |   1 +
 hw/virtio/virtio-iommu-pci.c           |   1 +
 hw/xen/xen_pt.c                        |   1 +
 migration/migration.c                  |   1 +
 qom/object.c                           |   4 +
 qom/property-types.c                   | 649 ++++++++++++++++++++
 qom/static-property.c                  | 114 ++++
 softmmu/qdev-monitor.c                 |   1 +
 target/arm/cpu.c                       |   2 +-
 target/sparc/cpu.c                     |   2 +-
 tests/check-qom-proplist.c             |  61 +-
 qom/meson.build                        |   2 +
 103 files changed, 1544 insertions(+), 1620 deletions(-)
 delete mode 100644 hw/core/qdev-prop-internal.h
 create mode 100644 include/hw/qdev-properties-system.h
 create mode 100644 include/qom/static-property-internal.h
 create mode 100644 include/qom/static-property.h
 create mode 100644 qom/property-types.c
 create mode 100644 qom/static-property.c

-- 
2.28.0

Comments

Stefan Berger Oct. 29, 2020, 10:41 p.m. UTC | #1
On 10/29/20 6:02 PM, Eduardo Habkost wrote:
> The function will be moved to common QOM code, as it is not

> specific to TYPE_DEVICE anymore.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>


Reviewed-by:  Stefan Berger <stefanb@linux.ibm.com>


> ---

> Cc: Stefan Berger <stefanb@linux.vnet.ibm.com>

> Cc: Stefano Stabellini <sstabellini@kernel.org>

> Cc: Anthony Perard <anthony.perard@citrix.com>

> Cc: Paul Durrant <paul@xen.org>

> Cc: Kevin Wolf <kwolf@redhat.com>

> Cc: Max Reitz <mreitz@redhat.com>

> Cc: Paolo Bonzini <pbonzini@redhat.com>

> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> Cc: Eduardo Habkost <ehabkost@redhat.com>

> Cc: Cornelia Huck <cohuck@redhat.com>

> Cc: Halil Pasic <pasic@linux.ibm.com>

> Cc: Christian Borntraeger <borntraeger@de.ibm.com>

> Cc: Richard Henderson <rth@twiddle.net>

> Cc: David Hildenbrand <david@redhat.com>

> Cc: Thomas Huth <thuth@redhat.com>

> Cc: Matthew Rosato <mjrosato@linux.ibm.com>

> Cc: Alex Williamson <alex.williamson@redhat.com>

> Cc: qemu-devel@nongnu.org

> Cc: xen-devel@lists.xenproject.org

> Cc: qemu-block@nongnu.org

> Cc: qemu-s390x@nongnu.org

> ---

>   include/hw/qdev-properties.h     |  2 +-

>   backends/tpm/tpm_util.c          |  6 +--

>   hw/block/xen-block.c             |  4 +-

>   hw/core/qdev-properties-system.c | 46 +++++++++++------------

>   hw/core/qdev-properties.c        | 64 ++++++++++++++++----------------

>   hw/s390x/css.c                   |  4 +-

>   hw/s390x/s390-pci-bus.c          |  4 +-

>   hw/vfio/pci-quirks.c             |  4 +-

>   8 files changed, 67 insertions(+), 67 deletions(-)

>

> diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h

> index 0acc92ae2b..4146dac281 100644

> --- a/include/hw/qdev-properties.h

> +++ b/include/hw/qdev-properties.h

> @@ -332,7 +332,7 @@ void qdev_prop_set_macaddr(DeviceState *dev, const char *name,

>                              const uint8_t *value);

>   void qdev_prop_set_enum(DeviceState *dev, const char *name, int value);

>

> -void *qdev_get_prop_ptr(Object *obj, Property *prop);

> +void *object_static_prop_ptr(Object *obj, Property *prop);

>

>   void qdev_prop_register_global(GlobalProperty *prop);

>   const GlobalProperty *qdev_find_global_prop(Object *obj,

> diff --git a/backends/tpm/tpm_util.c b/backends/tpm/tpm_util.c

> index 042cacfcca..2b5f788861 100644

> --- a/backends/tpm/tpm_util.c

> +++ b/backends/tpm/tpm_util.c

> @@ -35,7 +35,7 @@

>   static void get_tpm(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

> -    TPMBackend **be = qdev_get_prop_ptr(obj, opaque);

> +    TPMBackend **be = object_static_prop_ptr(obj, opaque);

>       char *p;

>

>       p = g_strdup(*be ? (*be)->id : "");

> @@ -47,7 +47,7 @@ static void set_tpm(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

>       Property *prop = opaque;

> -    TPMBackend *s, **be = qdev_get_prop_ptr(obj, prop);

> +    TPMBackend *s, **be = object_static_prop_ptr(obj, prop);

>       char *str;

>

>       if (!visit_type_str(v, name, &str, errp)) {

> @@ -67,7 +67,7 @@ static void set_tpm(Object *obj, Visitor *v, const char *name, void *opaque,

>   static void release_tpm(Object *obj, const char *name, void *opaque)

>   {

>       Property *prop = opaque;

> -    TPMBackend **be = qdev_get_prop_ptr(obj, prop);

> +    TPMBackend **be = object_static_prop_ptr(obj, prop);

>

>       if (*be) {

>           tpm_backend_reset(*be);

> diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c

> index bd1aef63a7..20985c465a 100644

> --- a/hw/block/xen-block.c

> +++ b/hw/block/xen-block.c

> @@ -336,7 +336,7 @@ static void xen_block_get_vdev(Object *obj, Visitor *v, const char *name,

>                                  void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    XenBlockVdev *vdev = qdev_get_prop_ptr(obj, prop);

> +    XenBlockVdev *vdev = object_static_prop_ptr(obj, prop);

>       char *str;

>

>       switch (vdev->type) {

> @@ -396,7 +396,7 @@ static void xen_block_set_vdev(Object *obj, Visitor *v, const char *name,

>                                  void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    XenBlockVdev *vdev = qdev_get_prop_ptr(obj, prop);

> +    XenBlockVdev *vdev = object_static_prop_ptr(obj, prop);

>       char *str, *p;

>       const char *end;

>

> diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c

> index d9355053d2..448d77ecab 100644

> --- a/hw/core/qdev-properties-system.c

> +++ b/hw/core/qdev-properties-system.c

> @@ -60,7 +60,7 @@ static void get_drive(Object *obj, Visitor *v, const char *name, void *opaque,

>                         Error **errp)

>   {

>       Property *prop = opaque;

> -    void **ptr = qdev_get_prop_ptr(obj, prop);

> +    void **ptr = object_static_prop_ptr(obj, prop);

>       const char *value;

>       char *p;

>

> @@ -86,7 +86,7 @@ static void set_drive_helper(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    void **ptr = qdev_get_prop_ptr(obj, prop);

> +    void **ptr = object_static_prop_ptr(obj, prop);

>       char *str;

>       BlockBackend *blk;

>       bool blk_created = false;

> @@ -179,7 +179,7 @@ static void release_drive(Object *obj, const char *name, void *opaque)

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    BlockBackend **ptr = qdev_get_prop_ptr(obj, prop);

> +    BlockBackend **ptr = object_static_prop_ptr(obj, prop);

>

>       if (*ptr) {

>           AioContext *ctx = blk_get_aio_context(*ptr);

> @@ -212,7 +212,7 @@ const PropertyInfo qdev_prop_drive_iothread = {

>   static void get_chr(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

> -    CharBackend *be = qdev_get_prop_ptr(obj, opaque);

> +    CharBackend *be = object_static_prop_ptr(obj, opaque);

>       char *p;

>

>       p = g_strdup(be->chr && be->chr->label ? be->chr->label : "");

> @@ -224,7 +224,7 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

>       Property *prop = opaque;

> -    CharBackend *be = qdev_get_prop_ptr(obj, prop);

> +    CharBackend *be = object_static_prop_ptr(obj, prop);

>       Chardev *s;

>       char *str;

>

> @@ -260,7 +260,7 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,

>   static void release_chr(Object *obj, const char *name, void *opaque)

>   {

>       Property *prop = opaque;

> -    CharBackend *be = qdev_get_prop_ptr(obj, prop);

> +    CharBackend *be = object_static_prop_ptr(obj, prop);

>

>       qemu_chr_fe_deinit(be, false);

>   }

> @@ -284,7 +284,7 @@ static void get_mac(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

>       Property *prop = opaque;

> -    MACAddr *mac = qdev_get_prop_ptr(obj, prop);

> +    MACAddr *mac = object_static_prop_ptr(obj, prop);

>       char buffer[2 * 6 + 5 + 1];

>       char *p = buffer;

>

> @@ -299,7 +299,7 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

>       Property *prop = opaque;

> -    MACAddr *mac = qdev_get_prop_ptr(obj, prop);

> +    MACAddr *mac = object_static_prop_ptr(obj, prop);

>       int i, pos;

>       char *str;

>       const char *p;

> @@ -361,7 +361,7 @@ static void get_netdev(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    NICPeers *peers_ptr = qdev_get_prop_ptr(obj, prop);

> +    NICPeers *peers_ptr = object_static_prop_ptr(obj, prop);

>       char *p = g_strdup(peers_ptr->ncs[0] ? peers_ptr->ncs[0]->name : "");

>

>       visit_type_str(v, name, &p, errp);

> @@ -372,7 +372,7 @@ static void set_netdev(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    NICPeers *peers_ptr = qdev_get_prop_ptr(obj, prop);

> +    NICPeers *peers_ptr = object_static_prop_ptr(obj, prop);

>       NetClientState **ncs = peers_ptr->ncs;

>       NetClientState *peers[MAX_QUEUE_NUM];

>       int queues, err = 0, i = 0;

> @@ -434,7 +434,7 @@ static void get_audiodev(Object *obj, Visitor *v, const char* name,

>                            void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    QEMUSoundCard *card = qdev_get_prop_ptr(obj, prop);

> +    QEMUSoundCard *card = object_static_prop_ptr(obj, prop);

>       char *p = g_strdup(audio_get_id(card));

>

>       visit_type_str(v, name, &p, errp);

> @@ -445,7 +445,7 @@ static void set_audiodev(Object *obj, Visitor *v, const char* name,

>                            void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    QEMUSoundCard *card = qdev_get_prop_ptr(obj, prop);

> +    QEMUSoundCard *card = object_static_prop_ptr(obj, prop);

>       AudioState *state;

>       int err = 0;

>       char *str;

> @@ -547,7 +547,7 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint32_t *ptr = object_static_prop_ptr(obj, prop);

>       uint64_t value;

>       Error *local_err = NULL;

>

> @@ -635,7 +635,7 @@ static void get_reserved_region(Object *obj, Visitor *v, const char *name,

>                                   void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    ReservedRegion *rr = qdev_get_prop_ptr(obj, prop);

> +    ReservedRegion *rr = object_static_prop_ptr(obj, prop);

>       char buffer[64];

>       char *p = buffer;

>       int rc;

> @@ -651,7 +651,7 @@ static void set_reserved_region(Object *obj, Visitor *v, const char *name,

>                                   void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    ReservedRegion *rr = qdev_get_prop_ptr(obj, prop);

> +    ReservedRegion *rr = object_static_prop_ptr(obj, prop);

>       Error *local_err = NULL;

>       const char *endptr;

>       char *str;

> @@ -713,7 +713,7 @@ static void set_pci_devfn(Object *obj, Visitor *v, const char *name,

>                             void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    int32_t value, *ptr = qdev_get_prop_ptr(obj, prop);

> +    int32_t value, *ptr = object_static_prop_ptr(obj, prop);

>       unsigned int slot, fn, n;

>       char *str;

>

> @@ -751,7 +751,7 @@ invalid:

>   static int print_pci_devfn(Object *obj, Property *prop, char *dest,

>                              size_t len)

>   {

> -    int32_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    int32_t *ptr = object_static_prop_ptr(obj, prop);

>

>       if (*ptr == -1) {

>           return snprintf(dest, len, "<unset>");

> @@ -775,7 +775,7 @@ static void get_pci_host_devaddr(Object *obj, Visitor *v, const char *name,

>                                    void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    PCIHostDeviceAddress *addr = qdev_get_prop_ptr(obj, prop);

> +    PCIHostDeviceAddress *addr = object_static_prop_ptr(obj, prop);

>       char buffer[] = "ffff:ff:ff.f";

>       char *p = buffer;

>       int rc = 0;

> @@ -801,7 +801,7 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,

>                                    void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    PCIHostDeviceAddress *addr = qdev_get_prop_ptr(obj, prop);

> +    PCIHostDeviceAddress *addr = object_static_prop_ptr(obj, prop);

>       char *str, *p;

>       const char *e;

>       unsigned long val;

> @@ -890,7 +890,7 @@ static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,

>                                      void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    PCIExpLinkSpeed *p = qdev_get_prop_ptr(obj, prop);

> +    PCIExpLinkSpeed *p = object_static_prop_ptr(obj, prop);

>       int speed;

>

>       switch (*p) {

> @@ -918,7 +918,7 @@ static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,

>                                      void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    PCIExpLinkSpeed *p = qdev_get_prop_ptr(obj, prop);

> +    PCIExpLinkSpeed *p = object_static_prop_ptr(obj, prop);

>       int speed;

>

>       if (!visit_type_enum(v, prop->name, &speed, prop->info->enum_table,

> @@ -960,7 +960,7 @@ static void get_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,

>                                      void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    PCIExpLinkWidth *p = qdev_get_prop_ptr(obj, prop);

> +    PCIExpLinkWidth *p = object_static_prop_ptr(obj, prop);

>       int width;

>

>       switch (*p) {

> @@ -997,7 +997,7 @@ static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,

>                                      void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    PCIExpLinkWidth *p = qdev_get_prop_ptr(obj, prop);

> +    PCIExpLinkWidth *p = object_static_prop_ptr(obj, prop);

>       int width;

>

>       if (!visit_type_enum(v, prop->name, &width, prop->info->enum_table,

> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

> index e4aba2b237..0b53e5ba63 100644

> --- a/hw/core/qdev-properties.c

> +++ b/hw/core/qdev-properties.c

> @@ -51,7 +51,7 @@ void qdev_prop_allow_set_link_before_realize(const Object *obj,

>       }

>   }

>

> -void *qdev_get_prop_ptr(Object *obj, Property *prop)

> +void *object_static_prop_ptr(Object *obj, Property *prop)

>   {

>       void *ptr = obj;

>       ptr += prop->offset;

> @@ -97,7 +97,7 @@ void object_propinfo_get_enum(Object *obj, Visitor *v, const char *name,

>                               void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    int *ptr = qdev_get_prop_ptr(obj, prop);

> +    int *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);

>   }

> @@ -106,7 +106,7 @@ void object_propinfo_set_enum(Object *obj, Visitor *v, const char *name,

>                               void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    int *ptr = qdev_get_prop_ptr(obj, prop);

> +    int *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);

>   }

> @@ -135,7 +135,7 @@ static uint32_t qdev_get_prop_mask(Property *prop)

>

>   static void bit_prop_set(Object *obj, Property *props, bool val)

>   {

> -    uint32_t *p = qdev_get_prop_ptr(obj, props);

> +    uint32_t *p = object_static_prop_ptr(obj, props);

>       uint32_t mask = qdev_get_prop_mask(props);

>       if (val) {

>           *p |= mask;

> @@ -148,7 +148,7 @@ static void prop_get_bit(Object *obj, Visitor *v, const char *name,

>                            void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    uint32_t *p = qdev_get_prop_ptr(obj, prop);

> +    uint32_t *p = object_static_prop_ptr(obj, prop);

>       bool value = (*p & qdev_get_prop_mask(prop)) != 0;

>

>       visit_type_bool(v, name, &value, errp);

> @@ -189,7 +189,7 @@ static uint64_t qdev_get_prop_mask64(Property *prop)

>

>   static void bit64_prop_set(Object *obj, Property *props, bool val)

>   {

> -    uint64_t *p = qdev_get_prop_ptr(obj, props);

> +    uint64_t *p = object_static_prop_ptr(obj, props);

>       uint64_t mask = qdev_get_prop_mask64(props);

>       if (val) {

>           *p |= mask;

> @@ -202,7 +202,7 @@ static void prop_get_bit64(Object *obj, Visitor *v, const char *name,

>                              void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    uint64_t *p = qdev_get_prop_ptr(obj, prop);

> +    uint64_t *p = object_static_prop_ptr(obj, prop);

>       bool value = (*p & qdev_get_prop_mask64(prop)) != 0;

>

>       visit_type_bool(v, name, &value, errp);

> @@ -234,7 +234,7 @@ static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque,

>                        Error **errp)

>   {

>       Property *prop = opaque;

> -    bool *ptr = qdev_get_prop_ptr(obj, prop);

> +    bool *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_bool(v, name, ptr, errp);

>   }

> @@ -243,7 +243,7 @@ static void set_bool(Object *obj, Visitor *v, const char *name, void *opaque,

>                        Error **errp)

>   {

>       Property *prop = opaque;

> -    bool *ptr = qdev_get_prop_ptr(obj, prop);

> +    bool *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_bool(v, name, ptr, errp);

>   }

> @@ -261,7 +261,7 @@ static void get_uint8(Object *obj, Visitor *v, const char *name, void *opaque,

>                         Error **errp)

>   {

>       Property *prop = opaque;

> -    uint8_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint8_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_uint8(v, name, ptr, errp);

>   }

> @@ -270,7 +270,7 @@ static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,

>                         Error **errp)

>   {

>       Property *prop = opaque;

> -    uint8_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint8_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_uint8(v, name, ptr, errp);

>   }

> @@ -300,7 +300,7 @@ static void get_uint16(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    uint16_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint16_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_uint16(v, name, ptr, errp);

>   }

> @@ -309,7 +309,7 @@ static void set_uint16(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    uint16_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint16_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_uint16(v, name, ptr, errp);

>   }

> @@ -327,7 +327,7 @@ static void get_uint32(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint32_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_uint32(v, name, ptr, errp);

>   }

> @@ -336,7 +336,7 @@ static void set_uint32(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint32_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_uint32(v, name, ptr, errp);

>   }

> @@ -345,7 +345,7 @@ void object_propinfo_get_int32(Object *obj, Visitor *v, const char *name,

>                                void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    int32_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    int32_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_int32(v, name, ptr, errp);

>   }

> @@ -354,7 +354,7 @@ static void set_int32(Object *obj, Visitor *v, const char *name, void *opaque,

>                         Error **errp)

>   {

>       Property *prop = opaque;

> -    int32_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    int32_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_int32(v, name, ptr, errp);

>   }

> @@ -379,7 +379,7 @@ static void get_uint64(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    uint64_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint64_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_uint64(v, name, ptr, errp);

>   }

> @@ -388,7 +388,7 @@ static void set_uint64(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    uint64_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint64_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_uint64(v, name, ptr, errp);

>   }

> @@ -397,7 +397,7 @@ static void get_int64(Object *obj, Visitor *v, const char *name,

>                         void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    int64_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    int64_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_int64(v, name, ptr, errp);

>   }

> @@ -406,7 +406,7 @@ static void set_int64(Object *obj, Visitor *v, const char *name,

>                         void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    int64_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    int64_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_int64(v, name, ptr, errp);

>   }

> @@ -430,14 +430,14 @@ const PropertyInfo qdev_prop_int64 = {

>   static void release_string(Object *obj, const char *name, void *opaque)

>   {

>       Property *prop = opaque;

> -    g_free(*(char **)qdev_get_prop_ptr(obj, prop));

> +    g_free(*(char **)object_static_prop_ptr(obj, prop));

>   }

>

>   static void get_string(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    char **ptr = qdev_get_prop_ptr(obj, prop);

> +    char **ptr = object_static_prop_ptr(obj, prop);

>

>       if (!*ptr) {

>           char *str = (char *)"";

> @@ -451,7 +451,7 @@ static void set_string(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    char **ptr = qdev_get_prop_ptr(obj, prop);

> +    char **ptr = object_static_prop_ptr(obj, prop);

>       char *str;

>

>       if (!visit_type_str(v, name, &str, errp)) {

> @@ -485,7 +485,7 @@ void object_propinfo_get_size32(Object *obj, Visitor *v, const char *name,

>                                 void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint32_t *ptr = object_static_prop_ptr(obj, prop);

>       uint64_t value = *ptr;

>

>       visit_type_size(v, name, &value, errp);

> @@ -495,7 +495,7 @@ static void set_size32(Object *obj, Visitor *v, const char *name, void *opaque,

>                          Error **errp)

>   {

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint32_t *ptr = object_static_prop_ptr(obj, prop);

>       uint64_t value;

>

>       if (!visit_type_size(v, name, &value, errp)) {

> @@ -526,7 +526,7 @@ static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque,

>                        Error **errp)

>   {

>       Property *prop = opaque;

> -    QemuUUID *uuid = qdev_get_prop_ptr(obj, prop);

> +    QemuUUID *uuid = object_static_prop_ptr(obj, prop);

>       char buffer[UUID_FMT_LEN + 1];

>       char *p = buffer;

>

> @@ -541,7 +541,7 @@ static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

>       Property *prop = opaque;

> -    QemuUUID *uuid = qdev_get_prop_ptr(obj, prop);

> +    QemuUUID *uuid = object_static_prop_ptr(obj, prop);

>       char *str;

>

>       if (!visit_type_str(v, name, &str, errp)) {

> @@ -605,7 +605,7 @@ static ArrayElementProperty *array_element_new(Object *obj,

>        * being inside the device struct.

>        */

>       arrayprop->prop.offset = eltptr - (void *)obj;

> -    assert(qdev_get_prop_ptr(obj, &arrayprop->prop) == eltptr);

> +    assert(object_static_prop_ptr(obj, &arrayprop->prop) == eltptr);

>       return arrayprop;

>   }

>

> @@ -646,7 +646,7 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,

>        * array itself and dynamically add the corresponding properties.

>        */

>       Property *prop = opaque;

> -    uint32_t *alenptr = qdev_get_prop_ptr(obj, prop);

> +    uint32_t *alenptr = object_static_prop_ptr(obj, prop);

>       void **arrayptr = (void *)obj + prop->arrayoffset;

>       void *eltptr;

>       const char *arrayname;

> @@ -867,7 +867,7 @@ static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,

>                        Error **errp)

>   {

>       Property *prop = opaque;

> -    uint64_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint64_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_size(v, name, ptr, errp);

>   }

> @@ -876,7 +876,7 @@ static void set_size(Object *obj, Visitor *v, const char *name, void *opaque,

>                        Error **errp)

>   {

>       Property *prop = opaque;

> -    uint64_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint64_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_size(v, name, ptr, errp);

>   }

> diff --git a/hw/s390x/css.c b/hw/s390x/css.c

> index 46cab94e2b..c8e7ce232a 100644

> --- a/hw/s390x/css.c

> +++ b/hw/s390x/css.c

> @@ -2344,7 +2344,7 @@ static void get_css_devid(Object *obj, Visitor *v, const char *name,

>                             void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    CssDevId *dev_id = qdev_get_prop_ptr(obj, prop);

> +    CssDevId *dev_id = object_static_prop_ptr(obj, prop);

>       char buffer[] = "xx.x.xxxx";

>       char *p = buffer;

>       int r;

> @@ -2373,7 +2373,7 @@ static void set_css_devid(Object *obj, Visitor *v, const char *name,

>                             void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    CssDevId *dev_id = qdev_get_prop_ptr(obj, prop);

> +    CssDevId *dev_id = object_static_prop_ptr(obj, prop);

>       char *str;

>       int num, n1, n2;

>       unsigned int cssid, ssid, devid;

> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c

> index d02e93a192..74a469e91d 100644

> --- a/hw/s390x/s390-pci-bus.c

> +++ b/hw/s390x/s390-pci-bus.c

> @@ -1248,7 +1248,7 @@ static void s390_pci_get_fid(Object *obj, Visitor *v, const char *name,

>                            void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint32_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_uint32(v, name, ptr, errp);

>   }

> @@ -1258,7 +1258,7 @@ static void s390_pci_set_fid(Object *obj, Visitor *v, const char *name,

>   {

>       S390PCIBusDevice *zpci = S390_PCI_DEVICE(obj);

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint32_t *ptr = object_static_prop_ptr(obj, prop);

>

>       if (!visit_type_uint32(v, name, ptr, errp)) {

>           return;

> diff --git a/hw/vfio/pci-quirks.c b/hw/vfio/pci-quirks.c

> index 802979635c..37cb9ab1fa 100644

> --- a/hw/vfio/pci-quirks.c

> +++ b/hw/vfio/pci-quirks.c

> @@ -1489,7 +1489,7 @@ static void get_nv_gpudirect_clique_id(Object *obj, Visitor *v,

>                                          Error **errp)

>   {

>       Property *prop = opaque;

> -    uint8_t *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint8_t *ptr = object_static_prop_ptr(obj, prop);

>

>       visit_type_uint8(v, name, ptr, errp);

>   }

> @@ -1499,7 +1499,7 @@ static void set_nv_gpudirect_clique_id(Object *obj, Visitor *v,

>                                          Error **errp)

>   {

>       Property *prop = opaque;

> -    uint8_t value, *ptr = qdev_get_prop_ptr(obj, prop);

> +    uint8_t value, *ptr = object_static_prop_ptr(obj, prop);

>

>       if (!visit_type_uint8(v, name, &value, errp)) {

>           return;
Stefan Berger Oct. 29, 2020, 10:43 p.m. UTC | #2
On 10/29/20 6:02 PM, Eduardo Habkost wrote:
> Every single qdev property setter function manually checks

> dev->realized.  We can just check dev->realized inside

> qdev_property_set() instead.

>

> The check is being added as a separate function

> (qdev_prop_allow_set()) because it will become a callback later.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>


Reviewed-by:  Stefan Berger <stefanb@linux.ibm.com>


> ---

> Cc: Stefan Berger <stefanb@linux.vnet.ibm.com>

> Cc: Stefano Stabellini <sstabellini@kernel.org>

> Cc: Anthony Perard <anthony.perard@citrix.com>

> Cc: Paul Durrant <paul@xen.org>

> Cc: Kevin Wolf <kwolf@redhat.com>

> Cc: Max Reitz <mreitz@redhat.com>

> Cc: Paolo Bonzini <pbonzini@redhat.com>

> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> Cc: Eduardo Habkost <ehabkost@redhat.com>

> Cc: Cornelia Huck <cohuck@redhat.com>

> Cc: Halil Pasic <pasic@linux.ibm.com>

> Cc: Christian Borntraeger <borntraeger@de.ibm.com>

> Cc: Thomas Huth <thuth@redhat.com>

> Cc: Richard Henderson <rth@twiddle.net>

> Cc: David Hildenbrand <david@redhat.com>

> Cc: Matthew Rosato <mjrosato@linux.ibm.com>

> Cc: Alex Williamson <alex.williamson@redhat.com>

> Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

> Cc: Artyom Tarasenko <atar4qemu@gmail.com>

> Cc: qemu-devel@nongnu.org

> Cc: xen-devel@lists.xenproject.org

> Cc: qemu-block@nongnu.org

> Cc: qemu-s390x@nongnu.org

> ---

>   backends/tpm/tpm_util.c          |   6 --

>   hw/block/xen-block.c             |   5 --

>   hw/core/qdev-properties-system.c |  64 -------------------

>   hw/core/qdev-properties.c        | 106 ++++++-------------------------

>   hw/s390x/css.c                   |   6 --

>   hw/s390x/s390-pci-bus.c          |   6 --

>   hw/vfio/pci-quirks.c             |   6 --

>   target/sparc/cpu.c               |   6 --

>   8 files changed, 18 insertions(+), 187 deletions(-)

>

> diff --git a/backends/tpm/tpm_util.c b/backends/tpm/tpm_util.c

> index e91c21dd4a..042cacfcca 100644

> --- a/backends/tpm/tpm_util.c

> +++ b/backends/tpm/tpm_util.c

> @@ -46,16 +46,10 @@ static void get_tpm(Object *obj, Visitor *v, const char *name, void *opaque,

>   static void set_tpm(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       TPMBackend *s, **be = qdev_get_prop_ptr(obj, prop);

>       char *str;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, errp)) {

>           return;

>       }

> diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c

> index 1ba9981c08..bd1aef63a7 100644

> --- a/hw/block/xen-block.c

> +++ b/hw/block/xen-block.c

> @@ -400,11 +400,6 @@ static void xen_block_set_vdev(Object *obj, Visitor *v, const char *name,

>       char *str, *p;

>       const char *end;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, errp)) {

>           return;

>       }

> diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c

> index fca1b694ca..60a45f5620 100644

> --- a/hw/core/qdev-properties-system.c

> +++ b/hw/core/qdev-properties-system.c

> @@ -92,11 +92,6 @@ static void set_drive_helper(Object *obj, Visitor *v, const char *name,

>       bool blk_created = false;

>       int ret;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, errp)) {

>           return;

>       }

> @@ -228,17 +223,11 @@ static void get_chr(Object *obj, Visitor *v, const char *name, void *opaque,

>   static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       CharBackend *be = qdev_get_prop_ptr(obj, prop);

>       Chardev *s;

>       char *str;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, errp)) {

>           return;

>       }

> @@ -309,18 +298,12 @@ static void get_mac(Object *obj, Visitor *v, const char *name, void *opaque,

>   static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       MACAddr *mac = qdev_get_prop_ptr(obj, prop);

>       int i, pos;

>       char *str;

>       const char *p;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, errp)) {

>           return;

>       }

> @@ -388,7 +371,6 @@ static void get_netdev(Object *obj, Visitor *v, const char *name,

>   static void set_netdev(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       NICPeers *peers_ptr = qdev_get_prop_ptr(obj, prop);

>       NetClientState **ncs = peers_ptr->ncs;

> @@ -396,11 +378,6 @@ static void set_netdev(Object *obj, Visitor *v, const char *name,

>       int queues, err = 0, i = 0;

>       char *str;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, errp)) {

>           return;

>       }

> @@ -467,18 +444,12 @@ static void get_audiodev(Object *obj, Visitor *v, const char* name,

>   static void set_audiodev(Object *obj, Visitor *v, const char* name,

>                            void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       QEMUSoundCard *card = qdev_get_prop_ptr(obj, prop);

>       AudioState *state;

>       int err = 0;

>       char *str;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, errp)) {

>           return;

>       }

> @@ -580,11 +551,6 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,

>       uint64_t value;

>       Error *local_err = NULL;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_size(v, name, &value, errp)) {

>           return;

>       }

> @@ -684,7 +650,6 @@ static void get_reserved_region(Object *obj, Visitor *v, const char *name,

>   static void set_reserved_region(Object *obj, Visitor *v, const char *name,

>                                   void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       ReservedRegion *rr = qdev_get_prop_ptr(obj, prop);

>       Error *local_err = NULL;

> @@ -692,11 +657,6 @@ static void set_reserved_region(Object *obj, Visitor *v, const char *name,

>       char *str;

>       int ret;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       visit_type_str(v, name, &str, &local_err);

>       if (local_err) {

>           error_propagate(errp, local_err);

> @@ -752,17 +712,11 @@ const PropertyInfo qdev_prop_reserved_region = {

>   static void set_pci_devfn(Object *obj, Visitor *v, const char *name,

>                             void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       int32_t value, *ptr = qdev_get_prop_ptr(obj, prop);

>       unsigned int slot, fn, n;

>       char *str;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, NULL)) {

>           if (!visit_type_int32(v, name, &value, errp)) {

>               return;

> @@ -846,7 +800,6 @@ static void get_pci_host_devaddr(Object *obj, Visitor *v, const char *name,

>   static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,

>                                    void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       PCIHostDeviceAddress *addr = qdev_get_prop_ptr(obj, prop);

>       char *str, *p;

> @@ -855,11 +808,6 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,

>       unsigned long dom = 0, bus = 0;

>       unsigned int slot = 0, func = 0;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, errp)) {

>           return;

>       }

> @@ -969,16 +917,10 @@ static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,

>   static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,

>                                      void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       PCIExpLinkSpeed *p = qdev_get_prop_ptr(obj, prop);

>       int speed;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_enum(v, prop->name, &speed, prop->info->enum_table,

>                            errp)) {

>           return;

> @@ -1054,16 +996,10 @@ static void get_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,

>   static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,

>                                      void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       PCIExpLinkWidth *p = qdev_get_prop_ptr(obj, prop);

>       int width;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_enum(v, prop->name, &width, prop->info->enum_table,

>                            errp)) {

>           return;

> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

> index aab9e65e97..195bfed6e1 100644

> --- a/hw/core/qdev-properties.c

> +++ b/hw/core/qdev-properties.c

> @@ -25,6 +25,19 @@ void qdev_prop_set_after_realize(DeviceState *dev, const char *name,

>       }

>   }

>

> +/* returns: true if property is allowed to be set, false otherwise */

> +static bool qdev_prop_allow_set(Object *obj, const char *name,

> +                                Error **errp)

> +{

> +    DeviceState *dev = DEVICE(obj);

> +

> +    if (dev->realized) {

> +        qdev_prop_set_after_realize(dev, name, errp);

> +        return false;

> +    }

> +    return true;

> +}

> +

>   void qdev_prop_allow_set_link_before_realize(const Object *obj,

>                                                const char *name,

>                                                Object *val, Error **errp)

> @@ -66,6 +79,11 @@ static void static_prop_set(Object *obj, Visitor *v, const char *name,

>                               void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> +

> +    if (!qdev_prop_allow_set(obj, name, errp)) {

> +        return;

> +    }

> +

>       return prop->info->set(obj, v, name, opaque, errp);

>   }

>

> @@ -91,15 +109,9 @@ void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,

>   void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,

>                               void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       int *ptr = qdev_get_prop_ptr(obj, prop);

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);

>   }

>

> @@ -149,15 +161,9 @@ static void prop_get_bit(Object *obj, Visitor *v, const char *name,

>   static void prop_set_bit(Object *obj, Visitor *v, const char *name,

>                            void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       bool value;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_bool(v, name, &value, errp)) {

>           return;

>       }

> @@ -209,15 +215,9 @@ static void prop_get_bit64(Object *obj, Visitor *v, const char *name,

>   static void prop_set_bit64(Object *obj, Visitor *v, const char *name,

>                              void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       bool value;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_bool(v, name, &value, errp)) {

>           return;

>       }

> @@ -246,15 +246,9 @@ static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque,

>   static void set_bool(Object *obj, Visitor *v, const char *name, void *opaque,

>                        Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       bool *ptr = qdev_get_prop_ptr(obj, prop);

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       visit_type_bool(v, name, ptr, errp);

>   }

>

> @@ -279,15 +273,9 @@ static void get_uint8(Object *obj, Visitor *v, const char *name, void *opaque,

>   static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,

>                         Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       uint8_t *ptr = qdev_get_prop_ptr(obj, prop);

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       visit_type_uint8(v, name, ptr, errp);

>   }

>

> @@ -324,15 +312,9 @@ void qdev_propinfo_get_uint16(Object *obj, Visitor *v, const char *name,

>   static void set_uint16(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       uint16_t *ptr = qdev_get_prop_ptr(obj, prop);

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       visit_type_uint16(v, name, ptr, errp);

>   }

>

> @@ -357,15 +339,9 @@ static void get_uint32(Object *obj, Visitor *v, const char *name,

>   static void set_uint32(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       visit_type_uint32(v, name, ptr, errp);

>   }

>

> @@ -381,15 +357,9 @@ void qdev_propinfo_get_int32(Object *obj, Visitor *v, const char *name,

>   static void set_int32(Object *obj, Visitor *v, const char *name, void *opaque,

>                         Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       int32_t *ptr = qdev_get_prop_ptr(obj, prop);

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       visit_type_int32(v, name, ptr, errp);

>   }

>

> @@ -421,15 +391,9 @@ static void get_uint64(Object *obj, Visitor *v, const char *name,

>   static void set_uint64(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       uint64_t *ptr = qdev_get_prop_ptr(obj, prop);

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       visit_type_uint64(v, name, ptr, errp);

>   }

>

> @@ -445,15 +409,9 @@ static void get_int64(Object *obj, Visitor *v, const char *name,

>   static void set_int64(Object *obj, Visitor *v, const char *name,

>                         void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       int64_t *ptr = qdev_get_prop_ptr(obj, prop);

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       visit_type_int64(v, name, ptr, errp);

>   }

>

> @@ -496,16 +454,10 @@ static void get_string(Object *obj, Visitor *v, const char *name,

>   static void set_string(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       char **ptr = qdev_get_prop_ptr(obj, prop);

>       char *str;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, errp)) {

>           return;

>       }

> @@ -546,16 +498,10 @@ void qdev_propinfo_get_size32(Object *obj, Visitor *v, const char *name,

>   static void set_size32(Object *obj, Visitor *v, const char *name, void *opaque,

>                          Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

>       uint64_t value;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_size(v, name, &value, errp)) {

>           return;

>       }

> @@ -598,16 +544,10 @@ static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque,

>   static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       QemuUUID *uuid = qdev_get_prop_ptr(obj, prop);

>       char *str;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, errp)) {

>           return;

>       }

> @@ -678,10 +618,6 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,

>       const char *arrayname;

>       int i;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

>       if (*alenptr) {

>           error_setg(errp, "array size property %s may not be set more than once",

>                      name);

> @@ -921,15 +857,9 @@ static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,

>   static void set_size(Object *obj, Visitor *v, const char *name, void *opaque,

>                        Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       uint64_t *ptr = qdev_get_prop_ptr(obj, prop);

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       visit_type_size(v, name, ptr, errp);

>   }

>

> diff --git a/hw/s390x/css.c b/hw/s390x/css.c

> index 38fd46b9a9..46cab94e2b 100644

> --- a/hw/s390x/css.c

> +++ b/hw/s390x/css.c

> @@ -2372,18 +2372,12 @@ static void get_css_devid(Object *obj, Visitor *v, const char *name,

>   static void set_css_devid(Object *obj, Visitor *v, const char *name,

>                             void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       CssDevId *dev_id = qdev_get_prop_ptr(obj, prop);

>       char *str;

>       int num, n1, n2;

>       unsigned int cssid, ssid, devid;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_str(v, name, &str, errp)) {

>           return;

>       }

> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c

> index b59cf0651a..d02e93a192 100644

> --- a/hw/s390x/s390-pci-bus.c

> +++ b/hw/s390x/s390-pci-bus.c

> @@ -1256,16 +1256,10 @@ static void s390_pci_get_fid(Object *obj, Visitor *v, const char *name,

>   static void s390_pci_set_fid(Object *obj, Visitor *v, const char *name,

>                            void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       S390PCIBusDevice *zpci = S390_PCI_DEVICE(obj);

>       Property *prop = opaque;

>       uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_uint32(v, name, ptr, errp)) {

>           return;

>       }

> diff --git a/hw/vfio/pci-quirks.c b/hw/vfio/pci-quirks.c

> index 53569925a2..802979635c 100644

> --- a/hw/vfio/pci-quirks.c

> +++ b/hw/vfio/pci-quirks.c

> @@ -1498,15 +1498,9 @@ static void set_nv_gpudirect_clique_id(Object *obj, Visitor *v,

>                                          const char *name, void *opaque,

>                                          Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

>       uint8_t value, *ptr = qdev_get_prop_ptr(obj, prop);

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_uint8(v, name, &value, errp)) {

>           return;

>       }

> diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c

> index 8ecb20e55f..cf21efd85f 100644

> --- a/target/sparc/cpu.c

> +++ b/target/sparc/cpu.c

> @@ -798,17 +798,11 @@ static void sparc_get_nwindows(Object *obj, Visitor *v, const char *name,

>   static void sparc_set_nwindows(Object *obj, Visitor *v, const char *name,

>                                  void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       const int64_t min = MIN_NWINDOWS;

>       const int64_t max = MAX_NWINDOWS;

>       SPARCCPU *cpu = SPARC_CPU(obj);

>       int64_t value;

>

> -    if (dev->realized) {

> -        qdev_prop_set_after_realize(dev, name, errp);

> -        return;

> -    }

> -

>       if (!visit_type_int(v, name, &value, errp)) {

>           return;

>       }
Stefan Berger Oct. 29, 2020, 10:46 p.m. UTC | #3
On 10/29/20 6:02 PM, Eduardo Habkost wrote:
> Make the code more generic and not specific to TYPE_DEVICE.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

Reviewed-by:  Stefan Berger <stefanb@linux.ibm.com>
> ---

> Cc: Stefan Berger <stefanb@linux.vnet.ibm.com>

> Cc: Stefano Stabellini <sstabellini@kernel.org>

> Cc: Anthony Perard <anthony.perard@citrix.com>

> Cc: Paul Durrant <paul@xen.org>

> Cc: Kevin Wolf <kwolf@redhat.com>

> Cc: Max Reitz <mreitz@redhat.com>

> Cc: Paolo Bonzini <pbonzini@redhat.com>

> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> Cc: Eduardo Habkost <ehabkost@redhat.com>

> Cc: Richard Henderson <rth@twiddle.net>

> Cc: David Hildenbrand <david@redhat.com>

> Cc: Cornelia Huck <cohuck@redhat.com>

> Cc: Halil Pasic <pasic@linux.ibm.com>

> Cc: Christian Borntraeger <borntraeger@de.ibm.com>

> Cc: Thomas Huth <thuth@redhat.com>

> Cc: Matthew Rosato <mjrosato@linux.ibm.com>

> Cc: Alex Williamson <alex.williamson@redhat.com>

> Cc: qemu-devel@nongnu.org

> Cc: xen-devel@lists.xenproject.org

> Cc: qemu-block@nongnu.org

> Cc: qemu-s390x@nongnu.org

> ---

>   include/hw/qdev-properties.h     |  2 +-

>   backends/tpm/tpm_util.c          |  8 ++--

>   hw/block/xen-block.c             |  6 +--

>   hw/core/qdev-properties-system.c | 57 +++++++++-------------

>   hw/core/qdev-properties.c        | 82 +++++++++++++-------------------

>   hw/s390x/css.c                   |  5 +-

>   hw/s390x/s390-pci-bus.c          |  4 +-

>   hw/vfio/pci-quirks.c             |  5 +-

>   8 files changed, 68 insertions(+), 101 deletions(-)

>

> diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h

> index 0ea822e6a7..0b92cfc761 100644

> --- a/include/hw/qdev-properties.h

> +++ b/include/hw/qdev-properties.h

> @@ -302,7 +302,7 @@ void qdev_prop_set_macaddr(DeviceState *dev, const char *name,

>                              const uint8_t *value);

>   void qdev_prop_set_enum(DeviceState *dev, const char *name, int value);

>

> -void *qdev_get_prop_ptr(DeviceState *dev, Property *prop);

> +void *qdev_get_prop_ptr(Object *obj, Property *prop);

>

>   void qdev_prop_register_global(GlobalProperty *prop);

>   const GlobalProperty *qdev_find_global_prop(DeviceState *dev,

> diff --git a/backends/tpm/tpm_util.c b/backends/tpm/tpm_util.c

> index b58d298c1a..e91c21dd4a 100644

> --- a/backends/tpm/tpm_util.c

> +++ b/backends/tpm/tpm_util.c

> @@ -35,8 +35,7 @@

>   static void get_tpm(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

> -    TPMBackend **be = qdev_get_prop_ptr(dev, opaque);

> +    TPMBackend **be = qdev_get_prop_ptr(obj, opaque);

>       char *p;

>

>       p = g_strdup(*be ? (*be)->id : "");

> @@ -49,7 +48,7 @@ static void set_tpm(Object *obj, Visitor *v, const char *name, void *opaque,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    TPMBackend *s, **be = qdev_get_prop_ptr(dev, prop);

> +    TPMBackend *s, **be = qdev_get_prop_ptr(obj, prop);

>       char *str;

>

>       if (dev->realized) {

> @@ -73,9 +72,8 @@ static void set_tpm(Object *obj, Visitor *v, const char *name, void *opaque,

>

>   static void release_tpm(Object *obj, const char *name, void *opaque)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    TPMBackend **be = qdev_get_prop_ptr(dev, prop);

> +    TPMBackend **be = qdev_get_prop_ptr(obj, prop);

>

>       if (*be) {

>           tpm_backend_reset(*be);

> diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c

> index 8a7a3f5452..1ba9981c08 100644

> --- a/hw/block/xen-block.c

> +++ b/hw/block/xen-block.c

> @@ -335,9 +335,8 @@ static char *disk_to_vbd_name(unsigned int disk)

>   static void xen_block_get_vdev(Object *obj, Visitor *v, const char *name,

>                                  void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    XenBlockVdev *vdev = qdev_get_prop_ptr(dev, prop);

> +    XenBlockVdev *vdev = qdev_get_prop_ptr(obj, prop);

>       char *str;

>

>       switch (vdev->type) {

> @@ -396,9 +395,8 @@ static int vbd_name_to_disk(const char *name, const char **endp,

>   static void xen_block_set_vdev(Object *obj, Visitor *v, const char *name,

>                                  void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    XenBlockVdev *vdev = qdev_get_prop_ptr(dev, prop);

> +    XenBlockVdev *vdev = qdev_get_prop_ptr(obj, prop);

>       char *str, *p;

>       const char *end;

>

> diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c

> index d0fb063a49..c8c73c371b 100644

> --- a/hw/core/qdev-properties-system.c

> +++ b/hw/core/qdev-properties-system.c

> @@ -59,9 +59,8 @@ static bool check_prop_still_unset(DeviceState *dev, const char *name,

>   static void get_drive(Object *obj, Visitor *v, const char *name, void *opaque,

>                         Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    void **ptr = qdev_get_prop_ptr(dev, prop);

> +    void **ptr = qdev_get_prop_ptr(obj, prop);

>       const char *value;

>       char *p;

>

> @@ -87,7 +86,7 @@ static void set_drive_helper(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    void **ptr = qdev_get_prop_ptr(dev, prop);

> +    void **ptr = qdev_get_prop_ptr(obj, prop);

>       char *str;

>       BlockBackend *blk;

>       bool blk_created = false;

> @@ -185,7 +184,7 @@ static void release_drive(Object *obj, const char *name, void *opaque)

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    BlockBackend **ptr = qdev_get_prop_ptr(dev, prop);

> +    BlockBackend **ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (*ptr) {

>           AioContext *ctx = blk_get_aio_context(*ptr);

> @@ -218,8 +217,7 @@ const PropertyInfo qdev_prop_drive_iothread = {

>   static void get_chr(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

> -    CharBackend *be = qdev_get_prop_ptr(dev, opaque);

> +    CharBackend *be = qdev_get_prop_ptr(obj, opaque);

>       char *p;

>

>       p = g_strdup(be->chr && be->chr->label ? be->chr->label : "");

> @@ -232,7 +230,7 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    CharBackend *be = qdev_get_prop_ptr(dev, prop);

> +    CharBackend *be = qdev_get_prop_ptr(obj, prop);

>       Chardev *s;

>       char *str;

>

> @@ -272,9 +270,8 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,

>

>   static void release_chr(Object *obj, const char *name, void *opaque)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    CharBackend *be = qdev_get_prop_ptr(dev, prop);

> +    CharBackend *be = qdev_get_prop_ptr(obj, prop);

>

>       qemu_chr_fe_deinit(be, false);

>   }

> @@ -297,9 +294,8 @@ const PropertyInfo qdev_prop_chr = {

>   static void get_mac(Object *obj, Visitor *v, const char *name, void *opaque,

>                       Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    MACAddr *mac = qdev_get_prop_ptr(dev, prop);

> +    MACAddr *mac = qdev_get_prop_ptr(obj, prop);

>       char buffer[2 * 6 + 5 + 1];

>       char *p = buffer;

>

> @@ -315,7 +311,7 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    MACAddr *mac = qdev_get_prop_ptr(dev, prop);

> +    MACAddr *mac = qdev_get_prop_ptr(obj, prop);

>       int i, pos;

>       char *str;

>       const char *p;

> @@ -381,9 +377,8 @@ void qdev_prop_set_macaddr(DeviceState *dev, const char *name,

>   static void get_netdev(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    NICPeers *peers_ptr = qdev_get_prop_ptr(dev, prop);

> +    NICPeers *peers_ptr = qdev_get_prop_ptr(obj, prop);

>       char *p = g_strdup(peers_ptr->ncs[0] ? peers_ptr->ncs[0]->name : "");

>

>       visit_type_str(v, name, &p, errp);

> @@ -395,7 +390,7 @@ static void set_netdev(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    NICPeers *peers_ptr = qdev_get_prop_ptr(dev, prop);

> +    NICPeers *peers_ptr = qdev_get_prop_ptr(obj, prop);

>       NetClientState **ncs = peers_ptr->ncs;

>       NetClientState *peers[MAX_QUEUE_NUM];

>       int queues, err = 0, i = 0;

> @@ -461,9 +456,8 @@ const PropertyInfo qdev_prop_netdev = {

>   static void get_audiodev(Object *obj, Visitor *v, const char* name,

>                            void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    QEMUSoundCard *card = qdev_get_prop_ptr(dev, prop);

> +    QEMUSoundCard *card = qdev_get_prop_ptr(obj, prop);

>       char *p = g_strdup(audio_get_id(card));

>

>       visit_type_str(v, name, &p, errp);

> @@ -475,7 +469,7 @@ static void set_audiodev(Object *obj, Visitor *v, const char* name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    QEMUSoundCard *card = qdev_get_prop_ptr(dev, prop);

> +    QEMUSoundCard *card = qdev_get_prop_ptr(obj, prop);

>       AudioState *state;

>       int err = 0;

>       char *str;

> @@ -582,7 +576,7 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

>       uint64_t value;

>       Error *local_err = NULL;

>

> @@ -674,9 +668,8 @@ const PropertyInfo qdev_prop_multifd_compression = {

>   static void get_reserved_region(Object *obj, Visitor *v, const char *name,

>                                   void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);

> +    ReservedRegion *rr = qdev_get_prop_ptr(obj, prop);

>       char buffer[64];

>       char *p = buffer;

>       int rc;

> @@ -693,7 +686,7 @@ static void set_reserved_region(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);

> +    ReservedRegion *rr = qdev_get_prop_ptr(obj, prop);

>       Error *local_err = NULL;

>       const char *endptr;

>       char *str;

> @@ -761,7 +754,7 @@ static void set_pci_devfn(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    int32_t value, *ptr = qdev_get_prop_ptr(dev, prop);

> +    int32_t value, *ptr = qdev_get_prop_ptr(obj, prop);

>       unsigned int slot, fn, n;

>       char *str;

>

> @@ -804,8 +797,7 @@ invalid:

>   static int print_pci_devfn(Object *obj, Property *prop, char *dest,

>                              size_t len)

>   {

> -    DeviceState *dev = DEVICE(obj);

> -    int32_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    int32_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (*ptr == -1) {

>           return snprintf(dest, len, "<unset>");

> @@ -828,9 +820,8 @@ const PropertyInfo qdev_prop_pci_devfn = {

>   static void get_pci_host_devaddr(Object *obj, Visitor *v, const char *name,

>                                    void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);

> +    PCIHostDeviceAddress *addr = qdev_get_prop_ptr(obj, prop);

>       char buffer[] = "ffff:ff:ff.f";

>       char *p = buffer;

>       int rc = 0;

> @@ -857,7 +848,7 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);

> +    PCIHostDeviceAddress *addr = qdev_get_prop_ptr(obj, prop);

>       char *str, *p;

>       const char *e;

>       unsigned long val;

> @@ -950,9 +941,8 @@ const PropertyInfo qdev_prop_off_auto_pcibar = {

>   static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,

>                                      void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    PCIExpLinkSpeed *p = qdev_get_prop_ptr(dev, prop);

> +    PCIExpLinkSpeed *p = qdev_get_prop_ptr(obj, prop);

>       int speed;

>

>       switch (*p) {

> @@ -981,7 +971,7 @@ static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    PCIExpLinkSpeed *p = qdev_get_prop_ptr(dev, prop);

> +    PCIExpLinkSpeed *p = qdev_get_prop_ptr(obj, prop);

>       int speed;

>

>       if (dev->realized) {

> @@ -1027,9 +1017,8 @@ const PropertyInfo qdev_prop_pcie_link_speed = {

>   static void get_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,

>                                      void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    PCIExpLinkWidth *p = qdev_get_prop_ptr(dev, prop);

> +    PCIExpLinkWidth *p = qdev_get_prop_ptr(obj, prop);

>       int width;

>

>       switch (*p) {

> @@ -1067,7 +1056,7 @@ static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    PCIExpLinkWidth *p = qdev_get_prop_ptr(dev, prop);

> +    PCIExpLinkWidth *p = qdev_get_prop_ptr(obj, prop);

>       int width;

>

>       if (dev->realized) {

> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

> index 3a4638f4de..0a54a922c8 100644

> --- a/hw/core/qdev-properties.c

> +++ b/hw/core/qdev-properties.c

> @@ -38,9 +38,9 @@ void qdev_prop_allow_set_link_before_realize(const Object *obj,

>       }

>   }

>

> -void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)

> +void *qdev_get_prop_ptr(Object *obj, Property *prop)

>   {

> -    void *ptr = dev;

> +    void *ptr = obj;

>       ptr += prop->offset;

>       return ptr;

>   }

> @@ -48,9 +48,8 @@ void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)

>   void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name,

>                               void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    int *ptr = qdev_get_prop_ptr(dev, prop);

> +    int *ptr = qdev_get_prop_ptr(obj, prop);

>

>       visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);

>   }

> @@ -60,7 +59,7 @@ void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    int *ptr = qdev_get_prop_ptr(dev, prop);

> +    int *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (dev->realized) {

>           qdev_prop_set_after_realize(dev, name, errp);

> @@ -94,8 +93,7 @@ static uint32_t qdev_get_prop_mask(Property *prop)

>

>   static void bit_prop_set(Object *obj, Property *props, bool val)

>   {

> -    DeviceState *dev = DEVICE(obj);

> -    uint32_t *p = qdev_get_prop_ptr(dev, props);

> +    uint32_t *p = qdev_get_prop_ptr(obj, props);

>       uint32_t mask = qdev_get_prop_mask(props);

>       if (val) {

>           *p |= mask;

> @@ -107,9 +105,8 @@ static void bit_prop_set(Object *obj, Property *props, bool val)

>   static void prop_get_bit(Object *obj, Visitor *v, const char *name,

>                            void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint32_t *p = qdev_get_prop_ptr(dev, prop);

> +    uint32_t *p = qdev_get_prop_ptr(obj, prop);

>       bool value = (*p & qdev_get_prop_mask(prop)) != 0;

>

>       visit_type_bool(v, name, &value, errp);

> @@ -156,8 +153,7 @@ static uint64_t qdev_get_prop_mask64(Property *prop)

>

>   static void bit64_prop_set(Object *obj, Property *props, bool val)

>   {

> -    DeviceState *dev = DEVICE(obj);

> -    uint64_t *p = qdev_get_prop_ptr(dev, props);

> +    uint64_t *p = qdev_get_prop_ptr(obj, props);

>       uint64_t mask = qdev_get_prop_mask64(props);

>       if (val) {

>           *p |= mask;

> @@ -169,9 +165,8 @@ static void bit64_prop_set(Object *obj, Property *props, bool val)

>   static void prop_get_bit64(Object *obj, Visitor *v, const char *name,

>                              void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint64_t *p = qdev_get_prop_ptr(dev, prop);

> +    uint64_t *p = qdev_get_prop_ptr(obj, prop);

>       bool value = (*p & qdev_get_prop_mask64(prop)) != 0;

>

>       visit_type_bool(v, name, &value, errp);

> @@ -208,9 +203,8 @@ const PropertyInfo qdev_prop_bit64 = {

>   static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque,

>                        Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    bool *ptr = qdev_get_prop_ptr(dev, prop);

> +    bool *ptr = qdev_get_prop_ptr(obj, prop);

>

>       visit_type_bool(v, name, ptr, errp);

>   }

> @@ -220,7 +214,7 @@ static void set_bool(Object *obj, Visitor *v, const char *name, void *opaque,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    bool *ptr = qdev_get_prop_ptr(dev, prop);

> +    bool *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (dev->realized) {

>           qdev_prop_set_after_realize(dev, name, errp);

> @@ -242,9 +236,8 @@ const PropertyInfo qdev_prop_bool = {

>   static void get_uint8(Object *obj, Visitor *v, const char *name, void *opaque,

>                         Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint8_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       visit_type_uint8(v, name, ptr, errp);

>   }

> @@ -254,7 +247,7 @@ static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint8_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (dev->realized) {

>           qdev_prop_set_after_realize(dev, name, errp);

> @@ -288,9 +281,8 @@ const PropertyInfo qdev_prop_uint8 = {

>   void qdev_propinfo_get_uint16(Object *obj, Visitor *v, const char *name,

>                                 void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint16_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint16_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       visit_type_uint16(v, name, ptr, errp);

>   }

> @@ -300,7 +292,7 @@ static void set_uint16(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint16_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint16_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (dev->realized) {

>           qdev_prop_set_after_realize(dev, name, errp);

> @@ -322,9 +314,8 @@ const PropertyInfo qdev_prop_uint16 = {

>   static void get_uint32(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       visit_type_uint32(v, name, ptr, errp);

>   }

> @@ -334,7 +325,7 @@ static void set_uint32(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (dev->realized) {

>           qdev_prop_set_after_realize(dev, name, errp);

> @@ -347,9 +338,8 @@ static void set_uint32(Object *obj, Visitor *v, const char *name,

>   void qdev_propinfo_get_int32(Object *obj, Visitor *v, const char *name,

>                                void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    int32_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    int32_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       visit_type_int32(v, name, ptr, errp);

>   }

> @@ -359,7 +349,7 @@ static void set_int32(Object *obj, Visitor *v, const char *name, void *opaque,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    int32_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    int32_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (dev->realized) {

>           qdev_prop_set_after_realize(dev, name, errp);

> @@ -388,9 +378,8 @@ const PropertyInfo qdev_prop_int32 = {

>   static void get_uint64(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint64_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       visit_type_uint64(v, name, ptr, errp);

>   }

> @@ -400,7 +389,7 @@ static void set_uint64(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint64_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (dev->realized) {

>           qdev_prop_set_after_realize(dev, name, errp);

> @@ -413,9 +402,8 @@ static void set_uint64(Object *obj, Visitor *v, const char *name,

>   static void get_int64(Object *obj, Visitor *v, const char *name,

>                         void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    int64_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    int64_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       visit_type_int64(v, name, ptr, errp);

>   }

> @@ -425,7 +413,7 @@ static void set_int64(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    int64_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    int64_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (dev->realized) {

>           qdev_prop_set_after_realize(dev, name, errp);

> @@ -454,15 +442,14 @@ const PropertyInfo qdev_prop_int64 = {

>   static void release_string(Object *obj, const char *name, void *opaque)

>   {

>       Property *prop = opaque;

> -    g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj), prop));

> +    g_free(*(char **)qdev_get_prop_ptr(obj, prop));

>   }

>

>   static void get_string(Object *obj, Visitor *v, const char *name,

>                          void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    char **ptr = qdev_get_prop_ptr(dev, prop);

> +    char **ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (!*ptr) {

>           char *str = (char *)"";

> @@ -477,7 +464,7 @@ static void set_string(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    char **ptr = qdev_get_prop_ptr(dev, prop);

> +    char **ptr = qdev_get_prop_ptr(obj, prop);

>       char *str;

>

>       if (dev->realized) {

> @@ -515,9 +502,8 @@ const PropertyInfo qdev_prop_on_off_auto = {

>   void qdev_propinfo_get_size32(Object *obj, Visitor *v, const char *name,

>                                 void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

>       uint64_t value = *ptr;

>

>       visit_type_size(v, name, &value, errp);

> @@ -528,7 +514,7 @@ static void set_size32(Object *obj, Visitor *v, const char *name, void *opaque,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

>       uint64_t value;

>

>       if (dev->realized) {

> @@ -563,9 +549,8 @@ const PropertyInfo qdev_prop_size32 = {

>   static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque,

>                        Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    QemuUUID *uuid = qdev_get_prop_ptr(dev, prop);

> +    QemuUUID *uuid = qdev_get_prop_ptr(obj, prop);

>       char buffer[UUID_FMT_LEN + 1];

>       char *p = buffer;

>

> @@ -581,7 +566,7 @@ static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    QemuUUID *uuid = qdev_get_prop_ptr(dev, prop);

> +    QemuUUID *uuid = qdev_get_prop_ptr(obj, prop);

>       char *str;

>

>       if (dev->realized) {

> @@ -653,7 +638,7 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,

>        */

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint32_t *alenptr = qdev_get_prop_ptr(dev, prop);

> +    uint32_t *alenptr = qdev_get_prop_ptr(obj, prop);

>       void **arrayptr = (void *)dev + prop->arrayoffset;

>       void *eltptr;

>       const char *arrayname;

> @@ -699,7 +684,7 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,

>            * being inside the device struct.

>            */

>           arrayprop->prop.offset = eltptr - (void *)dev;

> -        assert(qdev_get_prop_ptr(dev, &arrayprop->prop) == eltptr);

> +        assert(qdev_get_prop_ptr(obj, &arrayprop->prop) == eltptr);

>           object_property_add(obj, propname,

>                               arrayprop->prop.info->name,

>                               arrayprop->prop.info->get,

> @@ -893,9 +878,8 @@ void qdev_prop_set_globals(DeviceState *dev)

>   static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,

>                        Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint64_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       visit_type_size(v, name, ptr, errp);

>   }

> @@ -905,7 +889,7 @@ static void set_size(Object *obj, Visitor *v, const char *name, void *opaque,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint64_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (dev->realized) {

>           qdev_prop_set_after_realize(dev, name, errp);

> diff --git a/hw/s390x/css.c b/hw/s390x/css.c

> index 9961cfe7bf..2b8f33fec2 100644

> --- a/hw/s390x/css.c

> +++ b/hw/s390x/css.c

> @@ -2343,9 +2343,8 @@ void css_reset(void)

>   static void get_css_devid(Object *obj, Visitor *v, const char *name,

>                             void *opaque, Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    CssDevId *dev_id = qdev_get_prop_ptr(dev, prop);

> +    CssDevId *dev_id = qdev_get_prop_ptr(obj, prop);

>       char buffer[] = "xx.x.xxxx";

>       char *p = buffer;

>       int r;

> @@ -2375,7 +2374,7 @@ static void set_css_devid(Object *obj, Visitor *v, const char *name,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    CssDevId *dev_id = qdev_get_prop_ptr(dev, prop);

> +    CssDevId *dev_id = qdev_get_prop_ptr(obj, prop);

>       char *str;

>       int num, n1, n2;

>       unsigned int cssid, ssid, devid;

> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c

> index fb4cee87a4..b59cf0651a 100644

> --- a/hw/s390x/s390-pci-bus.c

> +++ b/hw/s390x/s390-pci-bus.c

> @@ -1248,7 +1248,7 @@ static void s390_pci_get_fid(Object *obj, Visitor *v, const char *name,

>                            void *opaque, Error **errp)

>   {

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(DEVICE(obj), prop);

> +    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       visit_type_uint32(v, name, ptr, errp);

>   }

> @@ -1259,7 +1259,7 @@ static void s390_pci_set_fid(Object *obj, Visitor *v, const char *name,

>       DeviceState *dev = DEVICE(obj);

>       S390PCIBusDevice *zpci = S390_PCI_DEVICE(obj);

>       Property *prop = opaque;

> -    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint32_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (dev->realized) {

>           qdev_prop_set_after_realize(dev, name, errp);

> diff --git a/hw/vfio/pci-quirks.c b/hw/vfio/pci-quirks.c

> index 57150913b7..53569925a2 100644

> --- a/hw/vfio/pci-quirks.c

> +++ b/hw/vfio/pci-quirks.c

> @@ -1488,9 +1488,8 @@ static void get_nv_gpudirect_clique_id(Object *obj, Visitor *v,

>                                          const char *name, void *opaque,

>                                          Error **errp)

>   {

> -    DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint8_t *ptr = qdev_get_prop_ptr(obj, prop);

>

>       visit_type_uint8(v, name, ptr, errp);

>   }

> @@ -1501,7 +1500,7 @@ static void set_nv_gpudirect_clique_id(Object *obj, Visitor *v,

>   {

>       DeviceState *dev = DEVICE(obj);

>       Property *prop = opaque;

> -    uint8_t value, *ptr = qdev_get_prop_ptr(dev, prop);

> +    uint8_t value, *ptr = qdev_get_prop_ptr(obj, prop);

>

>       if (dev->realized) {

>           qdev_prop_set_after_realize(dev, name, errp);
Marc-André Lureau Oct. 30, 2020, 7:11 a.m. UTC | #4
On Fri, Oct 30, 2020 at 2:06 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> This setter is one of the very few property setters that don't

> check dev->realized, and there's no reason to make size

> properties different from the rest.  Add the missing check.

>

> Fixes: e8cd45c78f53 ("qdev: Add SIZE type to qdev properties")

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>


Suitable for 5.2 imho (you should send/pr separately)

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


---
> Cc: Paolo Bonzini <pbonzini@redhat.com>

> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> Cc: Eduardo Habkost <ehabkost@redhat.com>

> Cc: qemu-devel@nongnu.org

> ---

>  hw/core/qdev-properties.c | 5 +++++

>  1 file changed, 5 insertions(+)

>

> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

> index 12a053e732..67ae19df05 100644

> --- a/hw/core/qdev-properties.c

> +++ b/hw/core/qdev-properties.c

> @@ -905,6 +905,11 @@ static void set_size(Object *obj, Visitor *v, const

> char *name, void *opaque,

>      Property *prop = opaque;

>      uint64_t *ptr = qdev_get_prop_ptr(dev, prop);

>

> +    if (dev->realized) {

> +        qdev_prop_set_after_realize(dev, name, errp);

> +        return;

> +    }

> +

>      visit_type_size(v, name, ptr, errp);

>  }

>

> --

> 2.28.0

>

>

>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:06 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This setter is one of the very few property setters that don&#39;t<br>
check dev-&gt;realized, and there&#39;s no reason to make size<br>
properties different from the rest.  Add the missing check.<br>
<br>
Fixes: e8cd45c78f53 (&quot;qdev: Add SIZE type to qdev properties&quot;)<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div>Suitable for 5.2 imho (you should send/pr separately)<br></div><div><br></div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>&gt;</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

---<br>
Cc: Paolo Bonzini &lt;<a href="mailto:pbonzini@redhat.com" target="_blank">pbonzini@redhat.com</a>&gt;<br>
Cc: &quot;Daniel P. Berrangé&quot; &lt;<a href="mailto:berrange@redhat.com" target="_blank">berrange@redhat.com</a>&gt;<br>
Cc: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>
Cc: <a href="mailto:qemu-devel@nongnu.org" target="_blank">qemu-devel@nongnu.org</a><br>
---<br>
 hw/core/qdev-properties.c | 5 +++++<br>
 1 file changed, 5 insertions(+)<br>
<br>
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c<br>
index 12a053e732..67ae19df05 100644<br>
--- a/hw/core/qdev-properties.c<br>
+++ b/hw/core/qdev-properties.c<br>
@@ -905,6 +905,11 @@ static void set_size(Object *obj, Visitor *v, const char *name, void *opaque,<br>
     Property *prop = opaque;<br>
     uint64_t *ptr = qdev_get_prop_ptr(dev, prop);<br>
<br>
+    if (dev-&gt;realized) {<br>
+        qdev_prop_set_after_realize(dev, name, errp);<br>
+        return;<br>
+    }<br>
+<br>
     visit_type_size(v, name, ptr, errp);<br>
 }<br>
<br>
-- <br>
2.28.0<br>
<br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 7:29 a.m. UTC | #5
On Fri, Oct 30, 2020 at 2:07 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> Make the code more generic and not specific to TYPE_DEVICE.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>


Nice cleanup!, but fails to build atm

../hw/block/xen-block.c:403:9: error: ‘dev’ undeclared (first use in this
function); did you mean ‘vdev’?
  403 |     if (dev->realized) {

-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:07 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Make the code more generic and not specific to TYPE_DEVICE.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div>Nice cleanup!, but fails to build atm</div><div><br></div><div>../hw/block/xen-block.c:403:9: error: ‘dev’ undeclared (first use in this function); did you mean ‘vdev’?<br>  403 |     if (dev-&gt;realized) {</div><br></div>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 7:34 a.m. UTC | #6
On Fri, Oct 30, 2020 at 11:29 AM Marc-André Lureau <
marcandre.lureau@gmail.com> wrote:

>

>

> On Fri, Oct 30, 2020 at 2:07 AM Eduardo Habkost <ehabkost@redhat.com>

> wrote:

>

>> Make the code more generic and not specific to TYPE_DEVICE.

>>

>> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>>

>

> Nice cleanup!, but fails to build atm

>

> ../hw/block/xen-block.c:403:9: error: ‘dev’ undeclared (first use in this

> function); did you mean ‘vdev’?

>   403 |     if (dev->realized) {

>

>

That seems to be the only issue though, so with that fixed:
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 11:29 AM Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@gmail.com">marcandre.lureau@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:07 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Make the code more generic and not specific to TYPE_DEVICE.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div>Nice cleanup!, but fails to build atm</div><div><br></div><div>../hw/block/xen-block.c:403:9: error: ‘dev’ undeclared (first use in this function); did you mean ‘vdev’?<br>  403 |     if (dev-&gt;realized) {</div><br></div></div></blockquote></div><div class="gmail_quote"><br></div><div class="gmail_quote">That seems to be the only issue though, so with that fixed:</div><div class="gmail_quote">Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>&gt;</div><div class="gmail_quote"><br></div>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 7:42 a.m. UTC | #7
On Fri, Oct 30, 2020 at 2:05 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> An empty props array is unnecessary, we can just not call

> device_class_set_props().

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>


Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>




-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:05 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">An empty props array is unnecessary, we can just not call<br>
device_class_set_props().<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com" target="_blank">marcandre.lureau@redhat.com</a>&gt;</div><br></div><br clear="all"><br>-- <br><div dir="ltr">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 7:42 a.m. UTC | #8
On Fri, Oct 30, 2020 at 2:05 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> Move everything related to Property and PropertyInfo to

> qdev-properties.[ch] to make it easier to refactor that code.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>


Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:05 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Move everything related to Property and PropertyInfo to<br>
qdev-properties.[ch] to make it easier to refactor that code.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com" target="_blank">marcandre.lureau@redhat.com</a>&gt;</div><br></div>-- <br><div dir="ltr">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 7:45 a.m. UTC | #9
On Fri, Oct 30, 2020 at 2:09 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> Make the code more generic and not specific to TYPE_DEVICE.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>


 Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>




-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:09 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Make the code more generic and not specific to TYPE_DEVICE.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div> Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com" target="_blank">marcandre.lureau@redhat.com</a>&gt;</div><div> <br></div><br clear="all"></div><br>-- <br><div dir="ltr">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 8:05 a.m. UTC | #10
On Fri, Oct 30, 2020 at 2:10 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> Every single qdev property setter function manually checks

> dev->realized.  We can just check dev->realized inside

> qdev_property_set() instead.

>

> The check is being added as a separate function

> (qdev_prop_allow_set()) because it will become a callback later.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>


nice
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:10 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Every single qdev property setter function manually checks<br>
dev-&gt;realized.  We can just check dev-&gt;realized inside<br>
qdev_property_set() instead.<br>
<br>
The check is being added as a separate function<br>
(qdev_prop_allow_set()) because it will become a callback later.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div>nice<br></div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>&gt;  <br></div></div><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 8:06 a.m. UTC | #11
On Fri, Oct 30, 2020 at 2:11 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> We'll add extra code to the qdev property getters and setters, so

> add wrapper functions where additional actions can be performed.

>

> The new functions have a "static_prop_" prefix instead of "qdev_"

> because the code will eventually be moved outside

> qdev-properties.c, to common QOM code.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>


Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>




-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:11 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">We&#39;ll add extra code to the qdev property getters and setters, so<br>
add wrapper functions where additional actions can be performed.<br>
<br>
The new functions have a &quot;static_prop_&quot; prefix instead of &quot;qdev_&quot;<br>
because the code will eventually be moved outside<br>
qdev-properties.c, to common QOM code.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com" target="_blank">marcandre.lureau@redhat.com</a>&gt;   <br></div><br></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 9:45 a.m. UTC | #12
On Fri, Oct 30, 2020 at 2:13 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> Support Property.set_default and PropertyInfo.description even if

> PropertyInfo.create is set.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

> ---

> Cc: Paolo Bonzini <pbonzini@redhat.com>

> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> Cc: Eduardo Habkost <ehabkost@redhat.com>

> Cc: qemu-devel@nongnu.org

> ---

>  hw/core/qdev-properties.c | 17 +++++++++--------

>  1 file changed, 9 insertions(+), 8 deletions(-)

>

> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

> index 89e292dc25..ad685f371d 100644

> --- a/hw/core/qdev-properties.c

> +++ b/hw/core/qdev-properties.c

> @@ -912,24 +912,25 @@ void qdev_property_add_static(DeviceState *dev,

> Property *prop)

>  static void qdev_class_add_property(DeviceClass *klass, Property *prop)

>  {

>      ObjectClass *oc = OBJECT_CLASS(klass);

> +    ObjectProperty *op;

>

>      if (prop->info->create) {

> -        prop->info->create(oc, prop);

> +        op = prop->info->create(oc, prop);

>      } else {

> -        ObjectProperty *op;

> -

>          op = object_class_property_add(oc,

>                                         prop->name, prop->info->name,

>                                         static_prop_getter(prop->info),

>                                         static_prop_setter(prop->info),

>                                         prop->info->release,

>                                         prop);

> -        if (prop->set_default) {

> -            prop->info->set_default_value(op, prop);

> -        }

>      }

> -    object_class_property_set_description(oc, prop->name,

> -                                          prop->info->description);

> +    if (prop->set_default) {

> +        prop->info->set_default_value(op, prop);

> +    }

> +    if (prop->info->description) {

> +        object_class_property_set_description(oc, prop->name,

> +                                            prop->info->description);

>


indentation is off, other than that:
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


+    }
>  }

>

>  /**

> --

> 2.28.0

>

>

>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:13 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Support Property.set_default and PropertyInfo.description even if<br>
PropertyInfo.create is set.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>

---<br>
Cc: Paolo Bonzini &lt;<a href="mailto:pbonzini@redhat.com" target="_blank">pbonzini@redhat.com</a>&gt;<br>
Cc: &quot;Daniel P. Berrangé&quot; &lt;<a href="mailto:berrange@redhat.com" target="_blank">berrange@redhat.com</a>&gt;<br>
Cc: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>
Cc: <a href="mailto:qemu-devel@nongnu.org" target="_blank">qemu-devel@nongnu.org</a><br>
---<br>
 hw/core/qdev-properties.c | 17 +++++++++--------<br>
 1 file changed, 9 insertions(+), 8 deletions(-)<br>
<br>
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c<br>
index 89e292dc25..ad685f371d 100644<br>
--- a/hw/core/qdev-properties.c<br>
+++ b/hw/core/qdev-properties.c<br>
@@ -912,24 +912,25 @@ void qdev_property_add_static(DeviceState *dev, Property *prop)<br>
 static void qdev_class_add_property(DeviceClass *klass, Property *prop)<br>
 {<br>
     ObjectClass *oc = OBJECT_CLASS(klass);<br>
+    ObjectProperty *op;<br>
<br>
     if (prop-&gt;info-&gt;create) {<br>
-        prop-&gt;info-&gt;create(oc, prop);<br>
+        op = prop-&gt;info-&gt;create(oc, prop);<br>
     } else {<br>
-        ObjectProperty *op;<br>
-<br>
         op = object_class_property_add(oc,<br>
                                        prop-&gt;name, prop-&gt;info-&gt;name,<br>
                                        static_prop_getter(prop-&gt;info),<br>
                                        static_prop_setter(prop-&gt;info),<br>
                                        prop-&gt;info-&gt;release,<br>
                                        prop);<br>
-        if (prop-&gt;set_default) {<br>
-            prop-&gt;info-&gt;set_default_value(op, prop);<br>
-        }<br>
     }<br>
-    object_class_property_set_description(oc, prop-&gt;name,<br>
-                                          prop-&gt;info-&gt;description);<br>
+    if (prop-&gt;set_default) {<br>
+        prop-&gt;info-&gt;set_default_value(op, prop);<br>
+    }<br>
+    if (prop-&gt;info-&gt;description) {<br>
+        object_class_property_set_description(oc, prop-&gt;name,<br>
+                                            prop-&gt;info-&gt;description);<br></blockquote><div><br></div><div>indentation is off, other than that:</div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>&gt;</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+    }<br>
 }<br>
<br>
 /**<br>
-- <br>
2.28.0<br>
<br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 9:59 a.m. UTC | #13
On Fri, Oct 30, 2020 at 2:18 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> We're just doing pointer math with the device pointer, we can

> simply use obj instead.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>


 Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


---
> Cc: Paolo Bonzini <pbonzini@redhat.com>

> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> Cc: Eduardo Habkost <ehabkost@redhat.com>

> Cc: qemu-devel@nongnu.org

> ---

>  hw/core/qdev-properties.c | 5 ++---

>  1 file changed, 2 insertions(+), 3 deletions(-)

>

> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

> index 68b1666e14..27c09255d7 100644

> --- a/hw/core/qdev-properties.c

> +++ b/hw/core/qdev-properties.c

> @@ -610,10 +610,9 @@ static void set_prop_arraylen(Object *obj, Visitor

> *v, const char *name,

>       * array-length field in the device struct, we have to create the

>       * array itself and dynamically add the corresponding properties.

>       */

> -    DeviceState *dev = DEVICE(obj);

>      Property *prop = opaque;

>      uint32_t *alenptr = qdev_get_prop_ptr(obj, prop);

> -    void **arrayptr = (void *)dev + prop->arrayoffset;

> +    void **arrayptr = (void *)obj + prop->arrayoffset;

>      void *eltptr;

>      const char *arrayname;

>      int i;

> @@ -653,7 +652,7 @@ static void set_prop_arraylen(Object *obj, Visitor *v,

> const char *name,

>           * they get the right answer despite the array element not

> actually

>           * being inside the device struct.

>           */

> -        arrayprop->prop.offset = eltptr - (void *)dev;

> +        arrayprop->prop.offset = eltptr - (void *)obj;

>          assert(qdev_get_prop_ptr(obj, &arrayprop->prop) == eltptr);

>          object_property_add(obj, propname,

>                              arrayprop->prop.info->name,

> --

> 2.28.0

>

>

>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:18 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">We&#39;re just doing pointer math with the device pointer, we can<br>
simply use obj instead.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div> Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>&gt;</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

---<br>
Cc: Paolo Bonzini &lt;<a href="mailto:pbonzini@redhat.com" target="_blank">pbonzini@redhat.com</a>&gt;<br>
Cc: &quot;Daniel P. Berrangé&quot; &lt;<a href="mailto:berrange@redhat.com" target="_blank">berrange@redhat.com</a>&gt;<br>
Cc: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>
Cc: <a href="mailto:qemu-devel@nongnu.org" target="_blank">qemu-devel@nongnu.org</a><br>
---<br>
 hw/core/qdev-properties.c | 5 ++---<br>
 1 file changed, 2 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c<br>
index 68b1666e14..27c09255d7 100644<br>
--- a/hw/core/qdev-properties.c<br>
+++ b/hw/core/qdev-properties.c<br>
@@ -610,10 +610,9 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,<br>
      * array-length field in the device struct, we have to create the<br>
      * array itself and dynamically add the corresponding properties.<br>
      */<br>
-    DeviceState *dev = DEVICE(obj);<br>
     Property *prop = opaque;<br>
     uint32_t *alenptr = qdev_get_prop_ptr(obj, prop);<br>
-    void **arrayptr = (void *)dev + prop-&gt;arrayoffset;<br>
+    void **arrayptr = (void *)obj + prop-&gt;arrayoffset;<br>
     void *eltptr;<br>
     const char *arrayname;<br>
     int i;<br>
@@ -653,7 +652,7 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,<br>
          * they get the right answer despite the array element not actually<br>
          * being inside the device struct.<br>
          */<br>
-        arrayprop-&gt;prop.offset = eltptr - (void *)dev;<br>
+        arrayprop-&gt;prop.offset = eltptr - (void *)obj;<br>
         assert(qdev_get_prop_ptr(obj, &amp;arrayprop-&gt;prop) == eltptr);<br>
         object_property_add(obj, propname,<br>
                             arrayprop-&gt;prop.info-&gt;name,<br>
-- <br>
2.28.0<br>
<br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 10:03 a.m. UTC | #14
On Fri, Oct 30, 2020 at 2:17 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> The array property registration code is hard to follow.  Move the

> two steps into separate functions that have clear

> responsibilities.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

> ---

> Cc: Paolo Bonzini <pbonzini@redhat.com>

> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> Cc: Eduardo Habkost <ehabkost@redhat.com>

> Cc: qemu-devel@nongnu.org

> ---

>  hw/core/qdev-properties.c | 60 ++++++++++++++++++++++++++-------------

>  1 file changed, 41 insertions(+), 19 deletions(-)

>

> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

> index 27c09255d7..1f06dfb5d5 100644

> --- a/hw/core/qdev-properties.c

> +++ b/hw/core/qdev-properties.c

> @@ -588,6 +588,32 @@ typedef struct {

>      ObjectPropertyRelease *release;

>  } ArrayElementProperty;

>

> +/**

> + * Create ArrayElementProperty based on array length property

> + * @array_len_prop (which was previously defined using

> DEFINE_PROP_ARRAY()).

> + */

>


(some day we will have to clarify our API doc style, but not now ;)

+static ArrayElementProperty *array_element_new(Object *obj,
> +                                               Property *array_len_prop,

> +                                               const char *arrayname,

> +                                               int index,

> +                                               void *eltptr)

> +{

> +    char *propname = g_strdup_printf("%s[%d]", arrayname, index);

> +    ArrayElementProperty *arrayprop = g_new0(ArrayElementProperty, 1);

> +    arrayprop->release = array_len_prop->arrayinfo->release;

> +    arrayprop->propname = propname;

> +    arrayprop->prop.info = array_len_prop->arrayinfo;

> +    arrayprop->prop.name = propname;

> +    /* This ugly piece of pointer arithmetic sets up the offset so

> +     * that when the underlying get/set hooks call qdev_get_prop_ptr

> +     * they get the right answer despite the array element not actually

> +     * being inside the device struct.

> +     */

> +    arrayprop->prop.offset = eltptr - (void *)obj;

> +    assert(qdev_get_prop_ptr(obj, &arrayprop->prop) == eltptr);

> +    return arrayprop;

> +}

> +

>  /* object property release callback for array element properties:

>   * we call the underlying element's property release hook, and

>   * then free the memory we allocated when we added the property.

> @@ -602,6 +628,18 @@ static void array_element_release(Object *obj, const

> char *name, void *opaque)

>      g_free(p);

>  }

>

> +static void object_property_add_array_element(Object *obj,

> +                                              Property *array_len_prop,

> +                                              ArrayElementProperty *prop)

> +{

> +    object_property_add(obj, prop->prop.name,

> +                        prop->prop.info->name,

> +                        static_prop_getter(prop->prop.info),

> +                        static_prop_setter(prop->prop.info),

> +                        array_element_release,

> +                        prop);

> +}

> +

>  static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,

>                                void *opaque, Error **errp)

>  {

> @@ -641,25 +679,9 @@ static void set_prop_arraylen(Object *obj, Visitor

> *v, const char *name,

>       */

>      *arrayptr = eltptr = g_malloc0(*alenptr * prop->arrayfieldsize);

>      for (i = 0; i < *alenptr; i++, eltptr += prop->arrayfieldsize) {

> -        char *propname = g_strdup_printf("%s[%d]", arrayname, i);

> -        ArrayElementProperty *arrayprop = g_new0(ArrayElementProperty, 1);

> -        arrayprop->release = prop->arrayinfo->release;

> -        arrayprop->propname = propname;

> -        arrayprop->prop.info = prop->arrayinfo;

> -        arrayprop->prop.name = propname;

> -        /* This ugly piece of pointer arithmetic sets up the offset so

> -         * that when the underlying get/set hooks call qdev_get_prop_ptr

> -         * they get the right answer despite the array element not

> actually

> -         * being inside the device struct.

> -         */

> -        arrayprop->prop.offset = eltptr - (void *)obj;

> -        assert(qdev_get_prop_ptr(obj, &arrayprop->prop) == eltptr);

> -        object_property_add(obj, propname,

> -                            arrayprop->prop.info->name,

> -                            static_prop_getter(arrayprop->prop.info),

> -                            static_prop_setter(arrayprop->prop.info),

> -                            array_element_release,

> -                            arrayprop);

> +        ArrayElementProperty *elt_prop = array_element_new(obj, prop,

> arrayname,

> +                                                           i, eltptr);

> +        object_property_add_array_element(obj, prop, elt_prop);

>      }

>  }

>

> --

> 2.28.0

>



Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:17 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The array property registration code is hard to follow.  Move the<br>
two steps into separate functions that have clear<br>
responsibilities.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>

---<br>
Cc: Paolo Bonzini &lt;<a href="mailto:pbonzini@redhat.com" target="_blank">pbonzini@redhat.com</a>&gt;<br>
Cc: &quot;Daniel P. Berrangé&quot; &lt;<a href="mailto:berrange@redhat.com" target="_blank">berrange@redhat.com</a>&gt;<br>
Cc: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>
Cc: <a href="mailto:qemu-devel@nongnu.org" target="_blank">qemu-devel@nongnu.org</a><br>
---<br>
 hw/core/qdev-properties.c | 60 ++++++++++++++++++++++++++-------------<br>
 1 file changed, 41 insertions(+), 19 deletions(-)<br>
<br>
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c<br>
index 27c09255d7..1f06dfb5d5 100644<br>
--- a/hw/core/qdev-properties.c<br>
+++ b/hw/core/qdev-properties.c<br>
@@ -588,6 +588,32 @@ typedef struct {<br>
     ObjectPropertyRelease *release;<br>
 } ArrayElementProperty;<br>
<br>
+/**<br>
+ * Create ArrayElementProperty based on array length property<br>
+ * @array_len_prop (which was previously defined using DEFINE_PROP_ARRAY()).<br>
+ */<br></blockquote><div><br></div><div>(some day we will have to clarify our API doc style, but not now ;)</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+static ArrayElementProperty *array_element_new(Object *obj,<br>
+                                               Property *array_len_prop,<br>
+                                               const char *arrayname,<br>
+                                               int index,<br>
+                                               void *eltptr)<br>
+{<br>
+    char *propname = g_strdup_printf(&quot;%s[%d]&quot;, arrayname, index);<br>
+    ArrayElementProperty *arrayprop = g_new0(ArrayElementProperty, 1);<br>
+    arrayprop-&gt;release = array_len_prop-&gt;arrayinfo-&gt;release;<br>
+    arrayprop-&gt;propname = propname;<br>
+    arrayprop-&gt;<a href="http://prop.info" rel="noreferrer" target="_blank">prop.info</a> = array_len_prop-&gt;arrayinfo;<br>
+    arrayprop-&gt;<a href="http://prop.name" rel="noreferrer" target="_blank">prop.name</a> = propname;<br>
+    /* This ugly piece of pointer arithmetic sets up the offset so<br>
+     * that when the underlying get/set hooks call qdev_get_prop_ptr<br>
+     * they get the right answer despite the array element not actually<br>
+     * being inside the device struct.<br>
+     */<br>
+    arrayprop-&gt;prop.offset = eltptr - (void *)obj;<br>
+    assert(qdev_get_prop_ptr(obj, &amp;arrayprop-&gt;prop) == eltptr);<br>
+    return arrayprop;<br>
+}<br>
+<br>
 /* object property release callback for array element properties:<br>
  * we call the underlying element&#39;s property release hook, and<br>
  * then free the memory we allocated when we added the property.<br>
@@ -602,6 +628,18 @@ static void array_element_release(Object *obj, const char *name, void *opaque)<br>
     g_free(p);<br>
 }<br>
<br>
+static void object_property_add_array_element(Object *obj,<br>
+                                              Property *array_len_prop,<br>
+                                              ArrayElementProperty *prop)<br>
+{<br>
+    object_property_add(obj, prop-&gt;<a href="http://prop.name" rel="noreferrer" target="_blank">prop.name</a>,<br>
+                        prop-&gt;prop.info-&gt;name,<br>
+                        static_prop_getter(prop-&gt;<a href="http://prop.info" rel="noreferrer" target="_blank">prop.info</a>),<br>
+                        static_prop_setter(prop-&gt;<a href="http://prop.info" rel="noreferrer" target="_blank">prop.info</a>),<br>
+                        array_element_release,<br>
+                        prop);<br>
+}<br>
+<br>
 static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,<br>
                               void *opaque, Error **errp)<br>
 {<br>
@@ -641,25 +679,9 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,<br>
      */<br>
     *arrayptr = eltptr = g_malloc0(*alenptr * prop-&gt;arrayfieldsize);<br>
     for (i = 0; i &lt; *alenptr; i++, eltptr += prop-&gt;arrayfieldsize) {<br>
-        char *propname = g_strdup_printf(&quot;%s[%d]&quot;, arrayname, i);<br>
-        ArrayElementProperty *arrayprop = g_new0(ArrayElementProperty, 1);<br>
-        arrayprop-&gt;release = prop-&gt;arrayinfo-&gt;release;<br>
-        arrayprop-&gt;propname = propname;<br>
-        arrayprop-&gt;<a href="http://prop.info" rel="noreferrer" target="_blank">prop.info</a> = prop-&gt;arrayinfo;<br>
-        arrayprop-&gt;<a href="http://prop.name" rel="noreferrer" target="_blank">prop.name</a> = propname;<br>
-        /* This ugly piece of pointer arithmetic sets up the offset so<br>
-         * that when the underlying get/set hooks call qdev_get_prop_ptr<br>
-         * they get the right answer despite the array element not actually<br>
-         * being inside the device struct.<br>
-         */<br>
-        arrayprop-&gt;prop.offset = eltptr - (void *)obj;<br>
-        assert(qdev_get_prop_ptr(obj, &amp;arrayprop-&gt;prop) == eltptr);<br>
-        object_property_add(obj, propname,<br>
-                            arrayprop-&gt;prop.info-&gt;name,<br>
-                            static_prop_getter(arrayprop-&gt;<a href="http://prop.info" rel="noreferrer" target="_blank">prop.info</a>),<br>
-                            static_prop_setter(arrayprop-&gt;<a href="http://prop.info" rel="noreferrer" target="_blank">prop.info</a>),<br>
-                            array_element_release,<br>
-                            arrayprop);<br>
+        ArrayElementProperty *elt_prop = array_element_new(obj, prop, arrayname,<br>
+                                                           i, eltptr);<br>
+        object_property_add_array_element(obj, prop, elt_prop);<br>
     }<br>
 }<br>
<br>
-- <br>
2.28.0<br></blockquote><div><br></div><div> </div></div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>&gt;<br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 10:10 a.m. UTC | #15
On Fri, Oct 30, 2020 at 2:03 PM Marc-André Lureau <
marcandre.lureau@gmail.com> wrote:

>

>

> On Fri, Oct 30, 2020 at 2:17 AM Eduardo Habkost <ehabkost@redhat.com>

> wrote:

>

>> The array property registration code is hard to follow.  Move the

>> two steps into separate functions that have clear

>> responsibilities.

>>

>> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>> ---

>> Cc: Paolo Bonzini <pbonzini@redhat.com>

>> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

>> Cc: Eduardo Habkost <ehabkost@redhat.com>

>> Cc: qemu-devel@nongnu.org

>> ---

>>  hw/core/qdev-properties.c | 60 ++++++++++++++++++++++++++-------------

>>  1 file changed, 41 insertions(+), 19 deletions(-)

>>

>> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

>> index 27c09255d7..1f06dfb5d5 100644

>> --- a/hw/core/qdev-properties.c

>> +++ b/hw/core/qdev-properties.c

>> @@ -588,6 +588,32 @@ typedef struct {

>>      ObjectPropertyRelease *release;

>>  } ArrayElementProperty;

>>

>> +/**

>> + * Create ArrayElementProperty based on array length property

>> + * @array_len_prop (which was previously defined using

>> DEFINE_PROP_ARRAY()).

>> + */

>>

>

> (some day we will have to clarify our API doc style, but not now ;)

>

>

Actually, I didn't realize but we do use kerneldoc in sphinx nowadays.

Peter, shouldn't you have updated CODING_STYLE.rst to say explicitly that
our C API should be documented with it?

How do we enforce or check the comment style across the code base, or
per-files (without necessarily including it in the generated manual/doc)?

thanks

-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:03 PM Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@gmail.com">marcandre.lureau@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:17 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The array property registration code is hard to follow.  Move the<br>
two steps into separate functions that have clear<br>
responsibilities.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>

---<br>
Cc: Paolo Bonzini &lt;<a href="mailto:pbonzini@redhat.com" target="_blank">pbonzini@redhat.com</a>&gt;<br>
Cc: &quot;Daniel P. Berrangé&quot; &lt;<a href="mailto:berrange@redhat.com" target="_blank">berrange@redhat.com</a>&gt;<br>
Cc: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>
Cc: <a href="mailto:qemu-devel@nongnu.org" target="_blank">qemu-devel@nongnu.org</a><br>
---<br>
 hw/core/qdev-properties.c | 60 ++++++++++++++++++++++++++-------------<br>
 1 file changed, 41 insertions(+), 19 deletions(-)<br>
<br>
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c<br>
index 27c09255d7..1f06dfb5d5 100644<br>
--- a/hw/core/qdev-properties.c<br>
+++ b/hw/core/qdev-properties.c<br>
@@ -588,6 +588,32 @@ typedef struct {<br>
     ObjectPropertyRelease *release;<br>
 } ArrayElementProperty;<br>
<br>
+/**<br>
+ * Create ArrayElementProperty based on array length property<br>
+ * @array_len_prop (which was previously defined using DEFINE_PROP_ARRAY()).<br>
+ */<br></blockquote><div><br></div><div>(some day we will have to clarify our API doc style, but not now ;)</div><br clear="all"></div></div></blockquote><div><br></div><div>Actually, I didn&#39;t realize but we do use kerneldoc in sphinx nowadays.</div><div><br></div><div>Peter, shouldn&#39;t you have updated CODING_STYLE.rst to say explicitly that our C API should be documented with it?</div><div><br></div><div>How do we enforce or check the comment style across the code base, or per-files (without necessarily including it in the generated manual/doc)?</div><div><br></div><div>thanks<br></div></div><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Daniel P. Berrangé Oct. 30, 2020, 10:12 a.m. UTC | #16
On Fri, Oct 30, 2020 at 02:10:26PM +0400, Marc-André Lureau wrote:
> On Fri, Oct 30, 2020 at 2:03 PM Marc-André Lureau <

> marcandre.lureau@gmail.com> wrote:

> 

> >

> >

> > On Fri, Oct 30, 2020 at 2:17 AM Eduardo Habkost <ehabkost@redhat.com>

> > wrote:

> >

> >> The array property registration code is hard to follow.  Move the

> >> two steps into separate functions that have clear

> >> responsibilities.

> >>

> >> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

> >> ---

> >> Cc: Paolo Bonzini <pbonzini@redhat.com>

> >> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> >> Cc: Eduardo Habkost <ehabkost@redhat.com>

> >> Cc: qemu-devel@nongnu.org

> >> ---

> >>  hw/core/qdev-properties.c | 60 ++++++++++++++++++++++++++-------------

> >>  1 file changed, 41 insertions(+), 19 deletions(-)

> >>

> >> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

> >> index 27c09255d7..1f06dfb5d5 100644

> >> --- a/hw/core/qdev-properties.c

> >> +++ b/hw/core/qdev-properties.c

> >> @@ -588,6 +588,32 @@ typedef struct {

> >>      ObjectPropertyRelease *release;

> >>  } ArrayElementProperty;

> >>

> >> +/**

> >> + * Create ArrayElementProperty based on array length property

> >> + * @array_len_prop (which was previously defined using

> >> DEFINE_PROP_ARRAY()).

> >> + */

> >>

> >

> > (some day we will have to clarify our API doc style, but not now ;)

> >

> >

> Actually, I didn't realize but we do use kerneldoc in sphinx nowadays.

> 

> Peter, shouldn't you have updated CODING_STYLE.rst to say explicitly that

> our C API should be documented with it?

> 

> How do we enforce or check the comment style across the code base, or

> per-files (without necessarily including it in the generated manual/doc)?


I'd say we should include it in the generated developer docs, and enforce
whatever level of error checking is availble at build times.

I'll happily update any API docs in code I'm subsys maintainer for, if we
actually generate and validate at build time.


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 :|
Eduardo Habkost Oct. 30, 2020, 11:20 a.m. UTC | #17
On Fri, Oct 30, 2020 at 02:03:07PM +0400, Marc-André Lureau wrote:
> On Fri, Oct 30, 2020 at 2:17 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> 

> > The array property registration code is hard to follow.  Move the

> > two steps into separate functions that have clear

> > responsibilities.

> >

> > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

> > ---

> > Cc: Paolo Bonzini <pbonzini@redhat.com>

> > Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> > Cc: Eduardo Habkost <ehabkost@redhat.com>

> > Cc: qemu-devel@nongnu.org

> > ---

> >  hw/core/qdev-properties.c | 60 ++++++++++++++++++++++++++-------------

> >  1 file changed, 41 insertions(+), 19 deletions(-)

> >

> > diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

> > index 27c09255d7..1f06dfb5d5 100644

> > --- a/hw/core/qdev-properties.c

> > +++ b/hw/core/qdev-properties.c

> > @@ -588,6 +588,32 @@ typedef struct {

> >      ObjectPropertyRelease *release;

> >  } ArrayElementProperty;

> >

> > +/**

> > + * Create ArrayElementProperty based on array length property

> > + * @array_len_prop (which was previously defined using

> > DEFINE_PROP_ARRAY()).

> > + */

> >

> 

> (some day we will have to clarify our API doc style, but not now ;)


In this specific case, this one was not supposed to be a real doc
comment.  My first version of this commit had a full doc comment,
then I decided it was overkill for an internal static function
and I made it a plain paragraph.  The "/**" and
"@array_len_prop" are leftovers from the old doc comment and I
will remove them if respinning the series.

> 

> +static ArrayElementProperty *array_element_new(Object *obj,


-- 
Eduardo
Marc-André Lureau Oct. 30, 2020, 4:42 p.m. UTC | #18
On Fri, Oct 30, 2020 at 2:15 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> This removes the last remaining DeviceState-specific line of code

> inside qdev property registration code, and will allow us to make

> static properties a core QOM feature.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>



Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:15 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This removes the last remaining DeviceState-specific line of code<br>
inside qdev property registration code, and will allow us to make<br>
static properties a core QOM feature.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

</blockquote></div><div><br></div><div><br></div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>&gt;</div><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 4:52 p.m. UTC | #19
On Fri, Oct 30, 2020 at 2:14 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>


Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>




> ---

> Cc: Paolo Bonzini <pbonzini@redhat.com>

> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> Cc: Eduardo Habkost <ehabkost@redhat.com>

> Cc: qemu-devel@nongnu.org

> ---

>  include/hw/qdev-properties.h |  2 +-

>  hw/core/qdev-properties.c    | 10 +++++-----

>  2 files changed, 6 insertions(+), 6 deletions(-)

>

> diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h

> index 530286e869..7f8e4daade 100644

> --- a/include/hw/qdev-properties.h

> +++ b/include/hw/qdev-properties.h

> @@ -34,7 +34,7 @@ struct PropertyInfo {

>      const QEnumLookup *enum_table;

>      int (*print)(Object *obj, Property *prop, char *dest, size_t len);

>      void (*set_default_value)(ObjectProperty *op, const Property *prop);

> -    void (*create)(ObjectClass *oc, Property *prop);

> +    ObjectProperty *(*create)(ObjectClass *oc, Property *prop);

>      ObjectPropertyAccessor *get;

>      ObjectPropertyAccessor *set;

>      ObjectPropertyRelease *release;

> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

> index 195bfed6e1..89e292dc25 100644

> --- a/hw/core/qdev-properties.c

> +++ b/hw/core/qdev-properties.c

> @@ -872,12 +872,12 @@ const PropertyInfo qdev_prop_size = {

>

>  /* --- object link property --- */

>

> -static void create_link_property(ObjectClass *oc, Property *prop)

> +static ObjectProperty *create_link_property(ObjectClass *oc, Property

> *prop)

>  {

> -    object_class_property_add_link(oc, prop->name, prop->link_type,

> -                                   prop->offset,

> -

>  qdev_prop_allow_set_link_before_realize,

> -                                   OBJ_PROP_LINK_STRONG);

> +    return object_class_property_add_link(oc, prop->name, prop->link_type,

> +                                          prop->offset,

> +

> qdev_prop_allow_set_link_before_realize,

> +                                          OBJ_PROP_LINK_STRONG);

>  }

>

>  const PropertyInfo qdev_prop_link = {

> --

> 2.28.0

>

>

>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:14 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com" target="_blank">marcandre.lureau@redhat.com</a>&gt;</div><div><br></div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
---<br>
Cc: Paolo Bonzini &lt;<a href="mailto:pbonzini@redhat.com" target="_blank">pbonzini@redhat.com</a>&gt;<br>
Cc: &quot;Daniel P. Berrangé&quot; &lt;<a href="mailto:berrange@redhat.com" target="_blank">berrange@redhat.com</a>&gt;<br>
Cc: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>
Cc: <a href="mailto:qemu-devel@nongnu.org" target="_blank">qemu-devel@nongnu.org</a><br>
---<br>
 include/hw/qdev-properties.h |  2 +-<br>
 hw/core/qdev-properties.c    | 10 +++++-----<br>
 2 files changed, 6 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h<br>
index 530286e869..7f8e4daade 100644<br>
--- a/include/hw/qdev-properties.h<br>
+++ b/include/hw/qdev-properties.h<br>
@@ -34,7 +34,7 @@ struct PropertyInfo {<br>
     const QEnumLookup *enum_table;<br>
     int (*print)(Object *obj, Property *prop, char *dest, size_t len);<br>
     void (*set_default_value)(ObjectProperty *op, const Property *prop);<br>
-    void (*create)(ObjectClass *oc, Property *prop);<br>
+    ObjectProperty *(*create)(ObjectClass *oc, Property *prop);<br>
     ObjectPropertyAccessor *get;<br>
     ObjectPropertyAccessor *set;<br>
     ObjectPropertyRelease *release;<br>
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c<br>
index 195bfed6e1..89e292dc25 100644<br>
--- a/hw/core/qdev-properties.c<br>
+++ b/hw/core/qdev-properties.c<br>
@@ -872,12 +872,12 @@ const PropertyInfo qdev_prop_size = {<br>
<br>
 /* --- object link property --- */<br>
<br>
-static void create_link_property(ObjectClass *oc, Property *prop)<br>
+static ObjectProperty *create_link_property(ObjectClass *oc, Property *prop)<br>
 {<br>
-    object_class_property_add_link(oc, prop-&gt;name, prop-&gt;link_type,<br>
-                                   prop-&gt;offset,<br>
-                                   qdev_prop_allow_set_link_before_realize,<br>
-                                   OBJ_PROP_LINK_STRONG);<br>
+    return object_class_property_add_link(oc, prop-&gt;name, prop-&gt;link_type,<br>
+                                          prop-&gt;offset,<br>
+                                          qdev_prop_allow_set_link_before_realize,<br>
+                                          OBJ_PROP_LINK_STRONG);<br>
 }<br>
<br>
 const PropertyInfo qdev_prop_link = {<br>
-- <br>
2.28.0<br>
<br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 4:53 p.m. UTC | #20
On Fri, Oct 30, 2020 at 2:23 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> Instead of duplicating the code that sets name, info, offset,

> and does type checking, make DEFINE_PROP accept a variable number

> of arguments and reuse it in all DEFINE_PROP_* macros.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>


neat! and clever? ;)
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>




> ---

> Cc: Paolo Bonzini <pbonzini@redhat.com>

> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> Cc: Eduardo Habkost <ehabkost@redhat.com>

> Cc: qemu-devel@nongnu.org

> ---

>  include/hw/qdev-properties.h | 132 ++++++++++++-----------------------

>  1 file changed, 45 insertions(+), 87 deletions(-)

>

> diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h

> index 3a7b4c8643..f9a4c132e7 100644

> --- a/include/hw/qdev-properties.h

> +++ b/include/hw/qdev-properties.h

> @@ -62,73 +62,46 @@ extern const PropertyInfo qdev_prop_uuid;

>  extern const PropertyInfo qdev_prop_arraylen;

>  extern const PropertyInfo qdev_prop_link;

>

> -#define DEFINE_PROP(_name, _state, _field, _prop, _type) { \

> +#define DEFINE_PROP(_name, _state, _field, _prop, _type, ...) {  \

>          .name      = (_name),                                    \

>          .info      = &(_prop),                                   \

>          .offset    = offsetof(_state, _field)                    \

>              + type_check(_type, typeof_field(_state, _field)),   \

> +        __VA_ARGS__                                              \

>          }

>

> -#define DEFINE_PROP_SIGNED(_name, _state, _field, _defval, _prop, _type)

> { \

> -        .name      = (_name),                                           \

> -        .info      = &(_prop),                                          \

> -        .offset    = offsetof(_state, _field)                           \

> -            + type_check(_type,typeof_field(_state, _field)),           \

> -        .set_default = true,                                            \

> -        .defval.i  = (_type)_defval,                                    \

> -        }

> +#define DEFINE_PROP_SIGNED(_name, _state, _field, _defval, _prop, _type) \

> +    DEFINE_PROP(_name, _state, _field, _prop, _type,                     \

> +                .set_default = true,                                     \

> +                .defval.i    = (_type)_defval)

>

> -#define DEFINE_PROP_SIGNED_NODEFAULT(_name, _state, _field, _prop, _type)

> { \

> -        .name      = (_name),                                           \

> -        .info      = &(_prop),                                          \

> -        .offset    = offsetof(_state, _field)                           \

> -            + type_check(_type, typeof_field(_state, _field)),          \

> -        }

> +#define DEFINE_PROP_SIGNED_NODEFAULT(_name, _state, _field, _prop, _type)

> \

> +    DEFINE_PROP(_name, _state, _field, _prop, _type)

>

> -#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) {  \

> -        .name      = (_name),                                    \

> -        .info      = &(qdev_prop_bit),                           \

> -        .bitnr    = (_bit),                                      \

> -        .offset    = offsetof(_state, _field)                    \

> -            + type_check(uint32_t,typeof_field(_state, _field)), \

> -        .set_default = true,                                     \

> -        .defval.u  = (bool)_defval,                              \

> -        }

> +#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval)   \

> +    DEFINE_PROP(_name, _state, _field, qdev_prop_bit, uint32_t, \

> +                .bitnr       = (_bit),                          \

> +                .set_default = true,                            \

> +                .defval.u    = (bool)_defval)

>

> -#define DEFINE_PROP_UNSIGNED(_name, _state, _field, _defval, _prop,

> _type) { \

> -        .name      = (_name),                                           \

> -        .info      = &(_prop),                                          \

> -        .offset    = offsetof(_state, _field)                           \

> -            + type_check(_type, typeof_field(_state, _field)),          \

> -        .set_default = true,                                            \

> -        .defval.u  = (_type)_defval,                                    \

> -        }

> +#define DEFINE_PROP_UNSIGNED(_name, _state, _field, _defval, _prop,

> _type) \

> +    DEFINE_PROP(_name, _state, _field, _prop, _type,

>  \

> +                .set_default = true,

>  \

> +                .defval.u  = (_type)_defval)

>

> -#define DEFINE_PROP_UNSIGNED_NODEFAULT(_name, _state, _field, _prop,

> _type) { \

> -        .name      = (_name),                                           \

> -        .info      = &(_prop),                                          \

> -        .offset    = offsetof(_state, _field)                           \

> -            + type_check(_type, typeof_field(_state, _field)),          \

> -        }

> +#define DEFINE_PROP_UNSIGNED_NODEFAULT(_name, _state, _field, _prop,

> _type) \

> +    DEFINE_PROP(_name, _state, _field, _prop, _type)

>

> -#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval) {       \

> -        .name      = (_name),                                           \

> -        .info      = &(qdev_prop_bit64),                                \

> -        .bitnr    = (_bit),                                             \

> -        .offset    = offsetof(_state, _field)                           \

> -            + type_check(uint64_t, typeof_field(_state, _field)),       \

> -        .set_default = true,                                            \

> -        .defval.u  = (bool)_defval,                                     \

> -        }

> +#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval)   \

> +    DEFINE_PROP(_name, _state, _field, qdev_prop_bit64, uint64_t, \

> +                .bitnr    = (_bit),                               \

> +                .set_default = true,                              \

> +                .defval.u  = (bool)_defval)

>

> -#define DEFINE_PROP_BOOL(_name, _state, _field, _defval) {       \

> -        .name      = (_name),                                    \

> -        .info      = &(qdev_prop_bool),                          \

> -        .offset    = offsetof(_state, _field)                    \

> -            + type_check(bool, typeof_field(_state, _field)),    \

> -        .set_default = true,                                     \

> -        .defval.u    = (bool)_defval,                            \

> -        }

> +#define DEFINE_PROP_BOOL(_name, _state, _field, _defval)     \

> +    DEFINE_PROP(_name, _state, _field, qdev_prop_bool, bool, \

> +                .set_default = true,                         \

> +                .defval.u    = (bool)_defval)

>

>  #define PROP_ARRAY_LEN_PREFIX "len-"

>

> @@ -156,26 +129,19 @@ extern const PropertyInfo qdev_prop_link;

>   * It is the responsibility of the device deinit code to free the

>   * @_arrayfield memory.

>   */

> -#define DEFINE_PROP_ARRAY(_name, _state, _field,                        \

> -                          _arrayfield, _arrayprop, _arraytype) {        \

> -        .name = (PROP_ARRAY_LEN_PREFIX _name),                          \

> -        .info = &(qdev_prop_arraylen),                                  \

> -        .set_default = true,                                            \

> -        .defval.u = 0,                                                  \

> -        .offset = offsetof(_state, _field)                              \

> -            + type_check(uint32_t, typeof_field(_state, _field)),       \

> -        .arrayinfo = &(_arrayprop),                                     \

> -        .arrayfieldsize = sizeof(_arraytype),                           \

> -        .arrayoffset = offsetof(_state, _arrayfield),                   \

> -        }

> +#define DEFINE_PROP_ARRAY(_name, _state, _field,               \

> +                          _arrayfield, _arrayprop, _arraytype) \

> +    DEFINE_PROP((PROP_ARRAY_LEN_PREFIX _name),                 \

> +                _state, _field, qdev_prop_arraylen, uint32_t,  \

> +                .set_default = true,                           \

> +                .defval.u = 0,                                 \

> +                .arrayinfo = &(_arrayprop),                    \

> +                .arrayfieldsize = sizeof(_arraytype),          \

> +                .arrayoffset = offsetof(_state, _arrayfield))

>

> -#define DEFINE_PROP_LINK(_name, _state, _field, _type, _ptr_type) {     \

> -        .name = (_name),                                                \

> -        .info = &(qdev_prop_link),                                      \

> -        .offset = offsetof(_state, _field)                              \

> -            + type_check(_ptr_type, typeof_field(_state, _field)),      \

> -        .link_type  = _type,                                            \

> -        }

> +#define DEFINE_PROP_LINK(_name, _state, _field, _type, _ptr_type)     \

> +    DEFINE_PROP(_name, _state, _field, qdev_prop_link, _ptr_type,     \

> +                .link_type  = _type)

>

>  #define DEFINE_PROP_UINT8(_n, _s, _f, _d)                       \

>      DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)

> @@ -197,19 +163,11 @@ extern const PropertyInfo qdev_prop_link;

>      DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_on_off_auto, OnOffAuto)

>  #define DEFINE_PROP_SIZE32(_n, _s, _f, _d)                       \

>      DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_size32, uint32_t)

> -#define DEFINE_PROP_UUID(_name, _state, _field) {                  \

> -        .name      = (_name),                                      \

> -        .info      = &qdev_prop_uuid,                              \

> -        .offset    = offsetof(_state, _field)                      \

> -            + type_check(QemuUUID, typeof_field(_state, _field)),  \

> -        .set_default = true,                                       \

> -        }

> -#define DEFINE_PROP_UUID_NODEFAULT(_name, _state, _field) {        \

> -        .name      = (_name),                                      \

> -        .info      = &qdev_prop_uuid,                              \

> -        .offset    = offsetof(_state, _field)                      \

> -            + type_check(QemuUUID, typeof_field(_state, _field)),  \

> -        }

> +#define DEFINE_PROP_UUID(_name, _state, _field)                      \

> +    DEFINE_PROP(_name, _state, _field, qdev_prop_uuid, QemuUUID,     \

> +                .set_default = true)

> +#define DEFINE_PROP_UUID_NODEFAULT(_name, _state, _field) \

> +    DEFINE_PROP(_name, _state, _field, qdev_prop_uuid, QemuUUID)

>

>  #define DEFINE_PROP_END_OF_LIST()               \

>      {}

> --

> 2.28.0

>

>

>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:23 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Instead of duplicating the code that sets name, info, offset,<br>
and does type checking, make DEFINE_PROP accept a variable number<br>
of arguments and reuse it in all DEFINE_PROP_* macros.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div>neat! and clever? ;)<br></div><div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com" target="_blank">marcandre.lureau@redhat.com</a>&gt;</div><div><br></div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

---<br>
Cc: Paolo Bonzini &lt;<a href="mailto:pbonzini@redhat.com" target="_blank">pbonzini@redhat.com</a>&gt;<br>
Cc: &quot;Daniel P. Berrangé&quot; &lt;<a href="mailto:berrange@redhat.com" target="_blank">berrange@redhat.com</a>&gt;<br>
Cc: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>
Cc: <a href="mailto:qemu-devel@nongnu.org" target="_blank">qemu-devel@nongnu.org</a><br>
---<br>
 include/hw/qdev-properties.h | 132 ++++++++++++-----------------------<br>
 1 file changed, 45 insertions(+), 87 deletions(-)<br>
<br>
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h<br>
index 3a7b4c8643..f9a4c132e7 100644<br>
--- a/include/hw/qdev-properties.h<br>
+++ b/include/hw/qdev-properties.h<br>
@@ -62,73 +62,46 @@ extern const PropertyInfo qdev_prop_uuid;<br>
 extern const PropertyInfo qdev_prop_arraylen;<br>
 extern const PropertyInfo qdev_prop_link;<br>
<br>
-#define DEFINE_PROP(_name, _state, _field, _prop, _type) { \<br>
+#define DEFINE_PROP(_name, _state, _field, _prop, _type, ...) {  \<br>
         .name      = (_name),                                    \<br>
         .info      = &amp;(_prop),                                   \<br>
         .offset    = offsetof(_state, _field)                    \<br>
             + type_check(_type, typeof_field(_state, _field)),   \<br>
+        __VA_ARGS__                                              \<br>
         }<br>
<br>
-#define DEFINE_PROP_SIGNED(_name, _state, _field, _defval, _prop, _type) { \<br>
-        .name      = (_name),                                           \<br>
-        .info      = &amp;(_prop),                                          \<br>
-        .offset    = offsetof(_state, _field)                           \<br>
-            + type_check(_type,typeof_field(_state, _field)),           \<br>
-        .set_default = true,                                            \<br>
-        .defval.i  = (_type)_defval,                                    \<br>
-        }<br>
+#define DEFINE_PROP_SIGNED(_name, _state, _field, _defval, _prop, _type) \<br>
+    DEFINE_PROP(_name, _state, _field, _prop, _type,                     \<br>
+                .set_default = true,                                     \<br>
+                .defval.i    = (_type)_defval)<br>
<br>
-#define DEFINE_PROP_SIGNED_NODEFAULT(_name, _state, _field, _prop, _type) { \<br>
-        .name      = (_name),                                           \<br>
-        .info      = &amp;(_prop),                                          \<br>
-        .offset    = offsetof(_state, _field)                           \<br>
-            + type_check(_type, typeof_field(_state, _field)),          \<br>
-        }<br>
+#define DEFINE_PROP_SIGNED_NODEFAULT(_name, _state, _field, _prop, _type) \<br>
+    DEFINE_PROP(_name, _state, _field, _prop, _type)<br>
<br>
-#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) {  \<br>
-        .name      = (_name),                                    \<br>
-        .info      = &amp;(qdev_prop_bit),                           \<br>
-        .bitnr    = (_bit),                                      \<br>
-        .offset    = offsetof(_state, _field)                    \<br>
-            + type_check(uint32_t,typeof_field(_state, _field)), \<br>
-        .set_default = true,                                     \<br>
-        .defval.u  = (bool)_defval,                              \<br>
-        }<br>
+#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval)   \<br>
+    DEFINE_PROP(_name, _state, _field, qdev_prop_bit, uint32_t, \<br>
+                .bitnr       = (_bit),                          \<br>
+                .set_default = true,                            \<br>
+                .defval.u    = (bool)_defval)<br>
<br>
-#define DEFINE_PROP_UNSIGNED(_name, _state, _field, _defval, _prop, _type) { \<br>
-        .name      = (_name),                                           \<br>
-        .info      = &amp;(_prop),                                          \<br>
-        .offset    = offsetof(_state, _field)                           \<br>
-            + type_check(_type, typeof_field(_state, _field)),          \<br>
-        .set_default = true,                                            \<br>
-        .defval.u  = (_type)_defval,                                    \<br>
-        }<br>
+#define DEFINE_PROP_UNSIGNED(_name, _state, _field, _defval, _prop, _type) \<br>
+    DEFINE_PROP(_name, _state, _field, _prop, _type,                       \<br>
+                .set_default = true,                                       \<br>
+                .defval.u  = (_type)_defval)<br>
<br>
-#define DEFINE_PROP_UNSIGNED_NODEFAULT(_name, _state, _field, _prop, _type) { \<br>
-        .name      = (_name),                                           \<br>
-        .info      = &amp;(_prop),                                          \<br>
-        .offset    = offsetof(_state, _field)                           \<br>
-            + type_check(_type, typeof_field(_state, _field)),          \<br>
-        }<br>
+#define DEFINE_PROP_UNSIGNED_NODEFAULT(_name, _state, _field, _prop, _type) \<br>
+    DEFINE_PROP(_name, _state, _field, _prop, _type)<br>
<br>
-#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval) {       \<br>
-        .name      = (_name),                                           \<br>
-        .info      = &amp;(qdev_prop_bit64),                                \<br>
-        .bitnr    = (_bit),                                             \<br>
-        .offset    = offsetof(_state, _field)                           \<br>
-            + type_check(uint64_t, typeof_field(_state, _field)),       \<br>
-        .set_default = true,                                            \<br>
-        .defval.u  = (bool)_defval,                                     \<br>
-        }<br>
+#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval)   \<br>
+    DEFINE_PROP(_name, _state, _field, qdev_prop_bit64, uint64_t, \<br>
+                .bitnr    = (_bit),                               \<br>
+                .set_default = true,                              \<br>
+                .defval.u  = (bool)_defval)<br>
<br>
-#define DEFINE_PROP_BOOL(_name, _state, _field, _defval) {       \<br>
-        .name      = (_name),                                    \<br>
-        .info      = &amp;(qdev_prop_bool),                          \<br>
-        .offset    = offsetof(_state, _field)                    \<br>
-            + type_check(bool, typeof_field(_state, _field)),    \<br>
-        .set_default = true,                                     \<br>
-        .defval.u    = (bool)_defval,                            \<br>
-        }<br>
+#define DEFINE_PROP_BOOL(_name, _state, _field, _defval)     \<br>
+    DEFINE_PROP(_name, _state, _field, qdev_prop_bool, bool, \<br>
+                .set_default = true,                         \<br>
+                .defval.u    = (bool)_defval)<br>
<br>
 #define PROP_ARRAY_LEN_PREFIX &quot;len-&quot;<br>
<br>
@@ -156,26 +129,19 @@ extern const PropertyInfo qdev_prop_link;<br>
  * It is the responsibility of the device deinit code to free the<br>
  * @_arrayfield memory.<br>
  */<br>
-#define DEFINE_PROP_ARRAY(_name, _state, _field,                        \<br>
-                          _arrayfield, _arrayprop, _arraytype) {        \<br>
-        .name = (PROP_ARRAY_LEN_PREFIX _name),                          \<br>
-        .info = &amp;(qdev_prop_arraylen),                                  \<br>
-        .set_default = true,                                            \<br>
-        .defval.u = 0,                                                  \<br>
-        .offset = offsetof(_state, _field)                              \<br>
-            + type_check(uint32_t, typeof_field(_state, _field)),       \<br>
-        .arrayinfo = &amp;(_arrayprop),                                     \<br>
-        .arrayfieldsize = sizeof(_arraytype),                           \<br>
-        .arrayoffset = offsetof(_state, _arrayfield),                   \<br>
-        }<br>
+#define DEFINE_PROP_ARRAY(_name, _state, _field,               \<br>
+                          _arrayfield, _arrayprop, _arraytype) \<br>
+    DEFINE_PROP((PROP_ARRAY_LEN_PREFIX _name),                 \<br>
+                _state, _field, qdev_prop_arraylen, uint32_t,  \<br>
+                .set_default = true,                           \<br>
+                .defval.u = 0,                                 \<br>
+                .arrayinfo = &amp;(_arrayprop),                    \<br>
+                .arrayfieldsize = sizeof(_arraytype),          \<br>
+                .arrayoffset = offsetof(_state, _arrayfield))<br>
<br>
-#define DEFINE_PROP_LINK(_name, _state, _field, _type, _ptr_type) {     \<br>
-        .name = (_name),                                                \<br>
-        .info = &amp;(qdev_prop_link),                                      \<br>
-        .offset = offsetof(_state, _field)                              \<br>
-            + type_check(_ptr_type, typeof_field(_state, _field)),      \<br>
-        .link_type  = _type,                                            \<br>
-        }<br>
+#define DEFINE_PROP_LINK(_name, _state, _field, _type, _ptr_type)     \<br>
+    DEFINE_PROP(_name, _state, _field, qdev_prop_link, _ptr_type,     \<br>
+                .link_type  = _type)<br>
<br>
 #define DEFINE_PROP_UINT8(_n, _s, _f, _d)                       \<br>
     DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)<br>
@@ -197,19 +163,11 @@ extern const PropertyInfo qdev_prop_link;<br>
     DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_on_off_auto, OnOffAuto)<br>
 #define DEFINE_PROP_SIZE32(_n, _s, _f, _d)                       \<br>
     DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_size32, uint32_t)<br>
-#define DEFINE_PROP_UUID(_name, _state, _field) {                  \<br>
-        .name      = (_name),                                      \<br>
-        .info      = &amp;qdev_prop_uuid,                              \<br>
-        .offset    = offsetof(_state, _field)                      \<br>
-            + type_check(QemuUUID, typeof_field(_state, _field)),  \<br>
-        .set_default = true,                                       \<br>
-        }<br>
-#define DEFINE_PROP_UUID_NODEFAULT(_name, _state, _field) {        \<br>
-        .name      = (_name),                                      \<br>
-        .info      = &amp;qdev_prop_uuid,                              \<br>
-        .offset    = offsetof(_state, _field)                      \<br>
-            + type_check(QemuUUID, typeof_field(_state, _field)),  \<br>
-        }<br>
+#define DEFINE_PROP_UUID(_name, _state, _field)                      \<br>
+    DEFINE_PROP(_name, _state, _field, qdev_prop_uuid, QemuUUID,     \<br>
+                .set_default = true)<br>
+#define DEFINE_PROP_UUID_NODEFAULT(_name, _state, _field) \<br>
+    DEFINE_PROP(_name, _state, _field, qdev_prop_uuid, QemuUUID)<br>
<br>
 #define DEFINE_PROP_END_OF_LIST()               \<br>
     {}<br>
-- <br>
2.28.0<br>
<br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 4:59 p.m. UTC | #21
On Fri, Oct 30, 2020 at 2:17 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> Move the core of the static property code to qom/static-property.c.

>

> The actual property type implementations are still in

> qdev-properties.c, they will be moved later.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>

>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>





-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:17 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Move the core of the static property code to qom/static-property.c.<br>
<br>
The actual property type implementations are still in<br>
qdev-properties.c, they will be moved later.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br><br></blockquote><div><br></div><div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com" target="_blank">marcandre.lureau@redhat.com</a>&gt;</div> </div><div> </div></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Marc-André Lureau Oct. 30, 2020, 5:06 p.m. UTC | #22
On Fri, Oct 30, 2020 at 2:22 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> Just setting a reasonable error string using error_setg() is

> simpler and makes error messages clearer.

>

> Before:

>

>   $ qemu-system-x86_64 -device vmgenid,guid=x

>   qemu-system-x86_64: -device vmgenid,guid=x: Property 'vmgenid.guid'

> doesn't take value 'x'

>

> After:

>

>   $ qemu-system-x86_64 -device vmgenid,guid=x

>   qemu-system-x86_64: -device vmgenid,guid=x: invalid UUID: 'x'

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

>


It looks like we agree that error_set_from_qdev_prop_error() should
eventually be replaced :)

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


---
> Cc: Paolo Bonzini <pbonzini@redhat.com>

> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> Cc: Eduardo Habkost <ehabkost@redhat.com>

> Cc: qemu-devel@nongnu.org

> ---

>  hw/core/qdev-properties.c | 2 +-

>  1 file changed, 1 insertion(+), 1 deletion(-)

>

> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c

> index 59d65a7362..5b9907e8ba 100644

> --- a/hw/core/qdev-properties.c

> +++ b/hw/core/qdev-properties.c

> @@ -509,7 +509,7 @@ static void set_uuid(Object *obj, Visitor *v, const

> char *name, void *opaque,

>      if (!strcmp(str, UUID_VALUE_AUTO)) {

>          qemu_uuid_generate(uuid);

>      } else if (qemu_uuid_parse(str, uuid) < 0) {

> -        error_set_from_qdev_prop_error(errp, EINVAL, obj, prop, str);

> +        error_setg(errp, "invalid UUID: '%s'", str);

>      }

>      g_free(str);

>  }

> --

> 2.28.0

>

>

>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:22 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Just setting a reasonable error string using error_setg() is<br>
simpler and makes error messages clearer.<br>
<br>
Before:<br>
<br>
  $ qemu-system-x86_64 -device vmgenid,guid=x<br>
  qemu-system-x86_64: -device vmgenid,guid=x: Property &#39;vmgenid.guid&#39; doesn&#39;t take value &#39;x&#39;<br>
<br>
After:<br>
<br>
  $ qemu-system-x86_64 -device vmgenid,guid=x<br>
  qemu-system-x86_64: -device vmgenid,guid=x: invalid UUID: &#39;x&#39;<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br></blockquote><div><br></div><div>It looks like we agree that error_set_from_qdev_prop_error() should eventually be replaced :)</div><div><br></div><div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>&gt;</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

---<br>
Cc: Paolo Bonzini &lt;<a href="mailto:pbonzini@redhat.com" target="_blank">pbonzini@redhat.com</a>&gt;<br>
Cc: &quot;Daniel P. Berrangé&quot; &lt;<a href="mailto:berrange@redhat.com" target="_blank">berrange@redhat.com</a>&gt;<br>
Cc: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>
Cc: <a href="mailto:qemu-devel@nongnu.org" target="_blank">qemu-devel@nongnu.org</a><br>
---<br>
 hw/core/qdev-properties.c | 2 +-<br>
 1 file changed, 1 insertion(+), 1 deletion(-)<br>
<br>
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c<br>
index 59d65a7362..5b9907e8ba 100644<br>
--- a/hw/core/qdev-properties.c<br>
+++ b/hw/core/qdev-properties.c<br>
@@ -509,7 +509,7 @@ static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,<br>
     if (!strcmp(str, UUID_VALUE_AUTO)) {<br>
         qemu_uuid_generate(uuid);<br>
     } else if (qemu_uuid_parse(str, uuid) &lt; 0) {<br>
-        error_set_from_qdev_prop_error(errp, EINVAL, obj, prop, str);<br>
+        error_setg(errp, &quot;invalid UUID: &#39;%s&#39;&quot;, str);<br>
     }<br>
     g_free(str);<br>
 }<br>
-- <br>
2.28.0<br>
<br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Paolo Bonzini Oct. 30, 2020, 5:10 p.m. UTC | #23
On 29/10/20 23:02, Eduardo Habkost wrote:
> +static Property machine_props[] = {

> +    DEFINE_PROP_STRING("kernel", MachineState, kernel_filename),

> +    DEFINE_PROP_STRING("initrd", MachineState, initrd_filename),

> +    DEFINE_PROP_STRING("append", MachineState, kernel_cmdline),

> +    DEFINE_PROP_STRING("dtb", MachineState, dtb),

> +    DEFINE_PROP_STRING("dumpdtb", MachineState, dumpdtb),

> +    DEFINE_PROP_STRING("dt-compatible", MachineState, dt_compatible),

> +    DEFINE_PROP_STRING("firmware", MachineState, firmware),

> +    DEFINE_PROP_STRING("memory-backend", MachineState, ram_memdev_id),

> +    DEFINE_PROP_END_OF_LIST(),

> +};

> +


While I think generalizing the _code_ for static properties is obviously
a good idea, I am not sure about generalizing the interface for adding them.

The reason is that we already have a place for adding properties in
class_init, and having a second makes things "less local", so to speak.

What do you think about adding macros like

    OBJECT_CLASS_PROPERTY_ADD_STR(oc, MachineState, kernel_filename,
                                  "kernel", prop_allow_set_always);

?

Paolo
Paolo Bonzini Oct. 30, 2020, 5:13 p.m. UTC | #24
On 30/10/20 12:35, Eduardo Habkost wrote:
> 

> What is necessary to make sure we have a CONFIG_XEN=y job in

> gitlab CI?  Maybe just including xen-devel in some of the

> container images is enough?


Fedora already has it, but build-system-fedora does not include
x86_64-softmmu.

Paolo
Eduardo Habkost Oct. 30, 2020, 8:03 p.m. UTC | #25
On Fri, Oct 30, 2020 at 06:10:34PM +0100, Paolo Bonzini wrote:
> On 29/10/20 23:02, Eduardo Habkost wrote:

> > +static Property machine_props[] = {

> > +    DEFINE_PROP_STRING("kernel", MachineState, kernel_filename),

> > +    DEFINE_PROP_STRING("initrd", MachineState, initrd_filename),

> > +    DEFINE_PROP_STRING("append", MachineState, kernel_cmdline),

> > +    DEFINE_PROP_STRING("dtb", MachineState, dtb),

> > +    DEFINE_PROP_STRING("dumpdtb", MachineState, dumpdtb),

> > +    DEFINE_PROP_STRING("dt-compatible", MachineState, dt_compatible),

> > +    DEFINE_PROP_STRING("firmware", MachineState, firmware),

> > +    DEFINE_PROP_STRING("memory-backend", MachineState, ram_memdev_id),

> > +    DEFINE_PROP_END_OF_LIST(),

> > +};

> > +

> 

> While I think generalizing the _code_ for static properties is obviously

> a good idea, I am not sure about generalizing the interface for adding them.

> 

> The reason is that we already have a place for adding properties in

> class_init, and having a second makes things "less local", so to speak.

> 

> What do you think about adding macros like

> 

>     OBJECT_CLASS_PROPERTY_ADD_STR(oc, MachineState, kernel_filename,

>                                   "kernel", prop_allow_set_always);


I like the idea of having an interface like this, but I would
like to avoid having to write even more boilerplate for each
property type to make this work.

What would you think of:

   OBJECT_CLASS_PROPERTY_ADD(oc,
       PROP_STRING("kernel", MachineState, kernel_filename),
       prop_allow_set_always);

Then we could make the same PROP_STRING macro usable both as
object_class_property_add_static() argument and as initializer
for existing static Property arrays.

-- 
Eduardo
Paolo Bonzini Oct. 30, 2020, 8:41 p.m. UTC | #26
Il ven 30 ott 2020, 21:03 Eduardo Habkost <ehabkost@redhat.com> ha scritto:

> >     OBJECT_CLASS_PROPERTY_ADD_STR(oc, MachineState, kernel_filename,

> >                                   "kernel", prop_allow_set_always);

>

> I like the idea of having an interface like this, but I would

> like to avoid having to write even more boilerplate for each

> property type to make this work.

>

> What would you think of:

>    OBJECT_CLASS_PROPERTY_ADD(oc,

>        PROP_STRING("kernel", MachineState, kernel_filename),

>        prop_allow_set_always);

>

> Then we could make the same PROP_STRING macro usable both as

> object_class_property_add_static() argument and as initializer

> for existing static Property arrays.

>


The name should be an argument to OBJECT_CLASS_PROPERTY_ADD though (which
could be a function and not  macro; perhaps
object_class_property_add_field?). PROP_STRING would be
DEFINE_PROP_STRING(NULL, etc.) and would not be entirely reusable in
Property arrays.

But even with that snag I agree with your less-boilerplate argument against
my proposal.

Since most if not all device properties would have to specify the same
allow-set function, we would end up defining more macros
DEVICE_CLASS_PROPERTY_ADD_STR, and so on. If the Property isbpassed a
struct, instead, we can define just one wrapper
device_class_property_add_field.

So what about:

1) add new constructors without the DEFINE prefix and without the name
argument

2) add object_class_property_add_field

And later:

3) add device_class_property_add_field and remove dc->props

4) remove the name field from Property.

Paolo


> --

> Eduardo

>

>
<div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Il ven 30 ott 2020, 21:03 Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; ha scritto:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">&gt;     OBJECT_CLASS_PROPERTY_ADD_STR(oc, MachineState, kernel_filename,<br>
&gt;                                   &quot;kernel&quot;, prop_allow_set_always);<br>
<br>
I like the idea of having an interface like this, but I would<br>
like to avoid having to write even more boilerplate for each<br>
property type to make this work.<br>
<br>
What would you think of:<br>
   OBJECT_CLASS_PROPERTY_ADD(oc,<br>
       PROP_STRING(&quot;kernel&quot;, MachineState, kernel_filename),<br>
       prop_allow_set_always);<br>
<br>
Then we could make the same PROP_STRING macro usable both as<br>
object_class_property_add_static() argument and as initializer<br>
for existing static Property arrays.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">The name should be an argument to <span style="font-family:sans-serif">OBJECT_CLASS_PROPERTY_ADD though (which could be a function and not  macro; perhaps object_class_property_add_field?). PROP_STRING would be DEFINE_PROP_STRING(NULL, etc.) and would not be entirely reusable in Property arrays.</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">But even with that snag I agree with your less-boilerplate argument against my proposal.</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">Since most if not all device properties would have to specify the same allow-set function, we would end up defining more macros DEVICE_CLASS_PROPERTY_ADD_STR, and so on. If the Property isbpassed a struct, instead, we can define just one wrapper device_class_property_add_field.</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">So what about:</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">1) add new constructors without the DEFINE prefix and without the name argument</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">2) add object_class_property_add_field</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">And later:</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">3) add device_class_property_add_field and remove dc-&gt;props</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">4) remove the name field from Property.</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">Paolo</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
-- <br>
Eduardo<br>
<br>
</blockquote></div></div></div>
Eduardo Habkost Oct. 30, 2020, 9 p.m. UTC | #27
On Fri, Oct 30, 2020 at 09:41:46PM +0100, Paolo Bonzini wrote:
> Il ven 30 ott 2020, 21:03 Eduardo Habkost <ehabkost@redhat.com> ha scritto:

> 

> > >     OBJECT_CLASS_PROPERTY_ADD_STR(oc, MachineState, kernel_filename,

> > >                                   "kernel", prop_allow_set_always);

> >

> > I like the idea of having an interface like this, but I would

> > like to avoid having to write even more boilerplate for each

> > property type to make this work.

> >

> > What would you think of:

> >    OBJECT_CLASS_PROPERTY_ADD(oc,

> >        PROP_STRING("kernel", MachineState, kernel_filename),

> >        prop_allow_set_always);

> >

> > Then we could make the same PROP_STRING macro usable both as

> > object_class_property_add_static() argument and as initializer

> > for existing static Property arrays.

> >

> 

> The name should be an argument to OBJECT_CLASS_PROPERTY_ADD though (which

> could be a function and not  macro; perhaps

> object_class_property_add_field?). PROP_STRING would be

> DEFINE_PROP_STRING(NULL, etc.) and would not be entirely reusable in

> Property arrays.

> 

> But even with that snag I agree with your less-boilerplate argument against

> my proposal.

> 

> Since most if not all device properties would have to specify the same

> allow-set function, we would end up defining more macros

> DEVICE_CLASS_PROPERTY_ADD_STR, and so on. If the Property isbpassed a

> struct, instead, we can define just one wrapper

> device_class_property_add_field.

> 

> So what about:

> 

> 1) add new constructors without the DEFINE prefix and without the name

> argument

> 

> 2) add object_class_property_add_field

> 

> And later:

> 

> 3) add device_class_property_add_field and remove dc->props

> 

> 4) remove the name field from Property.


Sounds good, and I like the "field property" name.  It is more
descriptive than "static property".

-- 
Eduardo
Marc-André Lureau Oct. 31, 2020, 7:53 a.m. UTC | #28
On Fri, Oct 30, 2020 at 2:28 AM Eduardo Habkost <ehabkost@redhat.com> wrote:

> Use static properties for the bool and string properties used at

> check-qom-proplist.

>

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

> ---

> Cc: Paolo Bonzini <pbonzini@redhat.com>

> Cc: "Daniel P. Berrangé" <berrange@redhat.com>

> Cc: Eduardo Habkost <ehabkost@redhat.com>

> Cc: qemu-devel@nongnu.org

> ---

>  tests/check-qom-proplist.c | 61 +++++---------------------------------

>  1 file changed, 8 insertions(+), 53 deletions(-)

>

> diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c

> index 1b76581980..94ad6631c0 100644

> --- a/tests/check-qom-proplist.c

> +++ b/tests/check-qom-proplist.c

> @@ -26,6 +26,8 @@

>  #include "qemu/option.h"

>  #include "qemu/config-file.h"

>  #include "qom/object_interfaces.h"

> +#include "qom/static-property.h"

> +#include "qom/static-property-internal.h"

>


>

>  #define TYPE_DUMMY "qemu-dummy"

> @@ -68,24 +70,6 @@ struct DummyObjectClass {

>  };

>

>

> -static void dummy_set_bv(Object *obj,

> -                         bool value,

> -                         Error **errp)

> -{

> -    DummyObject *dobj = DUMMY_OBJECT(obj);

> -

> -    dobj->bv = value;

> -}

> -

> -static bool dummy_get_bv(Object *obj,

> -                         Error **errp)

> -{

> -    DummyObject *dobj = DUMMY_OBJECT(obj);

> -

> -    return dobj->bv;

> -}

> -

> -

>  static void dummy_set_av(Object *obj,

>                           int value,

>                           Error **errp)

> @@ -103,39 +87,20 @@ static int dummy_get_av(Object *obj,

>      return dobj->av;

>  }

>

> +static Property bv_prop =

> +    DEFINE_PROP_BOOL("bv", DummyObject, bv, false);

>

> -static void dummy_set_sv(Object *obj,

> -                         const char *value,

> -                         Error **errp)

> -{

> -    DummyObject *dobj = DUMMY_OBJECT(obj);

> -

> -    g_free(dobj->sv);

> -    dobj->sv = g_strdup(value);

> -}

> -

> -static char *dummy_get_sv(Object *obj,

> -                          Error **errp)

> -{

> -    DummyObject *dobj = DUMMY_OBJECT(obj);

> -

> -    return g_strdup(dobj->sv);

> -}

> -

> +static Property sv_prop =

> +    DEFINE_PROP_STRING("sv", DummyObject, sv);

>

>  static void dummy_init(Object *obj)

>  {

> -    object_property_add_bool(obj, "bv",

> -                             dummy_get_bv,

> -                             dummy_set_bv);

> +    object_property_add_static(obj, &bv_prop, NULL);

>


Ok for testing internal functions.. hopefully it won't serve as an example!

 }
>

> -

>  static void dummy_class_init(ObjectClass *cls, void *data)

>  {

> -    object_class_property_add_str(cls, "sv",

> -                                  dummy_get_sv,

> -                                  dummy_set_sv);

> +    object_class_property_add_static(cls, &sv_prop, NULL);

>      object_class_property_add_enum(cls, "av",

>                                     "DummyAnimal",

>                                     &dummy_animal_map,

> @@ -143,21 +108,11 @@ static void dummy_class_init(ObjectClass *cls, void

> *data)

>                                     dummy_set_av);

>  }

>

> -

> -static void dummy_finalize(Object *obj)

> -{

> -    DummyObject *dobj = DUMMY_OBJECT(obj);

> -

> -    g_free(dobj->sv);

> -}

> -

> -

>  static const TypeInfo dummy_info = {

>      .name          = TYPE_DUMMY,

>      .parent        = TYPE_OBJECT,

>      .instance_size = sizeof(DummyObject),

>      .instance_init = dummy_init,

> -    .instance_finalize = dummy_finalize,

>      .class_size = sizeof(DummyObjectClass),

>      .class_init = dummy_class_init,

>      .interfaces = (InterfaceInfo[]) {

> --

> 2.28.0

>


Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


-- 
Marc-André Lureau
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 30, 2020 at 2:28 AM Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com">ehabkost@redhat.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Use static properties for the bool and string properties used at<br>
check-qom-proplist.<br>
<br>
Signed-off-by: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>

---<br>
Cc: Paolo Bonzini &lt;<a href="mailto:pbonzini@redhat.com" target="_blank">pbonzini@redhat.com</a>&gt;<br>
Cc: &quot;Daniel P. Berrangé&quot; &lt;<a href="mailto:berrange@redhat.com" target="_blank">berrange@redhat.com</a>&gt;<br>
Cc: Eduardo Habkost &lt;<a href="mailto:ehabkost@redhat.com" target="_blank">ehabkost@redhat.com</a>&gt;<br>
Cc: <a href="mailto:qemu-devel@nongnu.org" target="_blank">qemu-devel@nongnu.org</a><br>
---<br>
 tests/check-qom-proplist.c | 61 +++++---------------------------------<br>
 1 file changed, 8 insertions(+), 53 deletions(-)<br>
<br>
diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c<br>
index 1b76581980..94ad6631c0 100644<br>
--- a/tests/check-qom-proplist.c<br>
+++ b/tests/check-qom-proplist.c<br>
@@ -26,6 +26,8 @@<br>
 #include &quot;qemu/option.h&quot;<br>
 #include &quot;qemu/config-file.h&quot;<br>
 #include &quot;qom/object_interfaces.h&quot;<br>
+#include &quot;qom/static-property.h&quot;<br>
+#include &quot;qom/static-property-internal.h&quot; <br></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<br>
 #define TYPE_DUMMY &quot;qemu-dummy&quot;<br>
@@ -68,24 +70,6 @@ struct DummyObjectClass {<br>
 };<br>
<br>
<br>
-static void dummy_set_bv(Object *obj,<br>
-                         bool value,<br>
-                         Error **errp)<br>
-{<br>
-    DummyObject *dobj = DUMMY_OBJECT(obj);<br>
-<br>
-    dobj-&gt;bv = value;<br>
-}<br>
-<br>
-static bool dummy_get_bv(Object *obj,<br>
-                         Error **errp)<br>
-{<br>
-    DummyObject *dobj = DUMMY_OBJECT(obj);<br>
-<br>
-    return dobj-&gt;bv;<br>
-}<br>
-<br>
-<br>
 static void dummy_set_av(Object *obj,<br>
                          int value,<br>
                          Error **errp)<br>
@@ -103,39 +87,20 @@ static int dummy_get_av(Object *obj,<br>
     return dobj-&gt;av;<br>
 }<br>
<br>
+static Property bv_prop =<br>
+    DEFINE_PROP_BOOL(&quot;bv&quot;, DummyObject, bv, false);<br>
<br>
-static void dummy_set_sv(Object *obj,<br>
-                         const char *value,<br>
-                         Error **errp)<br>
-{<br>
-    DummyObject *dobj = DUMMY_OBJECT(obj);<br>
-<br>
-    g_free(dobj-&gt;sv);<br>
-    dobj-&gt;sv = g_strdup(value);<br>
-}<br>
-<br>
-static char *dummy_get_sv(Object *obj,<br>
-                          Error **errp)<br>
-{<br>
-    DummyObject *dobj = DUMMY_OBJECT(obj);<br>
-<br>
-    return g_strdup(dobj-&gt;sv);<br>
-}<br>
-<br>
+static Property sv_prop =<br>
+    DEFINE_PROP_STRING(&quot;sv&quot;, DummyObject, sv);<br>
<br>
 static void dummy_init(Object *obj)<br>
 {<br>
-    object_property_add_bool(obj, &quot;bv&quot;,<br>
-                             dummy_get_bv,<br>
-                             dummy_set_bv);<br>
+    object_property_add_static(obj, &amp;bv_prop, NULL);<br></blockquote></div><div class="gmail_quote"><br></div><div class="gmail_quote">Ok for testing internal functions.. hopefully it won&#39;t serve as an example!<br></div><div class="gmail_quote"><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
 }<br>
<br>
-<br>
 static void dummy_class_init(ObjectClass *cls, void *data)<br>
 {<br>
-    object_class_property_add_str(cls, &quot;sv&quot;,<br>
-                                  dummy_get_sv,<br>
-                                  dummy_set_sv);<br>
+    object_class_property_add_static(cls, &amp;sv_prop, NULL);<br>
     object_class_property_add_enum(cls, &quot;av&quot;,<br>
                                    &quot;DummyAnimal&quot;,<br>
                                    &amp;dummy_animal_map,<br>
@@ -143,21 +108,11 @@ static void dummy_class_init(ObjectClass *cls, void *data)<br>
                                    dummy_set_av);<br>
 }<br>
<br>
-<br>
-static void dummy_finalize(Object *obj)<br>
-{<br>
-    DummyObject *dobj = DUMMY_OBJECT(obj);<br>
-<br>
-    g_free(dobj-&gt;sv);<br>
-}<br>
-<br>
-<br>
 static const TypeInfo dummy_info = {<br>
     .name          = TYPE_DUMMY,<br>
     .parent        = TYPE_OBJECT,<br>
     .instance_size = sizeof(DummyObject),<br>
     .instance_init = dummy_init,<br>
-    .instance_finalize = dummy_finalize,<br>
     .class_size = sizeof(DummyObjectClass),<br>
     .class_init = dummy_class_init,<br>
     .interfaces = (InterfaceInfo[]) {<br>
-- <br>
2.28.0<br></blockquote><div> </div></div>Reviewed-by: Marc-André Lureau &lt;<a href="mailto:marcandre.lureau@redhat.com">marcandre.lureau@redhat.com</a>&gt;<br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature">Marc-André Lureau<br></div></div>
Thomas Huth Oct. 31, 2020, 10:25 a.m. UTC | #29
On 30/10/2020 18.13, Paolo Bonzini wrote:
> On 30/10/20 12:35, Eduardo Habkost wrote:

>>

>> What is necessary to make sure we have a CONFIG_XEN=y job in

>> gitlab CI?  Maybe just including xen-devel in some of the

>> container images is enough?

> 

> Fedora already has it, but build-system-fedora does not include

> x86_64-softmmu.


Eduardo, could you try to add xen-devel to the centos8 container? If that
does not work, we can still move the x86_64-softmmu target to the fedora
pipeline instead.

 Thomas
Philippe Mathieu-Daudé Nov. 8, 2020, 5:45 p.m. UTC | #30
On 10/31/20 11:25 AM, Thomas Huth wrote:
> On 30/10/2020 18.13, Paolo Bonzini wrote:

>> On 30/10/20 12:35, Eduardo Habkost wrote:

>>>

>>> What is necessary to make sure we have a CONFIG_XEN=y job in

>>> gitlab CI?  Maybe just including xen-devel in some of the

>>> container images is enough?

>>

>> Fedora already has it, but build-system-fedora does not include

>> x86_64-softmmu.

> 

> Eduardo, could you try to add xen-devel to the centos8 container? If that

> does not work, we can still move the x86_64-softmmu target to the fedora

> pipeline instead.


On CentOS 8:

  #6 10.70 No match for argument: xen-devel
  #6 10.71 Error: Unable to find a match: xen-devel

Regards,

Phil.