qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v14 17/21] numa: convert to use QObjectInputVisi


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v14 17/21] numa: convert to use QObjectInputVisitor for -numa
Date: Thu, 20 Oct 2016 08:57:22 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

"Daniel P. Berrange" <address@hidden> writes:

> Switch away from using OptsVisitor to parse the -numa
> argument processing. This enables use of the modern
> list syntax for specifying CPUs. e.g. the old syntax
>
>   -numa node,nodeid=0,cpus=0-3,cpus=8-11,mem=107
>
> is equivalent to
>
>   -numa node,nodeid=0,cpus.0=0,cpus.1=1,cpus.2=2,cpus.3=3,\
>         cpus.4=8,cpus.5=9,cpus.6=10,cpus.7=11,mem=107
>
> Furthermore, the cli arg can now follow the QAPI schema
> nesting, so the above is equivalent to the canonical
> syntax:
>
>   -numa type=node,data.nodeid=0,data.cpus.0=0,data.cpus.1=1,\
>         data.cpus.2=2,data.cpus.3=3,data.cpus.4=8,data.cpus.5=9,\
>       data.cpus.6=10,data.cpus.7=11,data.mem=107
>
> A test case is added to cover argument parsing to validate
> that both the old and new syntax is correctly handled.
>
> Signed-off-by: Daniel P. Berrange <address@hidden>
> ---
>  include/sysemu/numa_int.h |  11 +++++
>  numa.c                    |  36 +++++++++-----
>  stubs/Makefile.objs       |   5 ++
>  stubs/exec.c              |   6 +++
>  stubs/hostmem.c           |  14 ++++++
>  stubs/memory.c            |  41 ++++++++++++++++
>  stubs/qdev.c              |   8 ++++
>  stubs/vl.c                |   8 ++++
>  stubs/vmstate.c           |   4 ++
>  tests/Makefile.include    |   2 +
>  tests/test-numa.c         | 116 
> ++++++++++++++++++++++++++++++++++++++++++++++
>  11 files changed, 240 insertions(+), 11 deletions(-)
>  create mode 100644 include/sysemu/numa_int.h
>  create mode 100644 stubs/exec.c
>  create mode 100644 stubs/hostmem.c
>  create mode 100644 stubs/memory.c
>  create mode 100644 stubs/qdev.c
>  create mode 100644 stubs/vl.c
>  create mode 100644 tests/test-numa.c
>
> diff --git a/include/sysemu/numa_int.h b/include/sysemu/numa_int.h
> new file mode 100644
> index 0000000..93160da
> --- /dev/null
> +++ b/include/sysemu/numa_int.h
> @@ -0,0 +1,11 @@
> +#ifndef SYSEMU_NUMA_INT_H
> +#define SYSEMU_NUMA_INT_H
> +
> +#include "sysemu/numa.h"
> +
> +extern int have_memdevs;
> +extern int max_numa_nodeid;
> +
> +int parse_numa(void *opaque, QemuOpts *opts, Error **errp);
> +
> +#endif
> diff --git a/numa.c b/numa.c
> index 6289f46..653ebf1 100644
> --- a/numa.c
> +++ b/numa.c
> @@ -23,14 +23,14 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "sysemu/numa.h"
> +#include "sysemu/numa_int.h"
>  #include "exec/cpu-common.h"
>  #include "qemu/bitmap.h"
>  #include "qom/cpu.h"
>  #include "qemu/error-report.h"
>  #include "include/exec/cpu-common.h" /* for RAM_ADDR_FMT */
>  #include "qapi-visit.h"
> -#include "qapi/opts-visitor.h"
> +#include "qapi/qobject-input-visitor.h"
>  #include "hw/boards.h"
>  #include "sysemu/hostmem.h"
>  #include "qmp-commands.h"
> @@ -45,10 +45,10 @@ QemuOptsList qemu_numa_opts = {
>      .desc = { { 0 } } /* validated with OptsVisitor */
>  };
>  
> -static int have_memdevs = -1;
> -static int max_numa_nodeid; /* Highest specified NUMA node ID, plus one.
> -                             * For all nodes, nodeid < max_numa_nodeid
> -                             */
> +int have_memdevs = -1;
> +int max_numa_nodeid; /* Highest specified NUMA node ID, plus one.
> +                      * For all nodes, nodeid < max_numa_nodeid
> +                      */
>  int nb_numa_nodes;
>  NodeInfo numa_info[MAX_NODES];
>  
> @@ -189,6 +189,9 @@ static void numa_node_parse(NumaNodeOptions *node, 
> QemuOpts *opts, Error **errp)
>      if (node->has_mem) {
>          uint64_t mem_size = node->mem;
>          const char *mem_str = qemu_opt_get(opts, "mem");
> +        if (!mem_str) {
> +            mem_str = qemu_opt_get(opts, "data.mem");
> +        }
>          /* Fix up legacy suffix-less format */
>          if (g_ascii_isdigit(mem_str[strlen(mem_str) - 1])) {
>              mem_size <<= 20;
> @@ -211,16 +214,27 @@ static void numa_node_parse(NumaNodeOptions *node, 
> QemuOpts *opts, Error **errp)
>      max_numa_nodeid = MAX(max_numa_nodeid, nodenr + 1);
>  }
>  
> -static int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
> +int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
>  {
>      NumaOptions *object = NULL;
>      Error *err = NULL;
> +    Visitor *v;
>  
> -    {
> -        Visitor *v = opts_visitor_new(opts);
> -        visit_type_NumaOptions(v, NULL, &object, &err);
> -        visit_free(v);
> +    /*
> +     * Needs autocreate_list=true, permit_int_ranges=true and
> +     * permit_repeated_opts=true in order to support existing
> +     * syntax for 'cpus' parameter which is an int list.
> +     *
> +     * Needs autocreate_struct_levels=1, because existing syntax
> +     * used a nested struct in the QMP schema with a flat namespace
> +     * in the CLI args.

Which QAPI definition(s) do you allude to here?

If it's just union NumaOptions, that's not ABI.  I'd simply flatten it.
Sketch appended.

> +     */
> +    v = qobject_input_visitor_new_opts(opts, true, 1, true, true, &err);
> +    if (err) {
> +        goto end;
>      }
> +    visit_type_NumaOptions(v, NULL, &object, &err);
> +    visit_free(v);
>  
>      if (err) {
>          goto end;
[Skipping test updates for now...]



diff --git a/numa.c b/numa.c
index 9c09e45..792fa2a 100644
--- a/numa.c
+++ b/numa.c
@@ -227,8 +227,8 @@ static int parse_numa(void *opaque, QemuOpts *opts, Error 
**errp)
     }
 
     switch (object->type) {
-    case NUMA_OPTIONS_KIND_NODE:
-        numa_node_parse(object->u.node.data, opts, &err);
+    case NUMA_OPTIONS_TYPE_NODE:
+        numa_node_parse(&object->u.node, opts, &err);
         if (err) {
             goto end;
         }
diff --git a/qapi-schema.json b/qapi-schema.json
index ded1179..4838258 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -4255,7 +4255,10 @@
 #
 # Since 2.1
 ##
+{ 'enum': 'NumaOptionsType', 'data': ['node'] }
 { 'union': 'NumaOptions',
+  'base': { 'type': 'NumaOptionsType' },
+  'discriminator': 'type',
   'data': {
     'node': 'NumaNodeOptions' }}
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]