aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Mammedov <imammedo@redhat.com>2017-01-10 13:53:15 +0100
committerEduardo Habkost <ehabkost@redhat.com>2017-01-12 15:35:06 -0200
commite1ff3c67e8544f41f1bea76ba76385faee0d2bb7 (patch)
tree098cc8b6629e0185d4b11706d44211296f0f5f23
parent3a4641054e320d8ad7e780c30010b1c1dbfc56e8 (diff)
monitor: fix qmp/hmp query-memdev not reporting IDs of memory backends
Considering 'id' is mandatory for user_creatable objects/backends and user_creatable_add_type() always has it as an argument regardless of where from it is called CLI/monitor or QMP, Fix issue by adding 'id' property to hostmem backends and set it in user_creatable_add_type() for every object that implements 'id' property. Then later at query-memdev time get 'id' from object directly. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Message-Id: <1484052795-158195-4-git-send-email-imammedo@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
-rw-r--r--backends/hostmem.c26
-rw-r--r--docs/qmp-commands.txt1
-rw-r--r--hmp.c5
-rw-r--r--include/sysemu/hostmem.h1
-rw-r--r--numa.c3
-rw-r--r--qapi-schema.json3
-rw-r--r--qom/object_interfaces.c6
7 files changed, 41 insertions, 4 deletions
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 4256d24acb..7f5de70609 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -348,6 +348,24 @@ host_memory_backend_can_be_deleted(UserCreatable *uc, Error **errp)
}
}
+static char *get_id(Object *o, Error **errp)
+{
+ HostMemoryBackend *backend = MEMORY_BACKEND(o);
+
+ return g_strdup(backend->id);
+}
+
+static void set_id(Object *o, const char *str, Error **errp)
+{
+ HostMemoryBackend *backend = MEMORY_BACKEND(o);
+
+ if (backend->id) {
+ error_setg(errp, "cannot change property value");
+ return;
+ }
+ backend->id = g_strdup(str);
+}
+
static void
host_memory_backend_class_init(ObjectClass *oc, void *data)
{
@@ -377,6 +395,13 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
HostMemPolicy_lookup,
host_memory_backend_get_policy,
host_memory_backend_set_policy, &error_abort);
+ object_class_property_add_str(oc, "id", get_id, set_id, &error_abort);
+}
+
+static void host_memory_backend_finalize(Object *o)
+{
+ HostMemoryBackend *backend = MEMORY_BACKEND(o);
+ g_free(backend->id);
}
static const TypeInfo host_memory_backend_info = {
@@ -387,6 +412,7 @@ static const TypeInfo host_memory_backend_info = {
.class_init = host_memory_backend_class_init,
.instance_size = sizeof(HostMemoryBackend),
.instance_init = host_memory_backend_init,
+ .instance_finalize = host_memory_backend_finalize,
.interfaces = (InterfaceInfo[]) {
{ TYPE_USER_CREATABLE },
{ }
diff --git a/docs/qmp-commands.txt b/docs/qmp-commands.txt
index abf210a596..18db4cdb82 100644
--- a/docs/qmp-commands.txt
+++ b/docs/qmp-commands.txt
@@ -3529,6 +3529,7 @@ Example (1):
"policy": "bind"
},
{
+ "id": "mem1",
"size": 536870912,
"merge": false,
"dump": true,
diff --git a/hmp.c b/hmp.c
index e7bead5a1d..8522efea26 100644
--- a/hmp.c
+++ b/hmp.c
@@ -2078,13 +2078,11 @@ void hmp_info_memdev(Monitor *mon, const QDict *qdict)
MemdevList *m = memdev_list;
Visitor *v;
char *str;
- int i = 0;
-
while (m) {
v = string_output_visitor_new(false, &str);
visit_type_uint16List(v, NULL, &m->value->host_nodes, NULL);
- monitor_printf(mon, "memory backend: %d\n", i);
+ monitor_printf(mon, "memory backend: %s\n", m->value->id);
monitor_printf(mon, " size: %" PRId64 "\n", m->value->size);
monitor_printf(mon, " merge: %s\n",
m->value->merge ? "true" : "false");
@@ -2100,7 +2098,6 @@ void hmp_info_memdev(Monitor *mon, const QDict *qdict)
g_free(str);
visit_free(v);
m = m->next;
- i++;
}
monitor_printf(mon, "\n");
diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index 678232af40..ecae0cff19 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -52,6 +52,7 @@ struct HostMemoryBackend {
Object parent;
/* protected */
+ char *id;
uint64_t size;
bool merge, dump;
bool prealloc, force_prealloc, is_mapped;
diff --git a/numa.c b/numa.c
index 9c09e45e7d..f5fc7da3e9 100644
--- a/numa.c
+++ b/numa.c
@@ -518,6 +518,9 @@ static int query_memdev(Object *obj, void *opaque)
m->value = g_malloc0(sizeof(*m->value));
+ m->value->id = object_property_get_str(obj, "id", NULL);
+ m->value->has_id = !!m->value->id;
+
m->value->size = object_property_get_int(obj, "size",
&error_abort);
m->value->merge = object_property_get_bool(obj, "merge",
diff --git a/qapi-schema.json b/qapi-schema.json
index eab8d4a9ee..e42998edec 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -4457,6 +4457,8 @@
#
# Information about memory backend
#
+# @id: #optional backend's ID if backend has 'id' property (since 2.9)
+#
# @size: memory backend size
#
# @merge: enables or disables memory merge support
@@ -4473,6 +4475,7 @@
##
{ 'struct': 'Memdev',
'data': {
+ '*id': 'str',
'size': 'size',
'merge': 'bool',
'dump': 'bool',
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 9b4155a227..03a95c3276 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -62,6 +62,12 @@ Object *user_creatable_add_type(const char *type, const char *id,
assert(qdict);
obj = object_new(type);
+ if (object_property_find(obj, "id", NULL)) {
+ object_property_set_str(obj, id, "id", &local_err);
+ if (local_err) {
+ goto out;
+ }
+ }
visit_start_struct(v, NULL, NULL, 0, &local_err);
if (local_err) {
goto out;