All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eduardo Habkost <ehabkost@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Daniel P. Berrange" <berrange@redhat.com>,
	"John Snow" <jsnow@redhat.com>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Igor Mammedov" <imammedo@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>
Subject: [PATCH 22/36] qdev: Make qdev_prop_allow_set() a property allow_set callback
Date: Thu, 29 Oct 2020 18:02:32 -0400	[thread overview]
Message-ID: <20201029220246.472693-23-ehabkost@redhat.com> (raw)
In-Reply-To: <20201029220246.472693-1-ehabkost@redhat.com>

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>
---
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-prop-internal.h |  4 +++-
 include/hw/qdev-core.h       | 10 ++++++++++
 include/hw/qdev-properties.h | 10 ++++++++--
 hw/core/qdev-properties.c    | 36 ++++++++++++++++++++++--------------
 4 files changed, 43 insertions(+), 17 deletions(-)

diff --git a/hw/core/qdev-prop-internal.h b/hw/core/qdev-prop-internal.h
index 858f844504..49bf557fd5 100644
--- a/hw/core/qdev-prop-internal.h
+++ b/hw/core/qdev-prop-internal.h
@@ -31,11 +31,13 @@ void qdev_propinfo_get_size32(Object *obj, Visitor *v, const char *name,
  * object_property_add_static: Add a static property to an object instance
  * @obj: object instance
  * @prop: property definition
+ * @allow_set: optional check function
  *
  * This function should not be used in new code.  Please add class properties
  * instead, using object_class_add_static_props().
  */
 ObjectProperty *
-object_property_add_static(Object *obj, Property *prop);
+object_property_add_static(Object *obj, Property *prop,
+                           ObjectPropertyAllowSet allow_set);
 
 #endif
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index aea49355fa..e69d19d06b 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -765,6 +765,16 @@ void qdev_machine_init(void);
  */
 void device_legacy_reset(DeviceState *dev);
 
+/**
+ * device_class_set_props: Add class properties from #Property array
+ *
+ * @dc: Device class
+ * @props: array of device properties, terminated by DEFINE_PROP_END_OF_LIST
+ *
+ * Add class properties from the array at @props.
+ * Properties added using this function will be settable only
+ * before the device is realized.
+ */
 void device_class_set_props(DeviceClass *dc, Property *props);
 
 /**
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index c94301c349..0acc92ae2b 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -279,25 +279,31 @@ extern const PropertyInfo qdev_prop_pcie_link_width;
  * object_class_property_add_static: Add a static property to object class
  * @oc: object class
  * @prop: property definition
+ * @allow_set: optional check function
  *
  * Add a property to an object class based on the property definition
  * at @prop.
  *
+ * If @allow_set is NULL, the property will always be allowed to be set.
+ *
  * The property definition at @prop should be defined using the
  * ``DEFINE_PROP`` family of macros.  *@prop must exist for the
  * life time of @oc.
  */
 ObjectProperty *
-object_class_property_add_static(ObjectClass *oc, Property *prop);
+object_class_property_add_static(ObjectClass *oc, Property *prop,
+                                 ObjectPropertyAllowSet allow_set);
 
 /**
  * object_class_add_static_props: Add multiple static properties to object class
  * @oc: object class
  * @props: property definition array, terminated by DEFINED_PROP_END_OF_LIST()
+ * @allow_set: optional check function
  *
  * Add properties from @props using object_class_property_add_static()
  */
-void object_class_add_static_props(ObjectClass *oc, Property *props);
+void object_class_add_static_props(ObjectClass *oc, Property *props,
+                                   ObjectPropertyAllowSet allow_set);
 
 /*
  * Set properties between creation and realization.
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 4fec9cb73b..4cb8baa6a0 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -26,13 +26,13 @@ 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,
+static bool qdev_prop_allow_set(Object *obj, ObjectProperty *op,
                                 Error **errp)
 {
     DeviceState *dev = DEVICE(obj);
 
     if (dev->realized) {
-        qdev_prop_set_after_realize(dev, name, errp);
+        qdev_prop_set_after_realize(dev, op->name, errp);
         return false;
     }
     return true;
@@ -80,10 +80,6 @@ static void static_prop_set(Object *obj, Visitor *v, const char *name,
 {
     Property *prop = opaque;
 
-    if (!qdev_prop_allow_set(obj, name, errp)) {
-        return;
-    }
-
     return prop->info->set(obj, v, name, opaque, errp);
 }
 
@@ -631,7 +627,9 @@ static void object_property_add_array_element(Object *obj,
                                               Property *array_len_prop,
                                               ArrayElementProperty *prop)
 {
-    ObjectProperty *op = object_property_add_static(obj, &prop->prop);
+    ObjectProperty *array_op = object_property_find(obj, array_len_prop->name);
+    ObjectProperty *op = object_property_add_static(obj, &prop->prop,
+                                                    array_op->allow_set);
 
     assert((void *)prop == (void *)&prop->prop);
     prop->release = op->release;
@@ -894,9 +892,13 @@ const PropertyInfo qdev_prop_size = {
 
 static ObjectProperty *create_link_property(ObjectClass *oc, Property *prop)
 {
+    /*
+     * NOTE: object_property_allow_set_link is unconditional, but
+     *       ObjectProperty.allow_set may be set for the property too.
+     */
     return object_class_property_add_link(oc, prop->name, prop->link_type,
                                           prop->offset,
-                                          qdev_prop_allow_set_link_before_realize,
+                                          object_property_allow_set_link,
                                           OBJ_PROP_LINK_STRONG);
 }
 
@@ -906,7 +908,8 @@ const PropertyInfo qdev_prop_link = {
 };
 
 ObjectProperty *
-object_property_add_static(Object *obj, Property *prop)
+object_property_add_static(Object *obj, Property *prop,
+                           ObjectPropertyAllowSet allow_set)
 {
     ObjectProperty *op;
 
@@ -928,11 +931,13 @@ object_property_add_static(Object *obj, Property *prop)
         }
     }
 
+    op->allow_set = allow_set;
     return op;
 }
 
 ObjectProperty *
-object_class_property_add_static(ObjectClass *oc, Property *prop)
+object_class_property_add_static(ObjectClass *oc, Property *prop,
+                                 ObjectPropertyAllowSet allow_set)
 {
     ObjectProperty *op;
 
@@ -953,21 +958,24 @@ object_class_property_add_static(ObjectClass *oc, Property *prop)
         object_class_property_set_description(oc, prop->name,
                                             prop->info->description);
     }
+
+    op->allow_set = allow_set;
     return op;
 }
 
-void object_class_add_static_props(ObjectClass *oc, Property *props)
+void object_class_add_static_props(ObjectClass *oc, Property *props,
+                                   ObjectPropertyAllowSet allow_set)
 {
     Property *prop;
 
     for (prop = props; prop && prop->name; prop++) {
-        object_class_property_add_static(oc, prop);
+        object_class_property_add_static(oc, prop, allow_set);
     }
 }
 
 void qdev_property_add_static(DeviceState *dev, Property *prop)
 {
-    object_property_add_static(OBJECT(dev), prop);
+    object_property_add_static(OBJECT(dev), prop, qdev_prop_allow_set);
 }
 
 /**
@@ -1027,7 +1035,7 @@ void device_class_set_props(DeviceClass *dc, Property *props)
 {
     dc->props_ = props;
     qdev_class_add_legacy_properties(dc, props);
-    object_class_add_static_props(OBJECT_CLASS(dc), props);
+    object_class_add_static_props(OBJECT_CLASS(dc), props, qdev_prop_allow_set);
 }
 
 void qdev_alias_all_properties(DeviceState *target, Object *source)
-- 
2.28.0



  parent reply	other threads:[~2020-10-29 22:15 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-29 22:02 [PATCH 00/36] Make qdev static property API usable by any QOM type Eduardo Habkost
2020-10-29 22:02 ` [PATCH 01/36] cs4231: Get rid of empty property array Eduardo Habkost
2020-10-30  7:42   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 02/36] cpu: Move cpu_common_props to hw/core/cpu.c Eduardo Habkost
2020-10-30  7:42   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 03/36] qdev: Move property code to qdev-properties.[ch] Eduardo Habkost
2020-10-30  7:42   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 04/36] qdev: Check dev->realized at set_size() Eduardo Habkost
2020-10-30  7:11   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 05/36] sparc: Check dev->realized at sparc_set_nwindows() Eduardo Habkost
2020-10-30  7:43   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 06/36] qdev: Don't use dev->id on set_size32() error message Eduardo Habkost
2020-10-30  7:42   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 07/36] qdev: Make PropertyInfo.print method get Object* argument Eduardo Habkost
2020-10-30  7:43   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 08/36] qdev: Make bit_prop_set() " Eduardo Habkost
2020-10-30  7:45   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 09/36] qdev: Make qdev_get_prop_ptr() get Object* arg Eduardo Habkost
2020-10-29 22:02   ` Eduardo Habkost
2020-10-29 22:46   ` Stefan Berger
2020-10-29 22:46     ` Stefan Berger
2020-10-30  7:29   ` Marc-André Lureau
2020-10-30  7:29     ` Marc-André Lureau
2020-10-30  7:34     ` Marc-André Lureau
2020-10-30  7:34       ` Marc-André Lureau
2020-10-30 11:35     ` --enable-xen on gitlab CI? (was Re: [PATCH 09/36] qdev: Make qdev_get_prop_ptr() get Object* arg) Eduardo Habkost
2020-10-30 11:35       ` Eduardo Habkost
2020-10-30 17:13       ` Paolo Bonzini
2020-10-30 17:13         ` Paolo Bonzini
2020-10-31 10:25         ` Thomas Huth
2020-10-31 10:25           ` Thomas Huth
2020-11-08 17:45           ` Philippe Mathieu-Daudé
2020-11-08 17:45             ` Philippe Mathieu-Daudé
2020-10-29 22:02 ` [PATCH 10/36] qdev: Make qdev_find_global_prop() get Object* argument Eduardo Habkost
2020-10-30  7:45   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 11/36] qdev: Make check_prop_still_unset() " Eduardo Habkost
2020-10-30  7:53   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 12/36] qdev: Make error_set_from_qdev_prop_error() " Eduardo Habkost
2020-10-30  8:00   ` Marc-André Lureau
2020-10-30 11:16     ` Eduardo Habkost
2020-10-29 22:02 ` [PATCH 13/36] qdev: Wrap getters and setters in separate helpers Eduardo Habkost
2020-10-30  8:06   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 14/36] qdev: Move dev->realized check to qdev_property_set() Eduardo Habkost
2020-10-29 22:02   ` Eduardo Habkost
2020-10-29 22:43   ` Stefan Berger
2020-10-29 22:43     ` Stefan Berger
2020-10-30  8:05   ` Marc-André Lureau
2020-10-30  8:05     ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 15/36] qdev: Make PropertyInfo.create return ObjectProperty* Eduardo Habkost
2020-10-30 16:52   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 16/36] qdev: Make qdev_class_add_property() more flexible Eduardo Habkost
2020-10-30  9:45   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 17/36] qdev: Separate generic and device-specific property registration Eduardo Habkost
2020-10-30  9:56   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 18/36] qdev: Avoid unnecessary DeviceState* variable at set_prop_arraylen() Eduardo Habkost
2020-10-30  9:59   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 19/36] qdev: Move array property creation/registration to separate functions Eduardo Habkost
2020-10-30 10:03   ` Marc-André Lureau
2020-10-30 10:10     ` Marc-André Lureau
2020-10-30 10:12       ` Daniel P. Berrangé
2020-10-30 11:20     ` Eduardo Habkost
2020-10-29 22:02 ` [PATCH 20/36] qdev: Reuse object_property_add_static() when adding array elements Eduardo Habkost
2020-10-30 11:37   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 21/36] qom: Add allow_set callback to ObjectProperty Eduardo Habkost
2020-10-30 16:43   ` Marc-André Lureau
2020-10-29 22:02 ` Eduardo Habkost [this message]
2020-10-30 16:42   ` [PATCH 22/36] qdev: Make qdev_prop_allow_set() a property allow_set callback Marc-André Lureau
2020-10-29 22:02 ` [PATCH 23/36] qdev: Make qdev_propinfo_get_uint16() static Eduardo Habkost
2020-10-30 16:51   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 24/36] qdev: Rename qdev_propinfo_* to object_propinfo_* Eduardo Habkost
2020-10-30 16:50   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 25/36] qdev: Rename qdev_get_prop_ptr() to object_static_prop_ptr() Eduardo Habkost
2020-10-29 22:02   ` Eduardo Habkost
2020-10-29 22:41   ` Stefan Berger
2020-10-29 22:41     ` Stefan Berger
2020-10-29 22:02 ` [PATCH 26/36] qdev: Move softmmu properties to qdev-properties-system.h Eduardo Habkost
2020-10-30 16:51   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 27/36] qdev: Reuse DEFINE_PROP in all DEFINE_PROP_* macros Eduardo Habkost
2020-10-30 16:53   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 28/36] qdev: Move core static property code to QOM Eduardo Habkost
2020-10-30 16:59   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 29/36] qdev: Move qdev_prop_tpm declaration to tpm_prop.h Eduardo Habkost
2020-10-29 22:40   ` Stefan Berger
2020-10-30 17:02   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 30/36] qdev: Rename qdev_prop_* to prop_info_* Eduardo Habkost
2020-10-30 17:02   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 31/36] qdev: Stop using error_set_from_qdev_prop_error() for UUID property Eduardo Habkost
2020-10-30 17:06   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 32/36] qdev: Move base property types to qom/property-types.c Eduardo Habkost
2020-10-31  7:38   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 33/36] tests: Use static properties at check-qom-proplist test case Eduardo Habkost
2020-10-31  7:53   ` Marc-André Lureau
2020-10-29 22:02 ` [PATCH 34/36] machine: Use DEFINE_PROP_STRING for string properties Eduardo Habkost
2020-10-30 17:10   ` Paolo Bonzini
2020-10-30 20:03     ` Eduardo Habkost
2020-10-30 20:41       ` Paolo Bonzini
2020-10-30 21:00         ` Eduardo Habkost
2020-10-29 22:02 ` [PATCH 35/36] machine: Use DEFINE_PROP_BOOL for boolean properties Eduardo Habkost
2020-10-29 22:02 ` [PATCH 36/36] qom: Include static property API reference in documentation Eduardo Habkost

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201029220246.472693-23-ehabkost@redhat.com \
    --to=ehabkost@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=philmd@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.