diff mbox

[v2,01/21] qdev: Replace cannot_instantiate_with_device_add_yet with !user_creatable

Message ID 20170404202429.14643-2-ehabkost@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Eduardo Habkost April 4, 2017, 8:24 p.m. UTC
cannot_instantiate_with_device_add_yet was introduced by commit
837d37167dc446af8a91189108b363c04609e296 to replace no_user. It
was supposed to be a temporary measure.

When it was introduced, we had 54
cannot_instantiate_with_device_add_yet=true lines in the code.
Today (3 years later) this number has not shrinked: we now have
57 cannot_instantiate_with_device_add_yet=true lines. I think it
is safe to say it is not a temporary measure, and we won't see
the flag go away soon.

Instead of a long field name that misleads people to believe it
is temporary, replace it a shorter and less misleading field:
user_creatable.

Except for code comments, changes were generated using the
following Coccinelle patch:

  @@
  expression DC;
  @@
  (
  -DC->cannot_instantiate_with_device_add_yet = false;
  +DC->user_creatable = true;
  |
  -DC->cannot_instantiate_with_device_add_yet = true;
  +DC->user_creatable = false;
  )

  @@
  typedef ObjectClass;
  expression dc;
  identifier class, data;
  @@
   static void device_class_init(ObjectClass *class, void *data)
   {
   ...
   dc->hotpluggable = true;
  +dc->user_creatable = true;
   ...
   }

  @@
  @@
   struct DeviceClass {
   ...
  -bool cannot_instantiate_with_device_add_yet;
  +bool user_creatable;
   ...
  }

  @@
  expression DC;
  @@
  (
  -!DC->cannot_instantiate_with_device_add_yet
  +DC->user_creatable
  |
  -DC->cannot_instantiate_with_device_add_yet
  +!DC->user_creatable
  )

Cc: Markus Armbruster <armbru@redhat.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Marcel Apfelbaum <marcel@redhat.com>
Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Thomas Huth <thuth@redhat.com>
Acked-by: Alistair Francis <alistair.francis@xilinx.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
Changes v1 -> v2:
* (none)
---
 include/hw/qdev-core.h              | 10 +++++-----
 include/hw/qdev-properties.h        |  4 ++--
 hw/acpi/piix4.c                     |  2 +-
 hw/arm/spitz.c                      |  2 +-
 hw/audio/marvell_88w8618.c          |  2 +-
 hw/audio/pcspk.c                    |  2 +-
 hw/core/or-irq.c                    |  2 +-
 hw/core/qdev.c                      |  1 +
 hw/core/register.c                  |  2 +-
 hw/dma/i8257.c                      |  2 +-
 hw/dma/sparc32_dma.c                |  2 +-
 hw/gpio/omap_gpio.c                 |  4 ++--
 hw/i2c/omap_i2c.c                   |  2 +-
 hw/i2c/smbus_eeprom.c               |  2 +-
 hw/i2c/smbus_ich9.c                 |  2 +-
 hw/i386/pc.c                        |  2 +-
 hw/input/vmmouse.c                  |  2 +-
 hw/intc/apic_common.c               |  2 +-
 hw/intc/etraxfs_pic.c               |  2 +-
 hw/intc/grlib_irqmp.c               |  2 +-
 hw/intc/i8259_common.c              |  2 +-
 hw/intc/nios2_iic.c                 |  2 +-
 hw/intc/omap_intc.c                 |  4 ++--
 hw/isa/lpc_ich9.c                   |  2 +-
 hw/isa/piix4.c                      |  2 +-
 hw/isa/vt82c686.c                   |  2 +-
 hw/mips/gt64xxx_pci.c               |  2 +-
 hw/misc/vmport.c                    |  2 +-
 hw/net/dp8393x.c                    |  2 +-
 hw/net/etraxfs_eth.c                |  2 +-
 hw/net/lance.c                      |  2 +-
 hw/pci-bridge/dec.c                 |  2 +-
 hw/pci-bridge/pci_expander_bridge.c |  2 +-
 hw/pci-host/apb.c                   |  2 +-
 hw/pci-host/bonito.c                |  2 +-
 hw/pci-host/gpex.c                  |  2 +-
 hw/pci-host/grackle.c               |  2 +-
 hw/pci-host/piix.c                  |  6 +++---
 hw/pci-host/ppce500.c               |  2 +-
 hw/pci-host/prep.c                  |  2 +-
 hw/pci-host/q35.c                   |  4 ++--
 hw/pci-host/uninorth.c              |  8 ++++----
 hw/pci-host/versatile.c             |  2 +-
 hw/pci-host/xilinx-pcie.c           |  2 +-
 hw/ppc/ppc4xx_pci.c                 |  2 +-
 hw/ppc/spapr_drc.c                  |  2 +-
 hw/s390x/s390-pci-bus.c             |  2 +-
 hw/sd/milkymist-memcard.c           |  2 +-
 hw/sd/pl181.c                       |  2 +-
 hw/sh4/sh_pci.c                     |  2 +-
 hw/timer/i8254_common.c             |  2 +-
 hw/timer/mc146818rtc.c              |  2 +-
 monitor.c                           |  2 +-
 qdev-monitor.c                      |  6 +++---
 qom/cpu.c                           |  2 +-
 target/i386/cpu.c                   |  2 +-
 56 files changed, 71 insertions(+), 70 deletions(-)

Comments

Marcel Apfelbaum April 5, 2017, 7:01 p.m. UTC | #1
On 04/04/2017 11:24 PM, Eduardo Habkost wrote:
> cannot_instantiate_with_device_add_yet was introduced by commit
> 837d37167dc446af8a91189108b363c04609e296 to replace no_user. It
> was supposed to be a temporary measure.
>


Hi Eduardo,

> When it was introduced, we had 54
> cannot_instantiate_with_device_add_yet=true lines in the code.
> Today (3 years later) this number has not shrinked: we now have
> 57 cannot_instantiate_with_device_add_yet=true lines. I think it
> is safe to say it is not a temporary measure, and we won't see
> the flag go away soon.
>
> Instead of a long field name that misleads people to believe it
> is temporary, replace it a shorter and less misleading field:
> user_creatable.

I completely agree with you. I never liked "negation" fields
and especially the ones ending with "_yet".

I also don't understand why "user_creatable" can't be used for white-listing *Q35*.
I do understand that on some archs we need a white-list per board,
but I don't think x86 needs it.

>
> Except for code comments, changes were generated using the
> following Coccinelle patch:
>
>   @@
>   expression DC;
>   @@
>   (
>   -DC->cannot_instantiate_with_device_add_yet = false;
>   +DC->user_creatable = true;

Is it necessary? Isn't "creatable = true" the default?

>   |
>   -DC->cannot_instantiate_with_device_add_yet = true;
>   +DC->user_creatable = false;
>   )
>
>   @@
>   typedef ObjectClass;
>   expression dc;
>   identifier class, data;
>   @@
>    static void device_class_init(ObjectClass *class, void *data)
>    {
>    ...
>    dc->hotpluggable = true;
>   +dc->user_creatable = true;

OK... it seems risky :). Is true that "hotpluggable" => creatable,
but the prev rule should work, right?

>    ...
>    }
>
>   @@
>   @@
>    struct DeviceClass {
>    ...
>   -bool cannot_instantiate_with_device_add_yet;
>   +bool user_creatable;
>    ...
>   }
>
>   @@
>   expression DC;
>   @@
>   (
>   -!DC->cannot_instantiate_with_device_add_yet
>   +DC->user_creatable
>   |
>   -DC->cannot_instantiate_with_device_add_yet
>   +!DC->user_creatable
>   )
>

Nice script!

Thanks,
Marcel

> Cc: Markus Armbruster <armbru@redhat.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Marcel Apfelbaum <marcel@redhat.com>
> Cc: Peter Maydell <peter.maydell@linaro.org>
> Cc: Thomas Huth <thuth@redhat.com>
> Acked-by: Alistair Francis <alistair.francis@xilinx.com>
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
> Changes v1 -> v2:
> * (none)
> ---
>  include/hw/qdev-core.h              | 10 +++++-----
>  include/hw/qdev-properties.h        |  4 ++--
>  hw/acpi/piix4.c                     |  2 +-
>  hw/arm/spitz.c                      |  2 +-
>  hw/audio/marvell_88w8618.c          |  2 +-
>  hw/audio/pcspk.c                    |  2 +-
>  hw/core/or-irq.c                    |  2 +-
>  hw/core/qdev.c                      |  1 +
>  hw/core/register.c                  |  2 +-
>  hw/dma/i8257.c                      |  2 +-
>  hw/dma/sparc32_dma.c                |  2 +-
>  hw/gpio/omap_gpio.c                 |  4 ++--
>  hw/i2c/omap_i2c.c                   |  2 +-
>  hw/i2c/smbus_eeprom.c               |  2 +-
>  hw/i2c/smbus_ich9.c                 |  2 +-
>  hw/i386/pc.c                        |  2 +-
>  hw/input/vmmouse.c                  |  2 +-
>  hw/intc/apic_common.c               |  2 +-
>  hw/intc/etraxfs_pic.c               |  2 +-
>  hw/intc/grlib_irqmp.c               |  2 +-
>  hw/intc/i8259_common.c              |  2 +-
>  hw/intc/nios2_iic.c                 |  2 +-
>  hw/intc/omap_intc.c                 |  4 ++--
>  hw/isa/lpc_ich9.c                   |  2 +-
>  hw/isa/piix4.c                      |  2 +-
>  hw/isa/vt82c686.c                   |  2 +-
>  hw/mips/gt64xxx_pci.c               |  2 +-
>  hw/misc/vmport.c                    |  2 +-
>  hw/net/dp8393x.c                    |  2 +-
>  hw/net/etraxfs_eth.c                |  2 +-
>  hw/net/lance.c                      |  2 +-
>  hw/pci-bridge/dec.c                 |  2 +-
>  hw/pci-bridge/pci_expander_bridge.c |  2 +-
>  hw/pci-host/apb.c                   |  2 +-
>  hw/pci-host/bonito.c                |  2 +-
>  hw/pci-host/gpex.c                  |  2 +-
>  hw/pci-host/grackle.c               |  2 +-
>  hw/pci-host/piix.c                  |  6 +++---
>  hw/pci-host/ppce500.c               |  2 +-
>  hw/pci-host/prep.c                  |  2 +-
>  hw/pci-host/q35.c                   |  4 ++--
>  hw/pci-host/uninorth.c              |  8 ++++----
>  hw/pci-host/versatile.c             |  2 +-
>  hw/pci-host/xilinx-pcie.c           |  2 +-
>  hw/ppc/ppc4xx_pci.c                 |  2 +-
>  hw/ppc/spapr_drc.c                  |  2 +-
>  hw/s390x/s390-pci-bus.c             |  2 +-
>  hw/sd/milkymist-memcard.c           |  2 +-
>  hw/sd/pl181.c                       |  2 +-
>  hw/sh4/sh_pci.c                     |  2 +-
>  hw/timer/i8254_common.c             |  2 +-
>  hw/timer/mc146818rtc.c              |  2 +-
>  monitor.c                           |  2 +-
>  qdev-monitor.c                      |  6 +++---
>  qom/cpu.c                           |  2 +-
>  target/i386/cpu.c                   |  2 +-
>  56 files changed, 71 insertions(+), 70 deletions(-)
>
> diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> index b44b476765..bc4e6f0486 100644
> --- a/include/hw/qdev-core.h
> +++ b/include/hw/qdev-core.h
> @@ -103,16 +103,16 @@ typedef struct DeviceClass {
>      Property *props;
>
>      /*
> -     * Shall we hide this device model from -device / device_add?
> +     * Can this device be instantiated with -device / device_add?
>       * All devices should support instantiation with device_add, and
>       * this flag should not exist.  But we're not there, yet.  Some
>       * devices fail to instantiate with cryptic error messages.
>       * Others instantiate, but don't work.  Exposing users to such
> -     * behavior would be cruel; this flag serves to protect them.  It
> -     * should never be set without a comment explaining why it is set.
> -     * TODO remove once we're there
> +     * behavior would be cruel; clearing this flag will protect them.
> +     * It should never be cleared without a comment explaining why it
> +     * is cleared.
>       */
> -    bool cannot_instantiate_with_device_add_yet;
> +    bool user_creatable;
>      /*
>       * Does this device model survive object_unref(object_new(TNAME))?
>       * All device models should, and this flag shouldn't exist.  Some
> diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
> index 7ac315331a..5c6e13b993 100644
> --- a/include/hw/qdev-properties.h
> +++ b/include/hw/qdev-properties.h
> @@ -134,12 +134,12 @@ extern PropertyInfo qdev_prop_arraylen;
>   *   device_add, so add code like this:
>   *   |* Reason: pointer property "NAME-OF-YOUR-PROP" *|
>   *   DeviceClass *dc = DEVICE_CLASS(class);
> - *   dc->cannot_instantiate_with_device_add_yet = true;
> + *   dc->user_creatable = false;
>   *
>   * - If the property may safely remain null, document it like this:
>   *   |*
>   *    * Note: pointer property "interrupt_vector" may remain null, thus
> - *    * no need for dc->cannot_instantiate_with_device_add_yet = true;
> + *    * no need for dc->user_creatable = false;
>   *    *|
>   */
>  #define DEFINE_PROP_PTR(_n, _s, _f)             \
> diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
> index a553a7e110..f4fd5907b8 100644
> --- a/hw/acpi/piix4.c
> +++ b/hw/acpi/piix4.c
> @@ -700,7 +700,7 @@ static void piix4_pm_class_init(ObjectClass *klass, void *data)
>       * Reason: part of PIIX4 southbridge, needs to be wired up,
>       * e.g. by mips_malta_init()
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      dc->hotpluggable = false;
>      hc->plug = piix4_device_plug_cb;
>      hc->unplug_request = piix4_device_unplug_request_cb;
> diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
> index fe2d5a764c..324626847c 100644
> --- a/hw/arm/spitz.c
> +++ b/hw/arm/spitz.c
> @@ -1076,7 +1076,7 @@ static void sl_nand_class_init(ObjectClass *klass, void *data)
>      dc->vmsd = &vmstate_sl_nand_info;
>      dc->props = sl_nand_properties;
>      /* Reason: init() method uses drive_get() */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo sl_nand_info = {
> diff --git a/hw/audio/marvell_88w8618.c b/hw/audio/marvell_88w8618.c
> index 511b004287..4f65f8c199 100644
> --- a/hw/audio/marvell_88w8618.c
> +++ b/hw/audio/marvell_88w8618.c
> @@ -292,7 +292,7 @@ static void mv88w8618_audio_class_init(ObjectClass *klass, void *data)
>      dc->vmsd = &mv88w8618_audio_vmsd;
>      dc->props = mv88w8618_audio_properties;
>      /* Reason: pointer property "wm8750" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo mv88w8618_audio_info = {
> diff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c
> index 798002277b..9b99358d87 100644
> --- a/hw/audio/pcspk.c
> +++ b/hw/audio/pcspk.c
> @@ -223,7 +223,7 @@ static void pcspk_class_initfn(ObjectClass *klass, void *data)
>      dc->vmsd = &vmstate_spk;
>      dc->props = pcspk_properties;
>      /* Reason: realize sets global pcspk_state */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo pcspk_info = {
> diff --git a/hw/core/or-irq.c b/hw/core/or-irq.c
> index 1485d5b285..f9d76c4641 100644
> --- a/hw/core/or-irq.c
> +++ b/hw/core/or-irq.c
> @@ -91,7 +91,7 @@ static void or_irq_class_init(ObjectClass *klass, void *data)
>      dc->vmsd = &vmstate_or_irq;
>
>      /* Reason: Needs to be wired up to work, e.g. see stm32f205_soc.c */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo or_irq_type_info = {
> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index 1e7fb33246..4132a8bee3 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -1159,6 +1159,7 @@ static void device_class_init(ObjectClass *class, void *data)
>       * should override it in their class_init()
>       */
>      dc->hotpluggable = true;
> +    dc->user_creatable = true;
>  }
>
>  void device_reset(DeviceState *dev)
> diff --git a/hw/core/register.c b/hw/core/register.c
> index dc335a79a9..da38ef3a54 100644
> --- a/hw/core/register.c
> +++ b/hw/core/register.c
> @@ -288,7 +288,7 @@ static void register_class_init(ObjectClass *oc, void *data)
>      DeviceClass *dc = DEVICE_CLASS(oc);
>
>      /* Reason: needs to be wired up to work */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo register_info = {
> diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c
> index 8bd82e8bc8..bd23e893bf 100644
> --- a/hw/dma/i8257.c
> +++ b/hw/dma/i8257.c
> @@ -601,7 +601,7 @@ static void i8257_class_init(ObjectClass *klass, void *data)
>      idc->schedule = i8257_dma_schedule;
>      idc->register_channel = i8257_dma_register_channel;
>      /* Reason: needs to be wired up by isa_bus_dma() to work */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo i8257_info = {
> diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
> index 9d545e412e..9c6bdc6295 100644
> --- a/hw/dma/sparc32_dma.c
> +++ b/hw/dma/sparc32_dma.c
> @@ -305,7 +305,7 @@ static void sparc32_dma_class_init(ObjectClass *klass, void *data)
>      dc->vmsd = &vmstate_dma;
>      dc->props = sparc32_dma_properties;
>      /* Reason: pointer property "iommu_opaque" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo sparc32_dma_info = {
> diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
> index dabef4a119..1df394eb12 100644
> --- a/hw/gpio/omap_gpio.c
> +++ b/hw/gpio/omap_gpio.c
> @@ -773,7 +773,7 @@ static void omap_gpio_class_init(ObjectClass *klass, void *data)
>      dc->reset = omap_gpif_reset;
>      dc->props = omap_gpio_properties;
>      /* Reason: pointer property "clk" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo omap_gpio_info = {
> @@ -804,7 +804,7 @@ static void omap2_gpio_class_init(ObjectClass *klass, void *data)
>      dc->reset = omap2_gpif_reset;
>      dc->props = omap2_gpio_properties;
>      /* Reason: pointer properties "iclk", "fclk0", ..., "fclk5" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo omap2_gpio_info = {
> diff --git a/hw/i2c/omap_i2c.c b/hw/i2c/omap_i2c.c
> index f7c92ea00c..f6e80bee25 100644
> --- a/hw/i2c/omap_i2c.c
> +++ b/hw/i2c/omap_i2c.c
> @@ -491,7 +491,7 @@ static void omap_i2c_class_init(ObjectClass *klass, void *data)
>      dc->props = omap_i2c_properties;
>      dc->reset = omap_i2c_reset;
>      /* Reason: pointer properties "iclk", "fclk" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      dc->realize = omap_i2c_realize;
>  }
>
> diff --git a/hw/i2c/smbus_eeprom.c b/hw/i2c/smbus_eeprom.c
> index 5b7bd891bc..b13ec0fe7a 100644
> --- a/hw/i2c/smbus_eeprom.c
> +++ b/hw/i2c/smbus_eeprom.c
> @@ -123,7 +123,7 @@ static void smbus_eeprom_class_initfn(ObjectClass *klass, void *data)
>      sc->read_data = eeprom_read_data;
>      dc->props = smbus_eeprom_properties;
>      /* Reason: pointer property "data" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo smbus_eeprom_info = {
> diff --git a/hw/i2c/smbus_ich9.c b/hw/i2c/smbus_ich9.c
> index 48fab22625..ea51e09186 100644
> --- a/hw/i2c/smbus_ich9.c
> +++ b/hw/i2c/smbus_ich9.c
> @@ -103,7 +103,7 @@ static void ich9_smb_class_init(ObjectClass *klass, void *data)
>       * Reason: part of ICH9 southbridge, needs to be wired up by
>       * pc_q35_init()
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  I2CBus *ich9_smb_init(PCIBus *bus, int devfn, uint32_t smb_io_base)
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index d24388e05f..610050eb4f 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -597,7 +597,7 @@ static void port92_class_initfn(ObjectClass *klass, void *data)
>       * wiring: its A20 output line needs to be wired up by
>       * port92_init().
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo port92_info = {
> diff --git a/hw/input/vmmouse.c b/hw/input/vmmouse.c
> index 6d15a887c6..4747da9a8d 100644
> --- a/hw/input/vmmouse.c
> +++ b/hw/input/vmmouse.c
> @@ -286,7 +286,7 @@ static void vmmouse_class_initfn(ObjectClass *klass, void *data)
>      dc->vmsd = &vmstate_vmmouse;
>      dc->props = vmmouse_properties;
>      /* Reason: pointer property "ps2_mouse" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo vmmouse_info = {
> diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
> index c3829e31b5..1ef56f8d10 100644
> --- a/hw/intc/apic_common.c
> +++ b/hw/intc/apic_common.c
> @@ -501,7 +501,7 @@ static void apic_common_class_init(ObjectClass *klass, void *data)
>       * Reason: APIC and CPU need to be wired up by
>       * x86_cpu_apic_create()
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo apic_common_type = {
> diff --git a/hw/intc/etraxfs_pic.c b/hw/intc/etraxfs_pic.c
> index 64a6f4b4ba..1bfde2f09e 100644
> --- a/hw/intc/etraxfs_pic.c
> +++ b/hw/intc/etraxfs_pic.c
> @@ -173,7 +173,7 @@ static void etraxfs_pic_class_init(ObjectClass *klass, void *data)
>      dc->props = etraxfs_pic_properties;
>      /*
>       * Note: pointer property "interrupt_vector" may remain null, thus
> -     * no need for dc->cannot_instantiate_with_device_add_yet = true;
> +     * no need for dc->user_creatable = false;
>       */
>  }
>
> diff --git a/hw/intc/grlib_irqmp.c b/hw/intc/grlib_irqmp.c
> index ac7e63f38b..94659ee256 100644
> --- a/hw/intc/grlib_irqmp.c
> +++ b/hw/intc/grlib_irqmp.c
> @@ -360,7 +360,7 @@ static void grlib_irqmp_class_init(ObjectClass *klass, void *data)
>      dc->reset = grlib_irqmp_reset;
>      dc->props = grlib_irqmp_properties;
>      /* Reason: pointer properties "set_pil_in", "set_pil_in_opaque" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      dc->realize = grlib_irqmp_realize;
>  }
>
> diff --git a/hw/intc/i8259_common.c b/hw/intc/i8259_common.c
> index d9a5e8b217..c2fd563b5b 100644
> --- a/hw/intc/i8259_common.c
> +++ b/hw/intc/i8259_common.c
> @@ -144,7 +144,7 @@ static void pic_common_class_init(ObjectClass *klass, void *data)
>       * wiring of the slave to the master is hard-coded in device model
>       * code.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo pic_common_type = {
> diff --git a/hw/intc/nios2_iic.c b/hw/intc/nios2_iic.c
> index 190b6fdbf3..016426f964 100644
> --- a/hw/intc/nios2_iic.c
> +++ b/hw/intc/nios2_iic.c
> @@ -80,7 +80,7 @@ static void altera_iic_class_init(ObjectClass *klass, void *data)
>      DeviceClass *dc = DEVICE_CLASS(klass);
>
>      /* Reason: needs to be wired up, e.g. by nios2_10m50_ghrd_init() */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      dc->realize = altera_iic_realize;
>  }
>
> diff --git a/hw/intc/omap_intc.c b/hw/intc/omap_intc.c
> index 877be67971..ccdda89dab 100644
> --- a/hw/intc/omap_intc.c
> +++ b/hw/intc/omap_intc.c
> @@ -401,7 +401,7 @@ static void omap_intc_class_init(ObjectClass *klass, void *data)
>      dc->reset = omap_inth_reset;
>      dc->props = omap_intc_properties;
>      /* Reason: pointer property "clk" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      dc->realize = omap_intc_realize;
>  }
>
> @@ -656,7 +656,7 @@ static void omap2_intc_class_init(ObjectClass *klass, void *data)
>      dc->reset = omap_inth_reset;
>      dc->props = omap2_intc_properties;
>      /* Reason: pointer property "iclk", "fclk" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      dc->realize = omap2_intc_realize;
>  }
>
> diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
> index 59930dd9d0..cdc854a822 100644
> --- a/hw/isa/lpc_ich9.c
> +++ b/hw/isa/lpc_ich9.c
> @@ -810,7 +810,7 @@ static void ich9_lpc_class_init(ObjectClass *klass, void *data)
>       * Reason: part of ICH9 southbridge, needs to be wired up by
>       * pc_q35_init()
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      hc->plug = ich9_pm_device_plug_cb;
>      hc->unplug_request = ich9_pm_device_unplug_request_cb;
>      hc->unplug = ich9_pm_device_unplug_cb;
> diff --git a/hw/isa/piix4.c b/hw/isa/piix4.c
> index 5500fcc4d6..f811eba59d 100644
> --- a/hw/isa/piix4.c
> +++ b/hw/isa/piix4.c
> @@ -123,7 +123,7 @@ static void piix4_class_init(ObjectClass *klass, void *data)
>       * Reason: part of PIIX4 southbridge, needs to be wired up,
>       * e.g. by mips_malta_init()
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      dc->hotpluggable = false;
>  }
>
> diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c
> index 41d5254f8e..50dc83df77 100644
> --- a/hw/isa/vt82c686.c
> +++ b/hw/isa/vt82c686.c
> @@ -494,7 +494,7 @@ static void via_class_init(ObjectClass *klass, void *data)
>       * Reason: part of VIA VT82C686 southbridge, needs to be wired up,
>       * e.g. by mips_fulong2e_init()
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo via_info = {
> diff --git a/hw/mips/gt64xxx_pci.c b/hw/mips/gt64xxx_pci.c
> index 4811843ab6..e8b2eef688 100644
> --- a/hw/mips/gt64xxx_pci.c
> +++ b/hw/mips/gt64xxx_pci.c
> @@ -1224,7 +1224,7 @@ static void gt64120_pci_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo gt64120_pci_info = {
> diff --git a/hw/misc/vmport.c b/hw/misc/vmport.c
> index be40930b8b..165500223f 100644
> --- a/hw/misc/vmport.c
> +++ b/hw/misc/vmport.c
> @@ -163,7 +163,7 @@ static void vmport_class_initfn(ObjectClass *klass, void *data)
>
>      dc->realize = vmport_realizefn;
>      /* Reason: realize sets global port_state */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo vmport_info = {
> diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
> index efa33ad40a..b53fcaa8bc 100644
> --- a/hw/net/dp8393x.c
> +++ b/hw/net/dp8393x.c
> @@ -934,7 +934,7 @@ static void dp8393x_class_init(ObjectClass *klass, void *data)
>      dc->vmsd = &vmstate_dp8393x;
>      dc->props = dp8393x_properties;
>      /* Reason: dma_mr property can't be set */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo dp8393x_info = {
> diff --git a/hw/net/etraxfs_eth.c b/hw/net/etraxfs_eth.c
> index efaa49faae..013c8d0a41 100644
> --- a/hw/net/etraxfs_eth.c
> +++ b/hw/net/etraxfs_eth.c
> @@ -630,7 +630,7 @@ static void etraxfs_eth_class_init(ObjectClass *klass, void *data)
>      k->init = fs_eth_init;
>      dc->props = etraxfs_eth_properties;
>      /* Reason: pointer properties "dma_out", "dma_in" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo etraxfs_eth_info = {
> diff --git a/hw/net/lance.c b/hw/net/lance.c
> index 573d724bcf..92b0c68274 100644
> --- a/hw/net/lance.c
> +++ b/hw/net/lance.c
> @@ -165,7 +165,7 @@ static void lance_class_init(ObjectClass *klass, void *data)
>      dc->vmsd = &vmstate_lance;
>      dc->props = lance_properties;
>      /* Reason: pointer property "dma" */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo lance_info = {
> diff --git a/hw/pci-bridge/dec.c b/hw/pci-bridge/dec.c
> index 840c96198a..cca93620ac 100644
> --- a/hw/pci-bridge/dec.c
> +++ b/hw/pci-bridge/dec.c
> @@ -128,7 +128,7 @@ static void dec_21154_pci_host_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo dec_21154_pci_host_info = {
> diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
> index 6ac187fa32..ff59abf208 100644
> --- a/hw/pci-bridge/pci_expander_bridge.c
> +++ b/hw/pci-bridge/pci_expander_bridge.c
> @@ -150,7 +150,7 @@ static void pxb_host_class_init(ObjectClass *class, void *data)
>
>      dc->fw_name = "pci";
>      /* Reason: Internal part of the pxb/pxb-pcie device, not usable by itself */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      sbc->explicit_ofw_unit_address = pxb_host_ofw_unit_address;
>      hc->root_bus_path = pxb_host_root_bus_path;
>  }
> diff --git a/hw/pci-host/apb.c b/hw/pci-host/apb.c
> index 653e711121..edc88f4c65 100644
> --- a/hw/pci-host/apb.c
> +++ b/hw/pci-host/apb.c
> @@ -810,7 +810,7 @@ static void pbm_pci_host_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo pbm_pci_host_info = {
> diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c
> index 1999ece590..85a3bb0dd2 100644
> --- a/hw/pci-host/bonito.c
> +++ b/hw/pci-host/bonito.c
> @@ -825,7 +825,7 @@ static void bonito_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo bonito_info = {
> diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
> index 66055ee5cc..e2629ce70d 100644
> --- a/hw/pci-host/gpex.c
> +++ b/hw/pci-host/gpex.c
> @@ -136,7 +136,7 @@ static void gpex_root_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo gpex_root_info = {
> diff --git a/hw/pci-host/grackle.c b/hw/pci-host/grackle.c
> index 2c8acdaaca..2e281f6155 100644
> --- a/hw/pci-host/grackle.c
> +++ b/hw/pci-host/grackle.c
> @@ -134,7 +134,7 @@ static void grackle_pci_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo grackle_pci_info = {
> diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
> index f9218aa952..81f3a9e211 100644
> --- a/hw/pci-host/piix.c
> +++ b/hw/pci-host/piix.c
> @@ -691,7 +691,7 @@ static void pci_piix3_class_init(ObjectClass *klass, void *data)
>       * Reason: part of PIIX3 southbridge, needs to be wired up by
>       * pc_piix.c's pc_init1()
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo piix3_pci_type_info = {
> @@ -745,7 +745,7 @@ static void i440fx_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      dc->hotpluggable   = false;
>  }
>
> @@ -874,7 +874,7 @@ static void i440fx_pcihost_class_init(ObjectClass *klass, void *data)
>      dc->fw_name = "pci";
>      dc->props = i440fx_props;
>      /* Reason: needs to be wired up by pc_init1 */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo i440fx_pcihost_info = {
> diff --git a/hw/pci-host/ppce500.c b/hw/pci-host/ppce500.c
> index e502bc0505..becc0eeb76 100644
> --- a/hw/pci-host/ppce500.c
> +++ b/hw/pci-host/ppce500.c
> @@ -508,7 +508,7 @@ static void e500_host_bridge_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo e500_host_bridge_info = {
> diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
> index 260a119a9e..900a6edfcf 100644
> --- a/hw/pci-host/prep.c
> +++ b/hw/pci-host/prep.c
> @@ -364,7 +364,7 @@ static void raven_class_init(ObjectClass *klass, void *data)
>       * Reason: PCI-facing part of the host bridge, not usable without
>       * the host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo raven_info = {
> diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
> index 344f77b10c..cd5c49616e 100644
> --- a/hw/pci-host/q35.c
> +++ b/hw/pci-host/q35.c
> @@ -156,7 +156,7 @@ static void q35_host_class_init(ObjectClass *klass, void *data)
>      dc->realize = q35_host_realize;
>      dc->props = mch_props;
>      /* Reason: needs to be wired up by pc_q35_init */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
>      dc->fw_name = "pci";
>  }
> @@ -549,7 +549,7 @@ static void mch_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo mch_info = {
> diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c
> index df342ac3cb..6cf5e59f86 100644
> --- a/hw/pci-host/uninorth.c
> +++ b/hw/pci-host/uninorth.c
> @@ -366,7 +366,7 @@ static void unin_main_pci_host_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo unin_main_pci_host_info = {
> @@ -390,7 +390,7 @@ static void u3_agp_pci_host_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo u3_agp_pci_host_info = {
> @@ -414,7 +414,7 @@ static void unin_agp_pci_host_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo unin_agp_pci_host_info = {
> @@ -438,7 +438,7 @@ static void unin_internal_pci_host_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo unin_internal_pci_host_info = {
> diff --git a/hw/pci-host/versatile.c b/hw/pci-host/versatile.c
> index 467cbb9cb8..cc51fc87a3 100644
> --- a/hw/pci-host/versatile.c
> +++ b/hw/pci-host/versatile.c
> @@ -479,7 +479,7 @@ static void versatile_pci_host_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo versatile_pci_host_info = {
> diff --git a/hw/pci-host/xilinx-pcie.c b/hw/pci-host/xilinx-pcie.c
> index 8b71e2d950..a968cea2af 100644
> --- a/hw/pci-host/xilinx-pcie.c
> +++ b/hw/pci-host/xilinx-pcie.c
> @@ -309,7 +309,7 @@ static void xilinx_pcie_root_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo xilinx_pcie_root_info = {
> diff --git a/hw/ppc/ppc4xx_pci.c b/hw/ppc/ppc4xx_pci.c
> index dc19682970..6953f8b9ac 100644
> --- a/hw/ppc/ppc4xx_pci.c
> +++ b/hw/ppc/ppc4xx_pci.c
> @@ -351,7 +351,7 @@ static void ppc4xx_host_bridge_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo ppc4xx_host_bridge_info = {
> diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
> index a1cdc875b1..9fa5545991 100644
> --- a/hw/ppc/spapr_drc.c
> +++ b/hw/ppc/spapr_drc.c
> @@ -675,7 +675,7 @@ static void spapr_dr_connector_class_init(ObjectClass *k, void *data)
>      /*
>       * Reason: it crashes FIXME find and document the real reason
>       */
> -    dk->cannot_instantiate_with_device_add_yet = true;
> +    dk->user_creatable = false;
>  }
>
>  static const TypeInfo spapr_dr_connector_info = {
> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> index 69b0291e8a..1ec30c45ce 100644
> --- a/hw/s390x/s390-pci-bus.c
> +++ b/hw/s390x/s390-pci-bus.c
> @@ -867,7 +867,7 @@ static void s390_pcihost_class_init(ObjectClass *klass, void *data)
>      DeviceClass *dc = DEVICE_CLASS(klass);
>      HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
>
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>      dc->reset = s390_pcihost_reset;
>      k->init = s390_pcihost_init;
>      hc->plug = s390_pcihost_hot_plug;
> diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
> index 1f2f0ed44a..4008c81002 100644
> --- a/hw/sd/milkymist-memcard.c
> +++ b/hw/sd/milkymist-memcard.c
> @@ -299,7 +299,7 @@ static void milkymist_memcard_class_init(ObjectClass *klass, void *data)
>      dc->reset = milkymist_memcard_reset;
>      dc->vmsd = &vmstate_milkymist_memcard;
>      /* Reason: init() method uses drive_get_next() */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo milkymist_memcard_info = {
> diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
> index 82c63a4fb5..55c8098ecd 100644
> --- a/hw/sd/pl181.c
> +++ b/hw/sd/pl181.c
> @@ -515,7 +515,7 @@ static void pl181_class_init(ObjectClass *klass, void *data)
>      k->vmsd = &vmstate_pl181;
>      k->reset = pl181_reset;
>      /* Reason: init() method uses drive_get_next() */
> -    k->cannot_instantiate_with_device_add_yet = true;
> +    k->user_creatable = false;
>      k->realize = pl181_realize;
>  }
>
> diff --git a/hw/sh4/sh_pci.c b/hw/sh4/sh_pci.c
> index 1747628f3d..38395c082b 100644
> --- a/hw/sh4/sh_pci.c
> +++ b/hw/sh4/sh_pci.c
> @@ -171,7 +171,7 @@ static void sh_pci_host_class_init(ObjectClass *klass, void *data)
>       * PCI-facing part of the host bridge, not usable without the
>       * host-facing part, which can't be device_add'ed, yet.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo sh_pci_host_info = {
> diff --git a/hw/timer/i8254_common.c b/hw/timer/i8254_common.c
> index e18299a482..976d5200f1 100644
> --- a/hw/timer/i8254_common.c
> +++ b/hw/timer/i8254_common.c
> @@ -287,7 +287,7 @@ static void pit_common_class_init(ObjectClass *klass, void *data)
>       * wired to the HPET, and because of that, some wiring is always
>       * done by board code.
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo pit_common_type = {
> diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c
> index 4165450250..93de3e1cc5 100644
> --- a/hw/timer/mc146818rtc.c
> +++ b/hw/timer/mc146818rtc.c
> @@ -973,7 +973,7 @@ static void rtc_class_initfn(ObjectClass *klass, void *data)
>      dc->vmsd = &vmstate_rtc;
>      dc->props = mc146818rtc_properties;
>      /* Reason: needs to be wired up by rtc_init() */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static void rtc_finalize(Object *obj)
> diff --git a/monitor.c b/monitor.c
> index be282ecb80..e06edec2bd 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -3156,7 +3156,7 @@ void device_add_completion(ReadLineState *rs, int nb_args, const char *str)
>                                               TYPE_DEVICE);
>          name = object_class_get_name(OBJECT_CLASS(dc));
>
> -        if (!dc->cannot_instantiate_with_device_add_yet
> +        if (dc->user_creatable
>              && !strncmp(name, str, len)) {
>              readline_add_completion(rs, name);
>          }
> diff --git a/qdev-monitor.c b/qdev-monitor.c
> index 5f2fcdfc45..e4c180c6bc 100644
> --- a/qdev-monitor.c
> +++ b/qdev-monitor.c
> @@ -113,7 +113,7 @@ static void qdev_print_devinfo(DeviceClass *dc)
>      if (dc->desc) {
>          error_printf(", desc \"%s\"", dc->desc);
>      }
> -    if (dc->cannot_instantiate_with_device_add_yet) {
> +    if (!dc->user_creatable) {
>          error_printf(", no-user");
>      }
>      error_printf("\n");
> @@ -155,7 +155,7 @@ static void qdev_print_devinfos(bool show_no_user)
>                   ? !test_bit(i, dc->categories)
>                   : !bitmap_empty(dc->categories, DEVICE_CATEGORY_MAX))
>                  || (!show_no_user
> -                    && dc->cannot_instantiate_with_device_add_yet)) {
> +                    && !dc->user_creatable)) {
>                  continue;
>              }
>              if (!cat_printed) {
> @@ -240,7 +240,7 @@ static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
>      }
>
>      dc = DEVICE_CLASS(oc);
> -    if (dc->cannot_instantiate_with_device_add_yet ||
> +    if (!dc->user_creatable ||
>          (qdev_hotplug && !dc->hotpluggable)) {
>          error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "driver",
>                     "pluggable device type");
> diff --git a/qom/cpu.c b/qom/cpu.c
> index f02e9c0fae..73ae140d7e 100644
> --- a/qom/cpu.c
> +++ b/qom/cpu.c
> @@ -449,7 +449,7 @@ static void cpu_class_init(ObjectClass *klass, void *data)
>       * Reason: CPUs still need special care by board code: wiring up
>       * IRQs, adding reset handlers, halting non-first CPUs, ...
>       */
> -    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->user_creatable = false;
>  }
>
>  static const TypeInfo cpu_type_info = {
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index 13c0985f11..4b3bfb3802 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -4066,7 +4066,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
>      cc->cpu_exec_enter = x86_cpu_exec_enter;
>      cc->cpu_exec_exit = x86_cpu_exec_exit;
>
> -    dc->cannot_instantiate_with_device_add_yet = false;
> +    dc->user_creatable = true;
>  }
>
>  static const TypeInfo x86_cpu_type_info = {
>
Eduardo Habkost April 5, 2017, 7:42 p.m. UTC | #2
On Wed, Apr 05, 2017 at 10:01:29PM +0300, Marcel Apfelbaum wrote:
> On 04/04/2017 11:24 PM, Eduardo Habkost wrote:
> > cannot_instantiate_with_device_add_yet was introduced by commit
> > 837d37167dc446af8a91189108b363c04609e296 to replace no_user. It
> > was supposed to be a temporary measure.
> > 
> 
> 
> Hi Eduardo,
> 
> > When it was introduced, we had 54
> > cannot_instantiate_with_device_add_yet=true lines in the code.
> > Today (3 years later) this number has not shrinked: we now have
> > 57 cannot_instantiate_with_device_add_yet=true lines. I think it
> > is safe to say it is not a temporary measure, and we won't see
> > the flag go away soon.
> > 
> > Instead of a long field name that misleads people to believe it
> > is temporary, replace it a shorter and less misleading field:
> > user_creatable.
> 
> I completely agree with you. I never liked "negation" fields
> and especially the ones ending with "_yet".
> 
> I also don't understand why "user_creatable" can't be used for white-listing *Q35*.
> I do understand that on some archs we need a white-list per board,
> but I don't think x86 needs it.
> 
> > 
> > Except for code comments, changes were generated using the
> > following Coccinelle patch:
> > 
> >   @@
> >   expression DC;
> >   @@
> >   (
> >   -DC->cannot_instantiate_with_device_add_yet = false;
> >   +DC->user_creatable = true;
> 
> Is it necessary? Isn't "creatable = true" the default?

cannot_instantiate_with_device_add_yet is also false by default,
but if there's code explicitly setting it to false somewhere, it
is probably necessary for some reason. The script doesn't care
what's the reason, because this is a 100% mechanical translation
from the old logic to equivalent logic using the new field.

If you are still curious about specific cases: explicit
cannot_instantiate_with_device_add_yet=false/user_creatable=true
is necessary at x86_cpu_common_class_init(), because TYPE_CPU has
cannot_instantiate_with_device_add_yet=true (most CPU types don't
support device_add), but TYPE_X86_CPU sets it back to false
(because x86 supports CPU hotplug).

> 
> >   |
> >   -DC->cannot_instantiate_with_device_add_yet = true;
> >   +DC->user_creatable = false;
> >   )
> > 
> >   @@
> >   typedef ObjectClass;
> >   expression dc;
> >   identifier class, data;
> >   @@
> >    static void device_class_init(ObjectClass *class, void *data)
> >    {
> >    ...
> >    dc->hotpluggable = true;
> >   +dc->user_creatable = true;
> 
> OK... it seems risky :). Is true that "hotpluggable" => creatable,
> but the prev rule should work, right?

Note that this part is only changing device_class_init(), and no
other function. dc->hotpluggable=true appears here by pure
chance: it's just because this is the spot where the new
dc->user_creatable=true line is being added.

This explicit line addition is required because there's no
explicit dc->user_creatable=false line in device_class_init
because QOM objects are always zeroed on creation)

> 
> >    ...
> >    }
> > 
> >   @@
> >   @@
> >    struct DeviceClass {
> >    ...
> >   -bool cannot_instantiate_with_device_add_yet;
> >   +bool user_creatable;
> >    ...
> >   }
> > 
> >   @@
> >   expression DC;
> >   @@
> >   (
> >   -!DC->cannot_instantiate_with_device_add_yet
> >   +DC->user_creatable
> >   |
> >   -DC->cannot_instantiate_with_device_add_yet
> >   +!DC->user_creatable
> >   )
> > 
> 
> Nice script!

Thanks!
Eduardo Habkost April 5, 2017, 9:25 p.m. UTC | #3
Forgot to answer this part on my previous message:

On Wed, Apr 05, 2017 at 10:01:29PM +0300, Marcel Apfelbaum wrote:
[...]
> > When it was introduced, we had 54
> > cannot_instantiate_with_device_add_yet=true lines in the code.
> > Today (3 years later) this number has not shrinked: we now have
> > 57 cannot_instantiate_with_device_add_yet=true lines. I think it
> > is safe to say it is not a temporary measure, and we won't see
> > the flag go away soon.
> > 
> > Instead of a long field name that misleads people to believe it
> > is temporary, replace it a shorter and less misleading field:
> > user_creatable.
> 
> I completely agree with you. I never liked "negation" fields
> and especially the ones ending with "_yet".
> 
> I also don't understand why "user_creatable" can't be used for white-listing *Q35*.
> I do understand that on some archs we need a white-list per board,
> but I don't think x86 needs it.

It's true that q35 wouldn't break if it simply used
user_creatable after applying this series. But it will break if
one day we link code that registers a user-creatable non-x86
device inside the qemu-system-x86_64 binary (even if by
accident), or if we add a new user-creatable sysbus device for
other x86 machines (e.g. isapc, xenfv, xenpv, pc-i440fx).

Maybe those situations are unlikely, but if we introduce common
infrastructure to let machine-types define their sysbus
whitelists[1], we get the ability to define the q35 whitelist for
free.

[1] See "[RFC 0/4] Replace has_dynamic_sysbus with device type whitelist"
Peter Maydell April 5, 2017, 9:30 p.m. UTC | #4
On 5 April 2017 at 22:25, Eduardo Habkost <ehabkost@redhat.com> wrote:
> It's true that q35 wouldn't break if it simply used
> user_creatable after applying this series. But it will break if
> one day we link code that registers a user-creatable non-x86
> device inside the qemu-system-x86_64 binary (even if by
> accident), or if we add a new user-creatable sysbus device for
> other x86 machines (e.g. isapc, xenfv, xenpv, pc-i440fx).

I would some day like us to be able to move towards
multiple-architectures-one-qemu-binary, so yes, we
should not assume that no non-x86 devices or CPUs
could ever be linked in.

thanks
-- PMM
Thomas Huth April 6, 2017, 9:25 a.m. UTC | #5
On 04.04.2017 22:24, Eduardo Habkost wrote:
> cannot_instantiate_with_device_add_yet was introduced by commit
> 837d37167dc446af8a91189108b363c04609e296 to replace no_user. It
> was supposed to be a temporary measure.

I think you rather meant commit efec3dd631d94160288392721a5f9c39e50fb2bc
("qdev: Replace no_user by cannot_instantiate_with_device_add_yet") ?

> When it was introduced, we had 54
> cannot_instantiate_with_device_add_yet=true lines in the code.
> Today (3 years later) this number has not shrinked: we now have
> 57 cannot_instantiate_with_device_add_yet=true lines. I think it
> is safe to say it is not a temporary measure, and we won't see
> the flag go away soon.

I fully agree.

> Instead of a long field name that misleads people to believe it
> is temporary, replace it a shorter and less misleading field:
> user_creatable.

Sounds much better, indeed. Thanks for tackling this!

[...]
>  static void rtc_finalize(Object *obj)
> diff --git a/monitor.c b/monitor.c
> index be282ecb80..e06edec2bd 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -3156,7 +3156,7 @@ void device_add_completion(ReadLineState *rs, int nb_args, const char *str)
>                                               TYPE_DEVICE);
>          name = object_class_get_name(OBJECT_CLASS(dc));
>  
> -        if (!dc->cannot_instantiate_with_device_add_yet
> +        if (dc->user_creatable
>              && !strncmp(name, str, len)) {

Cosmetics: You could put the strcmp now into the previous line, too.

>              readline_add_completion(rs, name);
>          }
> diff --git a/qdev-monitor.c b/qdev-monitor.c
> index 5f2fcdfc45..e4c180c6bc 100644
> --- a/qdev-monitor.c
> +++ b/qdev-monitor.c
> @@ -113,7 +113,7 @@ static void qdev_print_devinfo(DeviceClass *dc)
>      if (dc->desc) {
>          error_printf(", desc \"%s\"", dc->desc);
>      }
> -    if (dc->cannot_instantiate_with_device_add_yet) {
> +    if (!dc->user_creatable) {
>          error_printf(", no-user");
>      }
>      error_printf("\n");
> @@ -155,7 +155,7 @@ static void qdev_print_devinfos(bool show_no_user)
>                   ? !test_bit(i, dc->categories)
>                   : !bitmap_empty(dc->categories, DEVICE_CATEGORY_MAX))
>                  || (!show_no_user
> -                    && dc->cannot_instantiate_with_device_add_yet)) {
> +                    && !dc->user_creatable)) {

Cosmetics: That line could now also be moved at the end of the previous
line.

>                  continue;
>              }
>              if (!cat_printed) {
> @@ -240,7 +240,7 @@ static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
>      }
>  
>      dc = DEVICE_CLASS(oc);
> -    if (dc->cannot_instantiate_with_device_add_yet ||
> +    if (!dc->user_creatable ||
>          (qdev_hotplug && !dc->hotpluggable)) {

dito

Anyway, patch looks fine to me, so:

Reviewed-by: Thomas Huth <thuth@redhat.com>
Marcel Apfelbaum April 6, 2017, 9:31 a.m. UTC | #6
On 04/05/2017 10:42 PM, Eduardo Habkost wrote:
> On Wed, Apr 05, 2017 at 10:01:29PM +0300, Marcel Apfelbaum wrote:
>> On 04/04/2017 11:24 PM, Eduardo Habkost wrote:
>>> cannot_instantiate_with_device_add_yet was introduced by commit
>>> 837d37167dc446af8a91189108b363c04609e296 to replace no_user. It
>>> was supposed to be a temporary measure.
>>>
>>
>>
>> Hi Eduardo,
>>
>>> When it was introduced, we had 54
>>> cannot_instantiate_with_device_add_yet=true lines in the code.
>>> Today (3 years later) this number has not shrinked: we now have
>>> 57 cannot_instantiate_with_device_add_yet=true lines. I think it
>>> is safe to say it is not a temporary measure, and we won't see
>>> the flag go away soon.
>>>
>>> Instead of a long field name that misleads people to believe it
>>> is temporary, replace it a shorter and less misleading field:
>>> user_creatable.
>>
>> I completely agree with you. I never liked "negation" fields
>> and especially the ones ending with "_yet".
>>
>> I also don't understand why "user_creatable" can't be used for white-listing *Q35*.
>> I do understand that on some archs we need a white-list per board,
>> but I don't think x86 needs it.
>>
>>>
>>> Except for code comments, changes were generated using the
>>> following Coccinelle patch:
>>>
>>>   @@
>>>   expression DC;
>>>   @@
>>>   (
>>>   -DC->cannot_instantiate_with_device_add_yet = false;
>>>   +DC->user_creatable = true;
>>
>> Is it necessary? Isn't "creatable = true" the default?
>
> cannot_instantiate_with_device_add_yet is also false by default,
> but if there's code explicitly setting it to false somewhere, it
> is probably necessary for some reason. The script doesn't care
> what's the reason, because this is a 100% mechanical translation
> from the old logic to equivalent logic using the new field.
>

I understand.

> If you are still curious about specific cases: explicit
> cannot_instantiate_with_device_add_yet=false/user_creatable=true
> is necessary at x86_cpu_common_class_init(), because TYPE_CPU has
> cannot_instantiate_with_device_add_yet=true (most CPU types don't
> support device_add), but TYPE_X86_CPU sets it back to false
> (because x86 supports CPU hotplug).
>
>>
>>>   |
>>>   -DC->cannot_instantiate_with_device_add_yet = true;
>>>   +DC->user_creatable = false;
>>>   )
>>>
>>>   @@
>>>   typedef ObjectClass;
>>>   expression dc;
>>>   identifier class, data;
>>>   @@
>>>    static void device_class_init(ObjectClass *class, void *data)
>>>    {
>>>    ...
>>>    dc->hotpluggable = true;
>>>   +dc->user_creatable = true;
>>
>> OK... it seems risky :). Is true that "hotpluggable" => creatable,
>> but the prev rule should work, right?
>
> Note that this part is only changing device_class_init(), and no
> other function. dc->hotpluggable=true appears here by pure
> chance: it's just because this is the spot where the new
> dc->user_creatable=true line is being added.
>
> This explicit line addition is required because there's no
> explicit dc->user_creatable=false line in device_class_init
> because QOM objects are always zeroed on creation)
>

Thanks for the answers.

Reviewed-by: Marcel Apfelbaum <marcel@redhat.com>


Thanks,
Marcel

>>
>>>    ...
>>>    }
>>>
>>>   @@
>>>   @@
>>>    struct DeviceClass {
>>>    ...
>>>   -bool cannot_instantiate_with_device_add_yet;
>>>   +bool user_creatable;
>>>    ...
>>>   }
>>>
>>>   @@
>>>   expression DC;
>>>   @@
>>>   (
>>>   -!DC->cannot_instantiate_with_device_add_yet
>>>   +DC->user_creatable
>>>   |
>>>   -DC->cannot_instantiate_with_device_add_yet
>>>   +!DC->user_creatable
>>>   )
>>>
>>
>> Nice script!
>
> Thanks!
>
diff mbox

Patch

diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index b44b476765..bc4e6f0486 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -103,16 +103,16 @@  typedef struct DeviceClass {
     Property *props;
 
     /*
-     * Shall we hide this device model from -device / device_add?
+     * Can this device be instantiated with -device / device_add?
      * All devices should support instantiation with device_add, and
      * this flag should not exist.  But we're not there, yet.  Some
      * devices fail to instantiate with cryptic error messages.
      * Others instantiate, but don't work.  Exposing users to such
-     * behavior would be cruel; this flag serves to protect them.  It
-     * should never be set without a comment explaining why it is set.
-     * TODO remove once we're there
+     * behavior would be cruel; clearing this flag will protect them.
+     * It should never be cleared without a comment explaining why it
+     * is cleared.
      */
-    bool cannot_instantiate_with_device_add_yet;
+    bool user_creatable;
     /*
      * Does this device model survive object_unref(object_new(TNAME))?
      * All device models should, and this flag shouldn't exist.  Some
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index 7ac315331a..5c6e13b993 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -134,12 +134,12 @@  extern PropertyInfo qdev_prop_arraylen;
  *   device_add, so add code like this:
  *   |* Reason: pointer property "NAME-OF-YOUR-PROP" *|
  *   DeviceClass *dc = DEVICE_CLASS(class);
- *   dc->cannot_instantiate_with_device_add_yet = true;
+ *   dc->user_creatable = false;
  *
  * - If the property may safely remain null, document it like this:
  *   |*
  *    * Note: pointer property "interrupt_vector" may remain null, thus
- *    * no need for dc->cannot_instantiate_with_device_add_yet = true;
+ *    * no need for dc->user_creatable = false;
  *    *|
  */
 #define DEFINE_PROP_PTR(_n, _s, _f)             \
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index a553a7e110..f4fd5907b8 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -700,7 +700,7 @@  static void piix4_pm_class_init(ObjectClass *klass, void *data)
      * Reason: part of PIIX4 southbridge, needs to be wired up,
      * e.g. by mips_malta_init()
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     dc->hotpluggable = false;
     hc->plug = piix4_device_plug_cb;
     hc->unplug_request = piix4_device_unplug_request_cb;
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
index fe2d5a764c..324626847c 100644
--- a/hw/arm/spitz.c
+++ b/hw/arm/spitz.c
@@ -1076,7 +1076,7 @@  static void sl_nand_class_init(ObjectClass *klass, void *data)
     dc->vmsd = &vmstate_sl_nand_info;
     dc->props = sl_nand_properties;
     /* Reason: init() method uses drive_get() */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo sl_nand_info = {
diff --git a/hw/audio/marvell_88w8618.c b/hw/audio/marvell_88w8618.c
index 511b004287..4f65f8c199 100644
--- a/hw/audio/marvell_88w8618.c
+++ b/hw/audio/marvell_88w8618.c
@@ -292,7 +292,7 @@  static void mv88w8618_audio_class_init(ObjectClass *klass, void *data)
     dc->vmsd = &mv88w8618_audio_vmsd;
     dc->props = mv88w8618_audio_properties;
     /* Reason: pointer property "wm8750" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo mv88w8618_audio_info = {
diff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c
index 798002277b..9b99358d87 100644
--- a/hw/audio/pcspk.c
+++ b/hw/audio/pcspk.c
@@ -223,7 +223,7 @@  static void pcspk_class_initfn(ObjectClass *klass, void *data)
     dc->vmsd = &vmstate_spk;
     dc->props = pcspk_properties;
     /* Reason: realize sets global pcspk_state */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo pcspk_info = {
diff --git a/hw/core/or-irq.c b/hw/core/or-irq.c
index 1485d5b285..f9d76c4641 100644
--- a/hw/core/or-irq.c
+++ b/hw/core/or-irq.c
@@ -91,7 +91,7 @@  static void or_irq_class_init(ObjectClass *klass, void *data)
     dc->vmsd = &vmstate_or_irq;
 
     /* Reason: Needs to be wired up to work, e.g. see stm32f205_soc.c */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo or_irq_type_info = {
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 1e7fb33246..4132a8bee3 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -1159,6 +1159,7 @@  static void device_class_init(ObjectClass *class, void *data)
      * should override it in their class_init()
      */
     dc->hotpluggable = true;
+    dc->user_creatable = true;
 }
 
 void device_reset(DeviceState *dev)
diff --git a/hw/core/register.c b/hw/core/register.c
index dc335a79a9..da38ef3a54 100644
--- a/hw/core/register.c
+++ b/hw/core/register.c
@@ -288,7 +288,7 @@  static void register_class_init(ObjectClass *oc, void *data)
     DeviceClass *dc = DEVICE_CLASS(oc);
 
     /* Reason: needs to be wired up to work */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo register_info = {
diff --git a/hw/dma/i8257.c b/hw/dma/i8257.c
index 8bd82e8bc8..bd23e893bf 100644
--- a/hw/dma/i8257.c
+++ b/hw/dma/i8257.c
@@ -601,7 +601,7 @@  static void i8257_class_init(ObjectClass *klass, void *data)
     idc->schedule = i8257_dma_schedule;
     idc->register_channel = i8257_dma_register_channel;
     /* Reason: needs to be wired up by isa_bus_dma() to work */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo i8257_info = {
diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
index 9d545e412e..9c6bdc6295 100644
--- a/hw/dma/sparc32_dma.c
+++ b/hw/dma/sparc32_dma.c
@@ -305,7 +305,7 @@  static void sparc32_dma_class_init(ObjectClass *klass, void *data)
     dc->vmsd = &vmstate_dma;
     dc->props = sparc32_dma_properties;
     /* Reason: pointer property "iommu_opaque" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo sparc32_dma_info = {
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
index dabef4a119..1df394eb12 100644
--- a/hw/gpio/omap_gpio.c
+++ b/hw/gpio/omap_gpio.c
@@ -773,7 +773,7 @@  static void omap_gpio_class_init(ObjectClass *klass, void *data)
     dc->reset = omap_gpif_reset;
     dc->props = omap_gpio_properties;
     /* Reason: pointer property "clk" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo omap_gpio_info = {
@@ -804,7 +804,7 @@  static void omap2_gpio_class_init(ObjectClass *klass, void *data)
     dc->reset = omap2_gpif_reset;
     dc->props = omap2_gpio_properties;
     /* Reason: pointer properties "iclk", "fclk0", ..., "fclk5" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo omap2_gpio_info = {
diff --git a/hw/i2c/omap_i2c.c b/hw/i2c/omap_i2c.c
index f7c92ea00c..f6e80bee25 100644
--- a/hw/i2c/omap_i2c.c
+++ b/hw/i2c/omap_i2c.c
@@ -491,7 +491,7 @@  static void omap_i2c_class_init(ObjectClass *klass, void *data)
     dc->props = omap_i2c_properties;
     dc->reset = omap_i2c_reset;
     /* Reason: pointer properties "iclk", "fclk" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     dc->realize = omap_i2c_realize;
 }
 
diff --git a/hw/i2c/smbus_eeprom.c b/hw/i2c/smbus_eeprom.c
index 5b7bd891bc..b13ec0fe7a 100644
--- a/hw/i2c/smbus_eeprom.c
+++ b/hw/i2c/smbus_eeprom.c
@@ -123,7 +123,7 @@  static void smbus_eeprom_class_initfn(ObjectClass *klass, void *data)
     sc->read_data = eeprom_read_data;
     dc->props = smbus_eeprom_properties;
     /* Reason: pointer property "data" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo smbus_eeprom_info = {
diff --git a/hw/i2c/smbus_ich9.c b/hw/i2c/smbus_ich9.c
index 48fab22625..ea51e09186 100644
--- a/hw/i2c/smbus_ich9.c
+++ b/hw/i2c/smbus_ich9.c
@@ -103,7 +103,7 @@  static void ich9_smb_class_init(ObjectClass *klass, void *data)
      * Reason: part of ICH9 southbridge, needs to be wired up by
      * pc_q35_init()
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 I2CBus *ich9_smb_init(PCIBus *bus, int devfn, uint32_t smb_io_base)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index d24388e05f..610050eb4f 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -597,7 +597,7 @@  static void port92_class_initfn(ObjectClass *klass, void *data)
      * wiring: its A20 output line needs to be wired up by
      * port92_init().
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo port92_info = {
diff --git a/hw/input/vmmouse.c b/hw/input/vmmouse.c
index 6d15a887c6..4747da9a8d 100644
--- a/hw/input/vmmouse.c
+++ b/hw/input/vmmouse.c
@@ -286,7 +286,7 @@  static void vmmouse_class_initfn(ObjectClass *klass, void *data)
     dc->vmsd = &vmstate_vmmouse;
     dc->props = vmmouse_properties;
     /* Reason: pointer property "ps2_mouse" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo vmmouse_info = {
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index c3829e31b5..1ef56f8d10 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -501,7 +501,7 @@  static void apic_common_class_init(ObjectClass *klass, void *data)
      * Reason: APIC and CPU need to be wired up by
      * x86_cpu_apic_create()
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo apic_common_type = {
diff --git a/hw/intc/etraxfs_pic.c b/hw/intc/etraxfs_pic.c
index 64a6f4b4ba..1bfde2f09e 100644
--- a/hw/intc/etraxfs_pic.c
+++ b/hw/intc/etraxfs_pic.c
@@ -173,7 +173,7 @@  static void etraxfs_pic_class_init(ObjectClass *klass, void *data)
     dc->props = etraxfs_pic_properties;
     /*
      * Note: pointer property "interrupt_vector" may remain null, thus
-     * no need for dc->cannot_instantiate_with_device_add_yet = true;
+     * no need for dc->user_creatable = false;
      */
 }
 
diff --git a/hw/intc/grlib_irqmp.c b/hw/intc/grlib_irqmp.c
index ac7e63f38b..94659ee256 100644
--- a/hw/intc/grlib_irqmp.c
+++ b/hw/intc/grlib_irqmp.c
@@ -360,7 +360,7 @@  static void grlib_irqmp_class_init(ObjectClass *klass, void *data)
     dc->reset = grlib_irqmp_reset;
     dc->props = grlib_irqmp_properties;
     /* Reason: pointer properties "set_pil_in", "set_pil_in_opaque" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     dc->realize = grlib_irqmp_realize;
 }
 
diff --git a/hw/intc/i8259_common.c b/hw/intc/i8259_common.c
index d9a5e8b217..c2fd563b5b 100644
--- a/hw/intc/i8259_common.c
+++ b/hw/intc/i8259_common.c
@@ -144,7 +144,7 @@  static void pic_common_class_init(ObjectClass *klass, void *data)
      * wiring of the slave to the master is hard-coded in device model
      * code.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo pic_common_type = {
diff --git a/hw/intc/nios2_iic.c b/hw/intc/nios2_iic.c
index 190b6fdbf3..016426f964 100644
--- a/hw/intc/nios2_iic.c
+++ b/hw/intc/nios2_iic.c
@@ -80,7 +80,7 @@  static void altera_iic_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     /* Reason: needs to be wired up, e.g. by nios2_10m50_ghrd_init() */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     dc->realize = altera_iic_realize;
 }
 
diff --git a/hw/intc/omap_intc.c b/hw/intc/omap_intc.c
index 877be67971..ccdda89dab 100644
--- a/hw/intc/omap_intc.c
+++ b/hw/intc/omap_intc.c
@@ -401,7 +401,7 @@  static void omap_intc_class_init(ObjectClass *klass, void *data)
     dc->reset = omap_inth_reset;
     dc->props = omap_intc_properties;
     /* Reason: pointer property "clk" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     dc->realize = omap_intc_realize;
 }
 
@@ -656,7 +656,7 @@  static void omap2_intc_class_init(ObjectClass *klass, void *data)
     dc->reset = omap_inth_reset;
     dc->props = omap2_intc_properties;
     /* Reason: pointer property "iclk", "fclk" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     dc->realize = omap2_intc_realize;
 }
 
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index 59930dd9d0..cdc854a822 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -810,7 +810,7 @@  static void ich9_lpc_class_init(ObjectClass *klass, void *data)
      * Reason: part of ICH9 southbridge, needs to be wired up by
      * pc_q35_init()
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     hc->plug = ich9_pm_device_plug_cb;
     hc->unplug_request = ich9_pm_device_unplug_request_cb;
     hc->unplug = ich9_pm_device_unplug_cb;
diff --git a/hw/isa/piix4.c b/hw/isa/piix4.c
index 5500fcc4d6..f811eba59d 100644
--- a/hw/isa/piix4.c
+++ b/hw/isa/piix4.c
@@ -123,7 +123,7 @@  static void piix4_class_init(ObjectClass *klass, void *data)
      * Reason: part of PIIX4 southbridge, needs to be wired up,
      * e.g. by mips_malta_init()
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     dc->hotpluggable = false;
 }
 
diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c
index 41d5254f8e..50dc83df77 100644
--- a/hw/isa/vt82c686.c
+++ b/hw/isa/vt82c686.c
@@ -494,7 +494,7 @@  static void via_class_init(ObjectClass *klass, void *data)
      * Reason: part of VIA VT82C686 southbridge, needs to be wired up,
      * e.g. by mips_fulong2e_init()
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo via_info = {
diff --git a/hw/mips/gt64xxx_pci.c b/hw/mips/gt64xxx_pci.c
index 4811843ab6..e8b2eef688 100644
--- a/hw/mips/gt64xxx_pci.c
+++ b/hw/mips/gt64xxx_pci.c
@@ -1224,7 +1224,7 @@  static void gt64120_pci_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo gt64120_pci_info = {
diff --git a/hw/misc/vmport.c b/hw/misc/vmport.c
index be40930b8b..165500223f 100644
--- a/hw/misc/vmport.c
+++ b/hw/misc/vmport.c
@@ -163,7 +163,7 @@  static void vmport_class_initfn(ObjectClass *klass, void *data)
 
     dc->realize = vmport_realizefn;
     /* Reason: realize sets global port_state */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo vmport_info = {
diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index efa33ad40a..b53fcaa8bc 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -934,7 +934,7 @@  static void dp8393x_class_init(ObjectClass *klass, void *data)
     dc->vmsd = &vmstate_dp8393x;
     dc->props = dp8393x_properties;
     /* Reason: dma_mr property can't be set */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo dp8393x_info = {
diff --git a/hw/net/etraxfs_eth.c b/hw/net/etraxfs_eth.c
index efaa49faae..013c8d0a41 100644
--- a/hw/net/etraxfs_eth.c
+++ b/hw/net/etraxfs_eth.c
@@ -630,7 +630,7 @@  static void etraxfs_eth_class_init(ObjectClass *klass, void *data)
     k->init = fs_eth_init;
     dc->props = etraxfs_eth_properties;
     /* Reason: pointer properties "dma_out", "dma_in" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo etraxfs_eth_info = {
diff --git a/hw/net/lance.c b/hw/net/lance.c
index 573d724bcf..92b0c68274 100644
--- a/hw/net/lance.c
+++ b/hw/net/lance.c
@@ -165,7 +165,7 @@  static void lance_class_init(ObjectClass *klass, void *data)
     dc->vmsd = &vmstate_lance;
     dc->props = lance_properties;
     /* Reason: pointer property "dma" */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo lance_info = {
diff --git a/hw/pci-bridge/dec.c b/hw/pci-bridge/dec.c
index 840c96198a..cca93620ac 100644
--- a/hw/pci-bridge/dec.c
+++ b/hw/pci-bridge/dec.c
@@ -128,7 +128,7 @@  static void dec_21154_pci_host_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo dec_21154_pci_host_info = {
diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
index 6ac187fa32..ff59abf208 100644
--- a/hw/pci-bridge/pci_expander_bridge.c
+++ b/hw/pci-bridge/pci_expander_bridge.c
@@ -150,7 +150,7 @@  static void pxb_host_class_init(ObjectClass *class, void *data)
 
     dc->fw_name = "pci";
     /* Reason: Internal part of the pxb/pxb-pcie device, not usable by itself */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     sbc->explicit_ofw_unit_address = pxb_host_ofw_unit_address;
     hc->root_bus_path = pxb_host_root_bus_path;
 }
diff --git a/hw/pci-host/apb.c b/hw/pci-host/apb.c
index 653e711121..edc88f4c65 100644
--- a/hw/pci-host/apb.c
+++ b/hw/pci-host/apb.c
@@ -810,7 +810,7 @@  static void pbm_pci_host_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo pbm_pci_host_info = {
diff --git a/hw/pci-host/bonito.c b/hw/pci-host/bonito.c
index 1999ece590..85a3bb0dd2 100644
--- a/hw/pci-host/bonito.c
+++ b/hw/pci-host/bonito.c
@@ -825,7 +825,7 @@  static void bonito_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo bonito_info = {
diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
index 66055ee5cc..e2629ce70d 100644
--- a/hw/pci-host/gpex.c
+++ b/hw/pci-host/gpex.c
@@ -136,7 +136,7 @@  static void gpex_root_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo gpex_root_info = {
diff --git a/hw/pci-host/grackle.c b/hw/pci-host/grackle.c
index 2c8acdaaca..2e281f6155 100644
--- a/hw/pci-host/grackle.c
+++ b/hw/pci-host/grackle.c
@@ -134,7 +134,7 @@  static void grackle_pci_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo grackle_pci_info = {
diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
index f9218aa952..81f3a9e211 100644
--- a/hw/pci-host/piix.c
+++ b/hw/pci-host/piix.c
@@ -691,7 +691,7 @@  static void pci_piix3_class_init(ObjectClass *klass, void *data)
      * Reason: part of PIIX3 southbridge, needs to be wired up by
      * pc_piix.c's pc_init1()
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo piix3_pci_type_info = {
@@ -745,7 +745,7 @@  static void i440fx_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     dc->hotpluggable   = false;
 }
 
@@ -874,7 +874,7 @@  static void i440fx_pcihost_class_init(ObjectClass *klass, void *data)
     dc->fw_name = "pci";
     dc->props = i440fx_props;
     /* Reason: needs to be wired up by pc_init1 */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo i440fx_pcihost_info = {
diff --git a/hw/pci-host/ppce500.c b/hw/pci-host/ppce500.c
index e502bc0505..becc0eeb76 100644
--- a/hw/pci-host/ppce500.c
+++ b/hw/pci-host/ppce500.c
@@ -508,7 +508,7 @@  static void e500_host_bridge_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo e500_host_bridge_info = {
diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
index 260a119a9e..900a6edfcf 100644
--- a/hw/pci-host/prep.c
+++ b/hw/pci-host/prep.c
@@ -364,7 +364,7 @@  static void raven_class_init(ObjectClass *klass, void *data)
      * Reason: PCI-facing part of the host bridge, not usable without
      * the host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo raven_info = {
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index 344f77b10c..cd5c49616e 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -156,7 +156,7 @@  static void q35_host_class_init(ObjectClass *klass, void *data)
     dc->realize = q35_host_realize;
     dc->props = mch_props;
     /* Reason: needs to be wired up by pc_q35_init */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     dc->fw_name = "pci";
 }
@@ -549,7 +549,7 @@  static void mch_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo mch_info = {
diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c
index df342ac3cb..6cf5e59f86 100644
--- a/hw/pci-host/uninorth.c
+++ b/hw/pci-host/uninorth.c
@@ -366,7 +366,7 @@  static void unin_main_pci_host_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo unin_main_pci_host_info = {
@@ -390,7 +390,7 @@  static void u3_agp_pci_host_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo u3_agp_pci_host_info = {
@@ -414,7 +414,7 @@  static void unin_agp_pci_host_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo unin_agp_pci_host_info = {
@@ -438,7 +438,7 @@  static void unin_internal_pci_host_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo unin_internal_pci_host_info = {
diff --git a/hw/pci-host/versatile.c b/hw/pci-host/versatile.c
index 467cbb9cb8..cc51fc87a3 100644
--- a/hw/pci-host/versatile.c
+++ b/hw/pci-host/versatile.c
@@ -479,7 +479,7 @@  static void versatile_pci_host_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo versatile_pci_host_info = {
diff --git a/hw/pci-host/xilinx-pcie.c b/hw/pci-host/xilinx-pcie.c
index 8b71e2d950..a968cea2af 100644
--- a/hw/pci-host/xilinx-pcie.c
+++ b/hw/pci-host/xilinx-pcie.c
@@ -309,7 +309,7 @@  static void xilinx_pcie_root_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo xilinx_pcie_root_info = {
diff --git a/hw/ppc/ppc4xx_pci.c b/hw/ppc/ppc4xx_pci.c
index dc19682970..6953f8b9ac 100644
--- a/hw/ppc/ppc4xx_pci.c
+++ b/hw/ppc/ppc4xx_pci.c
@@ -351,7 +351,7 @@  static void ppc4xx_host_bridge_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo ppc4xx_host_bridge_info = {
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index a1cdc875b1..9fa5545991 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -675,7 +675,7 @@  static void spapr_dr_connector_class_init(ObjectClass *k, void *data)
     /*
      * Reason: it crashes FIXME find and document the real reason
      */
-    dk->cannot_instantiate_with_device_add_yet = true;
+    dk->user_creatable = false;
 }
 
 static const TypeInfo spapr_dr_connector_info = {
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 69b0291e8a..1ec30c45ce 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -867,7 +867,7 @@  static void s390_pcihost_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
 
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
     dc->reset = s390_pcihost_reset;
     k->init = s390_pcihost_init;
     hc->plug = s390_pcihost_hot_plug;
diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
index 1f2f0ed44a..4008c81002 100644
--- a/hw/sd/milkymist-memcard.c
+++ b/hw/sd/milkymist-memcard.c
@@ -299,7 +299,7 @@  static void milkymist_memcard_class_init(ObjectClass *klass, void *data)
     dc->reset = milkymist_memcard_reset;
     dc->vmsd = &vmstate_milkymist_memcard;
     /* Reason: init() method uses drive_get_next() */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo milkymist_memcard_info = {
diff --git a/hw/sd/pl181.c b/hw/sd/pl181.c
index 82c63a4fb5..55c8098ecd 100644
--- a/hw/sd/pl181.c
+++ b/hw/sd/pl181.c
@@ -515,7 +515,7 @@  static void pl181_class_init(ObjectClass *klass, void *data)
     k->vmsd = &vmstate_pl181;
     k->reset = pl181_reset;
     /* Reason: init() method uses drive_get_next() */
-    k->cannot_instantiate_with_device_add_yet = true;
+    k->user_creatable = false;
     k->realize = pl181_realize;
 }
 
diff --git a/hw/sh4/sh_pci.c b/hw/sh4/sh_pci.c
index 1747628f3d..38395c082b 100644
--- a/hw/sh4/sh_pci.c
+++ b/hw/sh4/sh_pci.c
@@ -171,7 +171,7 @@  static void sh_pci_host_class_init(ObjectClass *klass, void *data)
      * PCI-facing part of the host bridge, not usable without the
      * host-facing part, which can't be device_add'ed, yet.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo sh_pci_host_info = {
diff --git a/hw/timer/i8254_common.c b/hw/timer/i8254_common.c
index e18299a482..976d5200f1 100644
--- a/hw/timer/i8254_common.c
+++ b/hw/timer/i8254_common.c
@@ -287,7 +287,7 @@  static void pit_common_class_init(ObjectClass *klass, void *data)
      * wired to the HPET, and because of that, some wiring is always
      * done by board code.
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo pit_common_type = {
diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c
index 4165450250..93de3e1cc5 100644
--- a/hw/timer/mc146818rtc.c
+++ b/hw/timer/mc146818rtc.c
@@ -973,7 +973,7 @@  static void rtc_class_initfn(ObjectClass *klass, void *data)
     dc->vmsd = &vmstate_rtc;
     dc->props = mc146818rtc_properties;
     /* Reason: needs to be wired up by rtc_init() */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static void rtc_finalize(Object *obj)
diff --git a/monitor.c b/monitor.c
index be282ecb80..e06edec2bd 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3156,7 +3156,7 @@  void device_add_completion(ReadLineState *rs, int nb_args, const char *str)
                                              TYPE_DEVICE);
         name = object_class_get_name(OBJECT_CLASS(dc));
 
-        if (!dc->cannot_instantiate_with_device_add_yet
+        if (dc->user_creatable
             && !strncmp(name, str, len)) {
             readline_add_completion(rs, name);
         }
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 5f2fcdfc45..e4c180c6bc 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -113,7 +113,7 @@  static void qdev_print_devinfo(DeviceClass *dc)
     if (dc->desc) {
         error_printf(", desc \"%s\"", dc->desc);
     }
-    if (dc->cannot_instantiate_with_device_add_yet) {
+    if (!dc->user_creatable) {
         error_printf(", no-user");
     }
     error_printf("\n");
@@ -155,7 +155,7 @@  static void qdev_print_devinfos(bool show_no_user)
                  ? !test_bit(i, dc->categories)
                  : !bitmap_empty(dc->categories, DEVICE_CATEGORY_MAX))
                 || (!show_no_user
-                    && dc->cannot_instantiate_with_device_add_yet)) {
+                    && !dc->user_creatable)) {
                 continue;
             }
             if (!cat_printed) {
@@ -240,7 +240,7 @@  static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
     }
 
     dc = DEVICE_CLASS(oc);
-    if (dc->cannot_instantiate_with_device_add_yet ||
+    if (!dc->user_creatable ||
         (qdev_hotplug && !dc->hotpluggable)) {
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "driver",
                    "pluggable device type");
diff --git a/qom/cpu.c b/qom/cpu.c
index f02e9c0fae..73ae140d7e 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -449,7 +449,7 @@  static void cpu_class_init(ObjectClass *klass, void *data)
      * Reason: CPUs still need special care by board code: wiring up
      * IRQs, adding reset handlers, halting non-first CPUs, ...
      */
-    dc->cannot_instantiate_with_device_add_yet = true;
+    dc->user_creatable = false;
 }
 
 static const TypeInfo cpu_type_info = {
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 13c0985f11..4b3bfb3802 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -4066,7 +4066,7 @@  static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
     cc->cpu_exec_enter = x86_cpu_exec_enter;
     cc->cpu_exec_exit = x86_cpu_exec_exit;
 
-    dc->cannot_instantiate_with_device_add_yet = false;
+    dc->user_creatable = true;
 }
 
 static const TypeInfo x86_cpu_type_info = {