On Wed, 4 Sep 2013 17:03:41 +0800 Wanlong Gao <gaowanl...@cn.fujitsu.com> wrote:
> Add qmp command query-numa to show guest NUMA information. > > Signed-off-by: Wanlong Gao <gaowanl...@cn.fujitsu.com> > --- > numa.c | 65 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > qapi-schema.json | 36 +++++++++++++++++++++++++++++++ > qmp-commands.hx | 49 ++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 150 insertions(+) > > diff --git a/numa.c b/numa.c > index 19ee7f7..d0e3ebc 100644 > --- a/numa.c > +++ b/numa.c > @@ -393,3 +393,68 @@ error: > numa_info[nodeid].relative = old_relative; > return; > } > + > +NUMAInfoList *qmp_query_numa(Error **errp) > +{ > + NUMAInfoList *head = NULL, *cur_item = NULL; > + CPUState *cpu; > + int i; > + > + for (i = 0; i < nb_numa_nodes; i++) { > + NUMAInfoList *info; > + uint16List *cur_cpu_item = NULL; > + info = g_malloc0(sizeof(*info)); > + info->value = g_malloc0(sizeof(*info->value)); > + info->value->nodeid = i; > + CPU_FOREACH(cpu) { > + if (cpu->numa_node == i) { > + uint16List *node_cpu = g_malloc0(sizeof(*node_cpu)); > + node_cpu->value = cpu->cpu_index; > + > + if (!cur_cpu_item) { > + info->value->cpus = cur_cpu_item = node_cpu; > + } else { > + cur_cpu_item->next = node_cpu; > + cur_cpu_item = node_cpu; > + } > + } > + } > + info->value->memory = numa_info[i].node_mem; > + > +#ifdef __linux__ > + info->value->policy = numa_info[i].policy; > + info->value->relative = numa_info[i].relative; > + > + unsigned long first, next; > + next = first = find_first_bit(numa_info[i].host_mem, MAX_NODES); > + if (first == MAX_NODES) { > + goto end; > + } > + uint16List *cur_node_item = g_malloc0(sizeof(*cur_node_item)); > + cur_node_item->value = first; > + info->value->host_nodes = cur_node_item; > + do { > + next = find_next_bit(numa_info[i].host_mem, MAX_NODES, > + next + 1); > + if (next == MAX_NODES) { > + break; > + } > + > + uint16List *host_node = g_malloc0(sizeof(*host_node)); > + host_node->value = next; > + cur_node_item->next = host_node; > + cur_node_item = host_node; > + } while (true); > +end: > +#endif > + > + if (!cur_item) { > + head = cur_item = info; > + } else { > + cur_item->next = info; > + cur_item = info; > + } > + } > + > + return head; > +} > diff --git a/qapi-schema.json b/qapi-schema.json > index 7a8cf6a..088b0d0 100644 > --- a/qapi-schema.json > +++ b/qapi-schema.json > @@ -3870,3 +3870,39 @@ > { 'command': 'set-mem-policy', > 'data': {'nodeid': 'uint16', '*policy': 'NumaNodePolicy', > '*relative': 'bool', '*host-nodes': ['uint16'] } } > + > +## > +# @NUMAInfo: NUMANode? > +# > +# Information about guest NUMA nodes > +# > +# @nodeid: NUMA node ID > +# > +# @cpus: VCPUs contained in this node > +# > +# @memory: memory size of this node (in bytes) Otherwise QMP usage looks good: Reviewed-by: Luiz Capitulino <lcapitul...@redhat.com> > +# > +# @policy: memory policy of this node > +# > +# @relative: if host nodes are relative for memory policy > +# > +# @host-nodes: host nodes for its memory policy > +# > +# Since: 1.7 > +# > +## > +{ 'type': 'NUMAInfo', > + 'data': {'nodeid': 'uint16', 'cpus': ['uint16'], 'memory': 'uint64', > + 'policy': 'NumaNodePolicy', 'relative': 'bool', > + 'host-nodes': ['uint16'] }} > + > +## > +# @query-numa: > +# > +# Returns a list of information about each guest node. > +# > +# Returns: a list of @NUMAInfo for each guest node > +# > +# Since: 1.7 > +## > +{ 'command': 'query-numa', 'returns': ['NUMAInfo'] } > diff --git a/qmp-commands.hx b/qmp-commands.hx > index 67a9dd2..bc0eb41 100644 > --- a/qmp-commands.hx > +++ b/qmp-commands.hx > @@ -3165,3 +3165,52 @@ Notes: > to host node 0. > > EQMP > + > + { > + .name = "query-numa", > + .args_type = "", > + .mhandler.cmd_new = qmp_marshal_input_query_numa, > + }, > + > +SQMP > +query-numa > +--------- > + > +Show NUMA information. > + > +Return a json-array. Each NUMA node is represented by a json-object, > +which contains: > + > +- "nodeid": NUMA node ID (json-int) > +- "cpus": a json-arry of contained VCPUs > +- "memory": amount of memory in each node in Byte (json-int) > +- "policy": memory policy of this node (json-string) > +- "relative": if host nodes is relative for its memory policy (json-bool) > +- "host-nodes": a json-array of host nodes for its memory policy > + > +Arguments: > + > +Example: > + > +-> { "excute": "query-numa" } > +<- { "return":[ > + { > + "nodeid": 0, > + "cpus": [0, 1], > + "memory": 536870912, > + "policy": "membind", > + "relative": false, > + "host-nodes": [0, 1] > + }, > + { > + "nodeid": 1, > + "cpus": [2, 3], > + "memory": 536870912, > + "policy": "interleave", > + "relative": false, > + "host-nodes": [1] > + } > + ] > + } > + > +EQMP