From: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
To: qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, richard.henderson@linaro.org,
berrange@redhat.com, eduardo@habkost.net,
Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Subject: [PATCH v2 1/2] qom/object, qdev: move globals functions to object.c
Date: Wed, 3 Jul 2024 17:41:48 -0300 [thread overview]
Message-ID: <20240703204149.1957136-2-dbarboza@ventanamicro.com> (raw)
In-Reply-To: <20240703204149.1957136-1-dbarboza@ventanamicro.com>
Next patch will add Accel globals support. This means that globals won't be
qdev exclusive logic since it'll have to deal with TYPE_ACCEL objects.
Move all globals related functions and declarations to object.c. Each
function is renamed from 'qdev_' to 'object_':
- qdev_prop_register_global() is now object_prop_register_global()
- qdev_find_global_prop() is now object_find_global_prop()
- qdev_prop_check_globals() is now object_prop_check_globals()
- qdev_prop_set_globals() is now object_prop_set_globals()
For object_prop_set_globals() an additional change was made: the function
was hardwired to be used with DeviceState, where dev->hotplugged is checked
to determine if object_apply_global_props() will receive a NULL or an
&error_fatal errp. The function now receives an Object and an errp, and
logic using dev->hotplugged is moved to its caller (device_post_init()).
Suggested-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
---
hw/core/cpu-common.c | 2 +-
hw/core/qdev-properties-system.c | 2 +-
hw/core/qdev-properties.c | 71 -----------------------------
hw/core/qdev.c | 2 +-
include/hw/qdev-core.h | 27 -----------
include/hw/qdev-properties.h | 5 --
include/qom/object.h | 34 ++++++++++++++
qom/object.c | 70 ++++++++++++++++++++++++++++
system/vl.c | 6 +--
target/i386/cpu.c | 2 +-
target/sparc/cpu.c | 2 +-
tests/unit/test-qdev-global-props.c | 4 +-
12 files changed, 114 insertions(+), 113 deletions(-)
diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
index f131cde2c0..794b18f7c5 100644
--- a/hw/core/cpu-common.c
+++ b/hw/core/cpu-common.c
@@ -182,7 +182,7 @@ static void cpu_common_parse_features(const char *typename, char *features,
prop->driver = typename;
prop->property = g_strdup(featurestr);
prop->value = g_strdup(val);
- qdev_prop_register_global(prop);
+ object_prop_register_global(prop);
} else {
error_setg(errp, "Expected key=value format, found %s.",
featurestr);
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index f13350b4fb..5d30ee6257 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -41,7 +41,7 @@ static bool check_prop_still_unset(Object *obj, const char *name,
const void *old_val, const char *new_val,
bool allow_override, Error **errp)
{
- const GlobalProperty *prop = qdev_find_global_prop(obj, name);
+ const GlobalProperty *prop = object_find_global_prop(obj, name);
if (!old_val || (!prop && allow_override)) {
return true;
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 86a583574d..9cba33c311 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -855,77 +855,6 @@ void qdev_prop_set_array(DeviceState *dev, const char *name, QList *values)
qobject_unref(values);
}
-static GPtrArray *global_props(void)
-{
- static GPtrArray *gp;
-
- if (!gp) {
- gp = g_ptr_array_new();
- }
-
- return gp;
-}
-
-void qdev_prop_register_global(GlobalProperty *prop)
-{
- g_ptr_array_add(global_props(), prop);
-}
-
-const GlobalProperty *qdev_find_global_prop(Object *obj,
- const char *name)
-{
- GPtrArray *props = global_props();
- const GlobalProperty *p;
- int i;
-
- for (i = 0; i < props->len; i++) {
- p = g_ptr_array_index(props, i);
- if (object_dynamic_cast(obj, p->driver)
- && !strcmp(p->property, name)) {
- return p;
- }
- }
- return NULL;
-}
-
-int qdev_prop_check_globals(void)
-{
- int i, ret = 0;
-
- for (i = 0; i < global_props()->len; i++) {
- GlobalProperty *prop;
- ObjectClass *oc;
- DeviceClass *dc;
-
- prop = g_ptr_array_index(global_props(), i);
- if (prop->used) {
- continue;
- }
- oc = object_class_by_name(prop->driver);
- oc = object_class_dynamic_cast(oc, TYPE_DEVICE);
- if (!oc) {
- warn_report("global %s.%s has invalid class name",
- prop->driver, prop->property);
- ret = 1;
- continue;
- }
- dc = DEVICE_CLASS(oc);
- if (!dc->hotpluggable && !prop->used) {
- warn_report("global %s.%s=%s not used",
- prop->driver, prop->property, prop->value);
- ret = 1;
- continue;
- }
- }
- return ret;
-}
-
-void qdev_prop_set_globals(DeviceState *dev)
-{
- object_apply_global_props(OBJECT(dev), global_props(),
- dev->hotplugged ? NULL : &error_fatal);
-}
-
/* --- 64bit unsigned int 'size' type --- */
static void get_size(Object *obj, Visitor *v, const char *name, void *opaque,
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index f3a996f57d..894372b776 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -673,7 +673,7 @@ static void device_post_init(Object *obj)
* precedence.
*/
object_apply_compat_props(obj);
- qdev_prop_set_globals(DEVICE(obj));
+ object_prop_set_globals(obj, DEVICE(obj)->hotplugged ? NULL : &error_fatal);
}
/* Unlink device from bus and free the structure. */
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index 5336728a23..656eb220f2 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -397,33 +397,6 @@ struct BusState {
ResettableState reset;
};
-/**
- * typedef GlobalProperty - a global property type
- *
- * @used: Set to true if property was used when initializing a device.
- * @optional: If set to true, GlobalProperty will be skipped without errors
- * if the property doesn't exist.
- *
- * An error is fatal for non-hotplugged devices, when the global is applied.
- */
-typedef struct GlobalProperty {
- const char *driver;
- const char *property;
- const char *value;
- bool used;
- bool optional;
-} GlobalProperty;
-
-static inline void
-compat_props_add(GPtrArray *arr,
- GlobalProperty props[], size_t nelem)
-{
- int i;
- for (i = 0; i < nelem; i++) {
- g_ptr_array_add(arr, (void *)&props[i]);
- }
-}
-
/*** Board API. This should go away once we have a machine config file. ***/
/**
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index 09aa04ca1e..301debfe79 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -206,11 +206,6 @@ void qdev_prop_set_array(DeviceState *dev, const char *name, QList *values);
void *object_field_prop_ptr(Object *obj, Property *prop);
-void qdev_prop_register_global(GlobalProperty *prop);
-const GlobalProperty *qdev_find_global_prop(Object *obj,
- const char *name);
-int qdev_prop_check_globals(void);
-void qdev_prop_set_globals(DeviceState *dev);
void error_set_from_qdev_prop_error(Error **errp, int ret, Object *obj,
const char *name, const char *value);
diff --git a/include/qom/object.h b/include/qom/object.h
index 13d3a655dd..72ee237776 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -695,8 +695,42 @@ Object *object_new_with_propv(const char *typename,
Error **errp,
va_list vargs);
+/**
+ * typedef GlobalProperty - a global property type
+ *
+ * @used: Set to true if property was used when initializing an object
+ * @optional: If set to true, GlobalProperty will be skipped without errors
+ * if the property doesn't exist.
+ *
+ * When used with devices: an error is fatal for non-hotplugged devices when
+ * the global is applied.
+ */
+typedef struct GlobalProperty {
+ const char *driver;
+ const char *property;
+ const char *value;
+ bool used;
+ bool optional;
+} GlobalProperty;
+
+static inline void
+compat_props_add(GPtrArray *arr,
+ GlobalProperty props[], size_t nelem)
+{
+ int i;
+ for (i = 0; i < nelem; i++) {
+ g_ptr_array_add(arr, (void *)&props[i]);
+ }
+}
+
bool object_apply_global_props(Object *obj, const GPtrArray *props,
Error **errp);
+void object_prop_set_globals(Object *obj, Error **errp);
+void object_prop_register_global(GlobalProperty *prop);
+int object_prop_check_globals(void);
+const GlobalProperty *object_find_global_prop(Object *obj,
+ const char *name);
+
void object_set_machine_compat_props(GPtrArray *compat_props);
void object_set_accelerator_compat_props(GPtrArray *compat_props);
void object_register_sugar_prop(const char *driver, const char *prop,
diff --git a/qom/object.c b/qom/object.c
index 157a45c5f8..60dbd00edd 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -472,6 +472,76 @@ bool object_apply_global_props(Object *obj, const GPtrArray *props,
return true;
}
+static GPtrArray *global_props(void)
+{
+ static GPtrArray *gp;
+
+ if (!gp) {
+ gp = g_ptr_array_new();
+ }
+
+ return gp;
+}
+
+void object_prop_register_global(GlobalProperty *prop)
+{
+ g_ptr_array_add(global_props(), prop);
+}
+
+void object_prop_set_globals(Object *obj, Error **errp)
+{
+ object_apply_global_props(obj, global_props(), errp);
+}
+
+const GlobalProperty *object_find_global_prop(Object *obj,
+ const char *name)
+{
+ GPtrArray *props = global_props();
+ const GlobalProperty *p;
+ int i;
+
+ for (i = 0; i < props->len; i++) {
+ p = g_ptr_array_index(props, i);
+ if (object_dynamic_cast(obj, p->driver)
+ && !strcmp(p->property, name)) {
+ return p;
+ }
+ }
+ return NULL;
+}
+
+int object_prop_check_globals(void)
+{
+ int i, ret = 0;
+
+ for (i = 0; i < global_props()->len; i++) {
+ GlobalProperty *prop;
+ ObjectClass *oc;
+ DeviceClass *dc;
+
+ prop = g_ptr_array_index(global_props(), i);
+ if (prop->used) {
+ continue;
+ }
+ oc = object_class_by_name(prop->driver);
+ oc = object_class_dynamic_cast(oc, TYPE_DEVICE);
+ if (!oc) {
+ warn_report("global %s.%s has invalid class name",
+ prop->driver, prop->property);
+ ret = 1;
+ continue;
+ }
+ dc = DEVICE_CLASS(oc);
+ if (!dc->hotpluggable && !prop->used) {
+ warn_report("global %s.%s=%s not used",
+ prop->driver, prop->property, prop->value);
+ ret = 1;
+ continue;
+ }
+ }
+ return ret;
+}
+
/*
* Global property defaults
* Slot 0: accelerator's global property defaults
diff --git a/system/vl.c b/system/vl.c
index bdd2f6ecf6..282668b817 100644
--- a/system/vl.c
+++ b/system/vl.c
@@ -2153,7 +2153,7 @@ static int global_init_func(void *opaque, QemuOpts *opts, Error **errp)
g->driver = qemu_opt_get(opts, "driver");
g->property = qemu_opt_get(opts, "property");
g->value = qemu_opt_get(opts, "value");
- qdev_prop_register_global(g);
+ object_prop_register_global(g);
return 0;
}
@@ -2679,7 +2679,7 @@ static bool qemu_machine_creation_done(Error **errp)
net_check_clients();
}
- qdev_prop_check_globals();
+ object_prop_check_globals();
qdev_machine_creation_done();
@@ -3705,7 +3705,7 @@ void qemu_init(int argc, char **argv)
* Beware, QOM objects created before this point miss global and
* compat properties.
*
- * Global properties get set up by qdev_prop_register_global(),
+ * Global properties get set up by object_prop_register_global(),
* called from user_register_global_props(), and certain option
* desugaring. Also in CPU feature desugaring (buried in
* parse_cpu_option()), which happens below this point, but may
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 4c2e6f3a71..b8838467a3 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -5789,7 +5789,7 @@ static void x86_cpu_parse_featurestr(const char *typename, char *features,
prop->driver = typename;
prop->property = g_strdup(name);
prop->value = g_strdup(val);
- qdev_prop_register_global(prop);
+ object_prop_register_global(prop);
}
if (ambiguous) {
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index 9bacfb68cb..8dffa34701 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -114,7 +114,7 @@ cpu_add_feat_as_prop(const char *typename, const char *name, const char *val)
prop->driver = typename;
prop->property = g_strdup(name);
prop->value = g_strdup(val);
- qdev_prop_register_global(prop);
+ object_prop_register_global(prop);
}
/* Parse "+feature,-feature,feature=foo" CPU feature string */
diff --git a/tests/unit/test-qdev-global-props.c b/tests/unit/test-qdev-global-props.c
index c8862cac5f..00a6b887f3 100644
--- a/tests/unit/test-qdev-global-props.c
+++ b/tests/unit/test-qdev-global-props.c
@@ -96,7 +96,7 @@ static void register_global_properties(GlobalProperty *props)
int i;
for (i = 0; props[i].driver != NULL; i++) {
- qdev_prop_register_global(props + i);
+ object_prop_register_global(props + i);
}
}
@@ -235,7 +235,7 @@ static void test_dynamic_globalprop_subprocess(void)
g_assert_cmpuint(mt->prop1, ==, 101);
g_assert_cmpuint(mt->prop2, ==, 102);
- global_error = qdev_prop_check_globals();
+ global_error = object_prop_check_globals();
g_assert_cmpuint(global_error, ==, 1);
g_assert(props[0].used);
g_assert(props[1].used);
--
2.45.2
next prev parent reply other threads:[~2024-07-03 20:42 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-03 20:41 [PATCH v2 0/2] object,accel-system: allow Accel type globals Daniel Henrique Barboza
2024-07-03 20:41 ` Daniel Henrique Barboza [this message]
2024-07-26 16:42 ` [PATCH v2 1/2] qom/object, qdev: move globals functions to object.c Daniel P. Berrangé
2024-08-01 6:58 ` object_new() cannot fail, and that's fundamental (was: [PATCH v2 1/2] qom/object, qdev: move globals functions to object.c) Markus Armbruster
2024-08-01 11:56 ` Daniel P. Berrangé
2024-07-03 20:41 ` [PATCH v2 2/2] qom/object, accel-system: add support to Accel globals Daniel Henrique Barboza
2024-07-31 6:30 ` Markus Armbruster
2024-07-31 7:41 ` Andrew Jones
2024-07-31 8:42 ` Markus Armbruster
2024-08-07 9:46 ` Daniel Henrique Barboza
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=20240703204149.1957136-2-dbarboza@ventanamicro.com \
--to=dbarboza@ventanamicro.com \
--cc=berrange@redhat.com \
--cc=eduardo@habkost.net \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.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.