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 |
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 --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); }
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(+)