From: Hu Tao <hu...@cn.fujitsu.com> Add qmp command query-memdev to query for information of memory devices
Signed-off-by: Hu Tao <hu...@cn.fujitsu.com> [Use QMP visitors instead of String visitors. - Paolo] Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- numa.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ qapi-schema.json | 31 +++++++++++++++++++++++++++ qmp-commands.hx | 32 ++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+) diff --git a/numa.c b/numa.c index 4a1ba0c..159f5af 100644 --- a/numa.c +++ b/numa.c @@ -30,9 +30,12 @@ #include "qapi-visit.h" #include "qapi/opts-visitor.h" #include "qapi/dealloc-visitor.h" +#include "qapi/qmp-output-visitor.h" +#include "qapi/qmp-input-visitor.h" #include "qapi/qmp/qerror.h" #include "hw/boards.h" #include "sysemu/hostmem.h" +#include "qmp-commands.h" QemuOptsList qemu_numa_opts = { .name = "numa", @@ -281,3 +284,64 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner, addr += size; } } + +MemdevList *qmp_query_memdev(Error **errp) +{ + QmpOutputVisitor *ov = qmp_output_visitor_new(); + QmpInputVisitor *iv; + QObject *obj; + MemdevList *list = NULL, *m; + HostMemoryBackend *backend; + Error *err = NULL; + int i; + + for (i = 0; i < nb_numa_nodes; i++) { + backend = numa_info[i].node_memdev; + + m = g_malloc0(sizeof(*m)); + m->value = g_malloc0(sizeof(*m->value)); + m->value->size = object_property_get_int(OBJECT(backend), "size", + &err); + if (err) { + goto error; + } + m->value->policy = object_property_get_str(OBJECT(backend), "policy", + &err); + if (err) { + goto error; + } + object_property_get(OBJECT(backend), qmp_output_get_visitor(ov), + "host-nodes", &err); + if (err) { + goto error; + } + obj = qmp_output_get_qobject(ov); + iv = qmp_input_visitor_new(obj); + qobject_decref(obj); + + visit_type_uint16List(qmp_input_get_visitor(iv), + &m->value->host_nodes, NULL, &err); + if (err) { + qmp_input_visitor_cleanup(iv); + goto error; + } + + m->next = list; + list = m; + qmp_input_visitor_cleanup(iv); + } + + qmp_output_visitor_cleanup(ov); + return list; + +error: + while (list) { + m = list; + list = list->next; + g_free(m->value); + g_free(m); + } + qerror_report_err(err); + qmp_output_visitor_cleanup(ov); + return NULL; +} diff --git a/qapi-schema.json b/qapi-schema.json index b11b279..30d0d12 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -4576,3 +4576,34 @@ ## { 'enum': 'HostMemPolicy', 'data': [ 'default', 'preferred', 'membind', 'interleave' ] } + +## +# @Memdev: +# +# Information of memory device +# +# @size: memory device size +# +# @host-nodes: host nodes for its memory policy +# +# @policy: memory policy of memory device +# +# Since: 2.1 +## + +{ 'type': 'Memdev', + 'data': { + 'size': 'size', + 'host-nodes': ['uint16'], + 'policy': 'str' }} + +## +# @query-memdev: +# +# Returns information for all memory devices. +# +# Returns: a list of @Memdev. +# +# Since: 2.1 +## +{ 'command': 'query-memdev', 'returns': ['Memdev'] } diff --git a/qmp-commands.hx b/qmp-commands.hx index 8a0e832..903a48a 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -3498,3 +3498,35 @@ Example: } } ] } EQMP + + { + .name = "query-memdev", + .args_type = "", + .mhandler.cmd_new = qmp_marshal_input_query_memdev, + }, + +SQMP +query-memdev +------------ + +Show memory devices information. + + +Example (1): + +-> { "execute": "query-memdev" } +<- { "return": [ + { + "size": 536870912, + "host-nodes": [0, 1], + "policy": "bind" + }, + { + "size": 536870912, + "host-nodes": [2, 3], + "policy": "preferred" + } + ] + } + +EQMP -- 1.8.5.3