diff mbox series

[v3,8/9] QMP: add set-numa-node command

Message ID 1518784641-43151-9-git-send-email-imammedo@redhat.com
State New
Headers show
Series enable numa configuration before machine_init() from QMP | expand

Commit Message

Igor Mammedov Feb. 16, 2018, 12:37 p.m. UTC
Command is allowed to run only in preconfig stage and
will allow to configure numa mapping for CPUs depending
on possible CPUs layout (query-hotpluggable-cpus) for
given machine instance.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 numa.c           |  5 +++++
 qapi-schema.json | 14 ++++++++++++++
 tests/qmp-test.c |  6 ++++++
 3 files changed, 25 insertions(+)

Comments

Eric Blake Feb. 27, 2018, 10:17 p.m. UTC | #1
On 02/16/2018 06:37 AM, Igor Mammedov wrote:
> Command is allowed to run only in preconfig stage and
> will allow to configure numa mapping for CPUs depending
> on possible CPUs layout (query-hotpluggable-cpus) for
> given machine instance.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>   numa.c           |  5 +++++
>   qapi-schema.json | 14 ++++++++++++++
>   tests/qmp-test.c |  6 ++++++
>   3 files changed, 25 insertions(+)
> 

> +++ b/qapi-schema.json
> @@ -3201,3 +3201,17 @@
>   # Since: 2.11
>   ##
>   { 'command': 'watchdog-set-action', 'data' : {'action': 'WatchdogAction'} }
> +
> +##
> +# @set-numa-node:
> +#
> +# Runtime equivalent of '-numa' CLI option, available at
> +# preconfigure stage to configure numa mapping before initializing
> +# machine.
> +#
> +# Since 2.12
> +##
> +{ 'command': 'set-numa-node', 'boxed': true,
> +  'data': 'NumaOptions',
> +  'runstates': [ 'preconfig' ]
> +}

Oh, so you ARE trying to do fine-grained control of which commands are 
valid in which states.  Still, would that be easier through a 
three-state enum (or pair of bools) instead of making every client 
enumerate an array of 'all states', 'all but preconfig', and 'preconfig 
only'?

Also, while preconfig is special (not every command can be made to run 
during preconfig, so having the state rejection logic centralized makes 
some sense), there are a lot fewer commands that are preconfig-only - 
could those commands (just set-numa-node at the moment) be made to 
perform state checks themselves rather than relying on centralized 
logic, and then you still only need a single bool in the QAPI schema 
(safe for preconfig, unsafe for preconfig in central logic; unsafe in 
other states in a per-command code).
diff mbox series

Patch

diff --git a/numa.c b/numa.c
index 04e34eb..e3b7f15 100644
--- a/numa.c
+++ b/numa.c
@@ -446,6 +446,11 @@  void parse_numa_opts(MachineState *ms)
     }
 }
 
+void qmp_set_numa_node(NumaOptions *cmd, Error **errp)
+{
+    parse_NumaOptions(MACHINE(qdev_get_machine()), cmd, errp);
+}
+
 void numa_cpu_pre_plug(const CPUArchId *slot, DeviceState *dev, Error **errp)
 {
     int node_id = object_property_get_int(OBJECT(dev), "node-id", &error_abort);
diff --git a/qapi-schema.json b/qapi-schema.json
index 4365dfe..a96c31f 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -3201,3 +3201,17 @@ 
 # Since: 2.11
 ##
 { 'command': 'watchdog-set-action', 'data' : {'action': 'WatchdogAction'} }
+
+##
+# @set-numa-node:
+#
+# Runtime equivalent of '-numa' CLI option, available at
+# preconfigure stage to configure numa mapping before initializing
+# machine.
+#
+# Since 2.12
+##
+{ 'command': 'set-numa-node', 'boxed': true,
+  'data': 'NumaOptions',
+  'runstates': [ 'preconfig' ]
+}
diff --git a/tests/qmp-test.c b/tests/qmp-test.c
index 4ab0b7c..b0de2b1 100644
--- a/tests/qmp-test.c
+++ b/tests/qmp-test.c
@@ -324,6 +324,8 @@  static void test_qmp_preconfig(void)
     /* enabled commands, no error expected  */
     g_assert(!is_err(qtest_qmp(qs, "{ 'execute': 'query-commands' }")));
     g_assert(!is_err(qtest_qmp(qs, "{ 'execute': 'query-hotpluggable-cpus'}")));
+    g_assert(!is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node',"
+        " 'arguments': { 'type': 'node', 'nodeid': 0 } }")));
 
     /* forbidden commands, expected error */
     g_assert(is_err(qtest_qmp(qs, "{ 'execute': 'query-cpus' }")));
@@ -347,6 +349,10 @@  static void test_qmp_preconfig(void)
     /* enabled commands, no error expected  */
     g_assert(!is_err(qtest_qmp(qs, "{ 'execute': 'query-cpus' }")));
 
+    /* forbidden commands, expected error */
+    g_assert(is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node',"
+        " 'arguments': { 'type': 'node', 'nodeid': 1 } }")));
+
     qtest_quit(qs);
 }