* [Qemu-devel] [PATCH v2 0/2] cpu: Add /machine/cpus[<index>] links
@ 2015-05-01 14:09 Eduardo Habkost
2015-05-01 14:09 ` [Qemu-devel] [PATCH v2 1/2] qom: Implement object_property_add_const_link() Eduardo Habkost
2015-05-01 14:09 ` [Qemu-devel] [PATCH v2 2/2] cpu: Register QOM links at /machine/cpus[<index>] Eduardo Habkost
0 siblings, 2 replies; 6+ messages in thread
From: Eduardo Habkost @ 2015-05-01 14:09 UTC (permalink / raw)
To: qemu-devel
Cc: peter.maydell, peter.crosthwaite, mimu, bharata, agraf,
borntraeger, Paolo Bonzini, cornelia.huck, Igor Mammedov,
Andreas Färber, david
Changes v1 -> v2:
* Implement a object_property_add_const_link() function
* Use "/machine/cpus[<index>]" instead of "/machine/cpus/<index>"
* Grab reference to object before adding link
Eduardo Habkost (2):
qom: Implement object_property_add_const_link()
cpu: Register QOM links at /machine/cpus[<index>]
exec.c | 15 +++++++++++++++
include/qom/object.h | 23 +++++++++++++++++++++++
qom/object.c | 15 +++++++++++++++
3 files changed, 53 insertions(+)
--
2.1.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 1/2] qom: Implement object_property_add_const_link()
2015-05-01 14:09 [Qemu-devel] [PATCH v2 0/2] cpu: Add /machine/cpus[<index>] links Eduardo Habkost
@ 2015-05-01 14:09 ` Eduardo Habkost
2015-05-01 18:15 ` Paolo Bonzini
2015-05-01 14:09 ` [Qemu-devel] [PATCH v2 2/2] cpu: Register QOM links at /machine/cpus[<index>] Eduardo Habkost
1 sibling, 1 reply; 6+ messages in thread
From: Eduardo Habkost @ 2015-05-01 14:09 UTC (permalink / raw)
To: qemu-devel
Cc: peter.maydell, peter.crosthwaite, mimu, bharata, agraf,
borntraeger, Paolo Bonzini, cornelia.huck, Igor Mammedov,
Andreas Färber, david
It can be used in simpler cases where a read-only property is needed.
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
include/qom/object.h | 23 +++++++++++++++++++++++
qom/object.c | 15 +++++++++++++++
2 files changed, 38 insertions(+)
diff --git a/include/qom/object.h b/include/qom/object.h
index d2d7748..78bb941 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1123,6 +1123,8 @@ void object_property_add_child(Object *obj, const char *name,
typedef enum {
/* Unref the link pointer when the property is deleted */
OBJ_PROP_LINK_UNREF_ON_RELEASE = 0x1,
+ /* Free the child pointer passed to object_property_add_link() */
+ OBJ_PROP_LINK_FREE_CHILD_POINTER = 0x2,
} ObjectPropertyLinkFlags;
/**
@@ -1162,6 +1164,8 @@ void object_property_allow_set_link(Object *, const char *,
* property is deleted with object_property_del(). If the
* <code>@flags</code> <code>OBJ_PROP_LINK_UNREF_ON_RELEASE</code> bit is set,
* the reference count is decremented when the property is deleted.
+ * If the <code>OBJ_PROP_LINK_FREE_CHILD_POINTER</code> bit is set,
+ * @child is freed when the property is deleted.
*/
void object_property_add_link(Object *obj, const char *name,
const char *type, Object **child,
@@ -1170,6 +1174,25 @@ void object_property_add_link(Object *obj, const char *name,
ObjectPropertyLinkFlags flags,
Error **errp);
+
+/**
+ * object_property_add_const_link:
+ * @obj: the object to add a property to
+ * @name: the name of the property
+ * @type: the qobj type of the link
+ * @child: pointer to the linked object
+ * @flags: additional options for the link
+ * @errp: if an error occurs, a pointer to an area to store the error
+ *
+ * Like object_property_add_link(), but adds a link property that will
+ * always point to the same object.
+ */
+void object_property_add_const_link(Object *obj, const char *name,
+ const char *type, Object *child,
+ ObjectPropertyLinkFlags flags,
+ Error **errp);
+
+
/**
* object_property_add_str:
* @obj: the object to add a property to
diff --git a/qom/object.c b/qom/object.c
index b8dff43..7d4a46d 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1227,6 +1227,9 @@ static void object_release_link_property(Object *obj, const char *name,
if ((prop->flags & OBJ_PROP_LINK_UNREF_ON_RELEASE) && *prop->child) {
object_unref(*prop->child);
}
+ if (prop->flags & OBJ_PROP_LINK_FREE_CHILD_POINTER) {
+ g_free(prop->child);
+ }
g_free(prop);
}
@@ -1266,6 +1269,18 @@ out:
g_free(full_type);
}
+void object_property_add_const_link(Object *obj, const char *name,
+ const char *type, Object *child,
+ ObjectPropertyLinkFlags flags,
+ Error **errp)
+{
+ Object **childp = g_new0(Object*, 1);
+
+ *childp = child;
+ object_property_add_link(obj, name, type, childp, NULL,
+ flags | OBJ_PROP_LINK_FREE_CHILD_POINTER, errp);
+}
+
gchar *object_get_canonical_path_component(Object *obj)
{
ObjectProperty *prop = NULL;
--
2.1.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 2/2] cpu: Register QOM links at /machine/cpus[<index>]
2015-05-01 14:09 [Qemu-devel] [PATCH v2 0/2] cpu: Add /machine/cpus[<index>] links Eduardo Habkost
2015-05-01 14:09 ` [Qemu-devel] [PATCH v2 1/2] qom: Implement object_property_add_const_link() Eduardo Habkost
@ 2015-05-01 14:09 ` Eduardo Habkost
1 sibling, 0 replies; 6+ messages in thread
From: Eduardo Habkost @ 2015-05-01 14:09 UTC (permalink / raw)
To: qemu-devel
Cc: peter.maydell, peter.crosthwaite, mimu, bharata, agraf,
borntraeger, Paolo Bonzini, cornelia.huck, Igor Mammedov,
Andreas Färber, david
This will provide a predictable path for the CPU objects, and a more
powerful alternative for the query-cpus QMP command, as now every QOM
property on CPU objects can be easily queried.
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
Changes v1 -> v2:
* Use object_property_add_const_link()
* Use "/machine/cpus[<index>]" instead of "/machine/cpus/<index>"
* Grab reference to object before adding link
Note that this doesn't replace any future topology enumeration
mechanisms we may choose to implement. It just replaces the existing
topology-unaware VCPU enumeration mechanism that is query-cpus.
References to previous discussions:
Date: Thu, 23 Apr 2015 10:17:36 -0300
From: Eduardo Habkost <ehabkost@redhat.com>
Subject: Re: [Qemu-devel] cpu modelling and hotplug (was: [PATCH RFC 0/4] target-i386: PC socket/core/thread modeling, part 1)
Message-ID: <20150423131736.GA17796@thinpad.lan.raisama.net>
Date: Tue, 31 Mar 2015 10:16:23 -0300
From: Eduardo Habkost <ehabkost@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v4 11/15] target-s390x: New QMP command query-cpu-model
Message-ID: <20150331131623.GG7031@thinpad.lan.raisama.net>
Date: Fri, 16 May 2014 12:16:41 -0300
From: Eduardo Habkost <ehabkost@redhat.com>
Subject: Re: [Qemu-devel] [RFC 0/5] Allow object-add on X86CPU subclasses, for CPU model probing
Message-ID: <20140516151641.GY3302@otherpad.lan.raisama.net>
---
exec.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/exec.c b/exec.c
index ae37b98..a68f0af 100644
--- a/exec.c
+++ b/exec.c
@@ -519,6 +519,19 @@ void tcg_cpu_address_space_init(CPUState *cpu, AddressSpace *as)
}
#endif
+static void cpu_add_qom_link(CPUState *cpu)
+{
+#if !defined(CONFIG_USER_ONLY)
+ Object *obj = OBJECT(cpu);
+ char *path = g_strdup_printf("cpus[%d]", cpu->cpu_index);
+
+ object_ref(obj);
+ object_property_add_const_link(OBJECT(current_machine), path, TYPE_CPU,
+ obj, 0, &error_abort);
+ g_free(path);
+#endif
+}
+
void cpu_exec_init(CPUArchState *env)
{
CPUState *cpu = ENV_GET_CPU(env);
@@ -558,6 +571,8 @@ void cpu_exec_init(CPUArchState *env)
if (cc->vmsd != NULL) {
vmstate_register(NULL, cpu_index, cc->vmsd, cpu);
}
+
+ cpu_add_qom_link(cpu);
}
#if defined(CONFIG_USER_ONLY)
--
2.1.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v2 1/2] qom: Implement object_property_add_const_link()
2015-05-01 14:09 ` [Qemu-devel] [PATCH v2 1/2] qom: Implement object_property_add_const_link() Eduardo Habkost
@ 2015-05-01 18:15 ` Paolo Bonzini
2015-05-05 16:06 ` Eduardo Habkost
0 siblings, 1 reply; 6+ messages in thread
From: Paolo Bonzini @ 2015-05-01 18:15 UTC (permalink / raw)
To: Eduardo Habkost, qemu-devel
Cc: peter.maydell, peter.crosthwaite, mimu, agraf, borntraeger,
bharata, cornelia.huck, Igor Mammedov, Andreas Färber, david
On 01/05/2015 16:09, Eduardo Habkost wrote:
> +void object_property_add_const_link(Object *obj, const char *name,
> + const char *type, Object *child,
> + ObjectPropertyLinkFlags flags,
> + Error **errp)
> +{
> + Object **childp = g_new0(Object*, 1);
> +
> + *childp = child;
> + object_property_add_link(obj, name, type, childp, NULL,
> + flags | OBJ_PROP_LINK_FREE_CHILD_POINTER, errp);
> +}
> +
This works, but is the extra functionality needed, compared to
an alias? Namely, when is flags going to be != 0?
FWIW, here is my ./.. patch. I'm all for adding a helper like
object_property_add_const_link on top if we go for it.
Another possibility is to not introduce any of our patches and reuse
the child<> getter and resolve functions in
object_property_add_const_link.
-------------------- 8< ---------------
>From 653ca80e93fcaa94c7fa172edbaef75457d4952d Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Tue, 31 Mar 2015 13:56:24 +0200
Subject: [PATCH] qom: add . and .. properties
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
qom/object.c | 42 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/qom/object.c b/qom/object.c
index b8dff43..3dd87b7 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1783,9 +1783,51 @@ void object_property_set_description(Object *obj, const char *name,
op->description = g_strdup(description);
}
+static void property_get_dot(Object *obj, struct Visitor *v, void *opaque,
+ const char *name, Error **errp)
+{
+ gchar *path = object_get_canonical_path(obj);
+ visit_type_str(v, &path, name, errp);
+ g_free(path);
+}
+
+static Object *property_resolve_dot(Object *obj, void *opaque,
+ const gchar *part)
+{
+ return obj;
+}
+
+static void property_get_dotdot(Object *obj, struct Visitor *v, void *opaque,
+ const char *name, Error **errp)
+{
+ if (obj->parent) {
+ gchar *path = object_get_canonical_path(obj);
+ visit_type_str(v, &path, name, errp);
+ g_free(path);
+ } else {
+ gchar *path = (gchar *)"";
+ visit_type_str(v, &path, name, errp);
+ }
+}
+
+static Object *property_resolve_dotdot(Object *obj, void *opaque,
+ const gchar *part)
+{
+ return obj->parent;
+}
+
static void object_instance_init(Object *obj)
{
+ ObjectProperty *op;
object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
+
+ op = object_property_add(obj, ".", "link<Object>", property_get_dot,
+ NULL, NULL, NULL, NULL);
+ op->resolve = property_resolve_dot;
+
+ op = object_property_add(obj, "..", "link<Object>", property_get_dotdot,
+ NULL, NULL, NULL, NULL);
+ op->resolve = property_resolve_dotdot;
}
static void register_types(void)
--
2.3.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v2 1/2] qom: Implement object_property_add_const_link()
2015-05-01 18:15 ` Paolo Bonzini
@ 2015-05-05 16:06 ` Eduardo Habkost
2015-05-05 16:21 ` Paolo Bonzini
0 siblings, 1 reply; 6+ messages in thread
From: Eduardo Habkost @ 2015-05-05 16:06 UTC (permalink / raw)
To: Paolo Bonzini
Cc: peter.maydell, peter.crosthwaite, mimu, qemu-devel, agraf,
borntraeger, bharata, cornelia.huck, Igor Mammedov,
Andreas Färber, david
On Fri, May 01, 2015 at 08:15:24PM +0200, Paolo Bonzini wrote:
> On 01/05/2015 16:09, Eduardo Habkost wrote:
> > +void object_property_add_const_link(Object *obj, const char *name,
> > + const char *type, Object *child,
> > + ObjectPropertyLinkFlags flags,
> > + Error **errp)
> > +{
> > + Object **childp = g_new0(Object*, 1);
> > +
> > + *childp = child;
> > + object_property_add_link(obj, name, type, childp, NULL,
> > + flags | OBJ_PROP_LINK_FREE_CHILD_POINTER, errp);
> > +}
> > +
>
> This works, but is the extra functionality needed, compared to
> an alias? Namely, when is flags going to be != 0?
Flags is going to be != 0 if the caller grabs a reference to the target
object (to ensure it won't disappear) and wants it to be automatically
dropped when the property is removed. It is not strictly necessary, but
I thought it could be useful.
But to be honest, I don't love the flags argument in
object_property_add_link(), either. I mean: why do we need flags in
object_property_add_link() and not in object_property_add_alias()?
>
> FWIW, here is my ./.. patch. I'm all for adding a helper like
> object_property_add_const_link on top if we go for it.
Looks good to me.
>
> Another possibility is to not introduce any of our patches and reuse
> the child<> getter and resolve functions in
> object_property_add_const_link.
Using the "." property would allow object_property_add_const_link() to
be a one-liner, so it sounds better to me.
>
> -------------------- 8< ---------------
> From 653ca80e93fcaa94c7fa172edbaef75457d4952d Mon Sep 17 00:00:00 2001
> From: Paolo Bonzini <pbonzini@redhat.com>
> Date: Tue, 31 Mar 2015 13:56:24 +0200
> Subject: [PATCH] qom: add . and .. properties
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> qom/object.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 42 insertions(+)
>
> diff --git a/qom/object.c b/qom/object.c
> index b8dff43..3dd87b7 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -1783,9 +1783,51 @@ void object_property_set_description(Object *obj, const char *name,
> op->description = g_strdup(description);
> }
>
> +static void property_get_dot(Object *obj, struct Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + gchar *path = object_get_canonical_path(obj);
> + visit_type_str(v, &path, name, errp);
> + g_free(path);
> +}
> +
> +static Object *property_resolve_dot(Object *obj, void *opaque,
> + const gchar *part)
> +{
> + return obj;
> +}
> +
> +static void property_get_dotdot(Object *obj, struct Visitor *v, void *opaque,
> + const char *name, Error **errp)
> +{
> + if (obj->parent) {
> + gchar *path = object_get_canonical_path(obj);
> + visit_type_str(v, &path, name, errp);
> + g_free(path);
> + } else {
> + gchar *path = (gchar *)"";
> + visit_type_str(v, &path, name, errp);
> + }
> +}
> +
> +static Object *property_resolve_dotdot(Object *obj, void *opaque,
> + const gchar *part)
> +{
> + return obj->parent;
> +}
> +
> static void object_instance_init(Object *obj)
> {
> + ObjectProperty *op;
> object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
> +
> + op = object_property_add(obj, ".", "link<Object>", property_get_dot,
> + NULL, NULL, NULL, NULL);
> + op->resolve = property_resolve_dot;
> +
> + op = object_property_add(obj, "..", "link<Object>", property_get_dotdot,
> + NULL, NULL, NULL, NULL);
> + op->resolve = property_resolve_dotdot;
> }
>
> static void register_types(void)
> --
> 2.3.5
>
--
Eduardo
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v2 1/2] qom: Implement object_property_add_const_link()
2015-05-05 16:06 ` Eduardo Habkost
@ 2015-05-05 16:21 ` Paolo Bonzini
0 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2015-05-05 16:21 UTC (permalink / raw)
To: Eduardo Habkost
Cc: peter.maydell, peter.crosthwaite, mimu, qemu-devel, agraf,
borntraeger, bharata, cornelia.huck, Igor Mammedov,
Andreas Färber, david
On 05/05/2015 18:06, Eduardo Habkost wrote:
> On Fri, May 01, 2015 at 08:15:24PM +0200, Paolo Bonzini wrote:
>> > On 01/05/2015 16:09, Eduardo Habkost wrote:
>>> > > +void object_property_add_const_link(Object *obj, const char *name,
>>> > > + const char *type, Object *child,
>>> > > + ObjectPropertyLinkFlags flags,
>>> > > + Error **errp)
>>> > > +{
>>> > > + Object **childp = g_new0(Object*, 1);
>>> > > +
>>> > > + *childp = child;
>>> > > + object_property_add_link(obj, name, type, childp, NULL,
>>> > > + flags | OBJ_PROP_LINK_FREE_CHILD_POINTER, errp);
>>> > > +}
>>> > > +
>> >
>> > This works, but is the extra functionality needed, compared to
>> > an alias? Namely, when is flags going to be != 0?
> Flags is going to be != 0 if the caller grabs a reference to the target
> object (to ensure it won't disappear) and wants it to be automatically
> dropped when the property is removed. It is not strictly necessary, but
> I thought it could be useful.
>
> But to be honest, I don't love the flags argument in
> object_property_add_link(), either. I mean: why do we need flags in
> object_property_add_link() and not in object_property_add_alias()?
>
>> >
>> > FWIW, here is my ./.. patch. I'm all for adding a helper like
>> > object_property_add_const_link on top if we go for it.
> Looks good to me.
>
>> >
>> > Another possibility is to not introduce any of our patches and reuse
>> > the child<> getter and resolve functions in
>> > object_property_add_const_link.
> Using the "." property would allow object_property_add_const_link() to
> be a one-liner, so it sounds better to me.
>
You don't need this function anymore though, right? So I'll just adjust
my series to use object_property_add_const_link().
Paolo
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-05-05 16:21 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-05-01 14:09 [Qemu-devel] [PATCH v2 0/2] cpu: Add /machine/cpus[<index>] links Eduardo Habkost
2015-05-01 14:09 ` [Qemu-devel] [PATCH v2 1/2] qom: Implement object_property_add_const_link() Eduardo Habkost
2015-05-01 18:15 ` Paolo Bonzini
2015-05-05 16:06 ` Eduardo Habkost
2015-05-05 16:21 ` Paolo Bonzini
2015-05-01 14:09 ` [Qemu-devel] [PATCH v2 2/2] cpu: Register QOM links at /machine/cpus[<index>] Eduardo Habkost
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).