On Tue, 21 May 2019 09:33:48 +0200 Laurent Vivier <lviv...@redhat.com> wrote:
> On pseries, core-ids are strongly binded to a node-id by the command > line option. If an user tries to add a CPU to the wrong node, he has > an error but it is not really helpful: > > qemu-system-ppc64 ... -smp 1,maxcpus=64,cores=1,threads=1,sockets=1 \ > -numa node,nodeid=0 -numa node,nodeid=1 ... > > (qemu) device_add power9_v2.0-spapr-cpu-core,core-id=30,node-id=1 > Error: node-id=1 must match numa node specified with -numa option > > This patch improves this error message by giving to the user the good > topology information (node-id, socket-id and thread-id if they are > available) to use with the core-id he's providing: > > Error: core-id 30 can only be plugged into node-id 0 > > Signed-off-by: Laurent Vivier <lviv...@redhat.com> > --- > > Notes: > v2: display full topology in the error message > > numa.c | 28 ++++++++++++++++++++++++++-- > 1 file changed, 26 insertions(+), 2 deletions(-) > > diff --git a/numa.c b/numa.c > index 3875e1efda3a..7413f821e2bb 100644 > --- a/numa.c > +++ b/numa.c > @@ -458,6 +458,27 @@ void qmp_set_numa_node(NumaOptions *cmd, Error **errp) > set_numa_options(MACHINE(qdev_get_machine()), cmd, errp); > } > > +static char *cpu_topology_to_string(const CPUArchId *cpu) > +{ > + GString *s = g_string_new(NULL); > + if (cpu->props.has_socket_id) { > + g_string_append_printf(s, "socket-id %"PRId64, cpu->props.socket_id); > + } > + if (cpu->props.has_node_id) { > + if (s->len) { > + g_string_append_printf(s, ", "); > + } > + g_string_append_printf(s, "node-id %"PRId64, cpu->props.node_id); > + } > + if (cpu->props.has_thread_id) { > + if (s->len) { > + g_string_append_printf(s, ", "); > + } > + g_string_append_printf(s, "thread-id %"PRId64, cpu->props.thread_id); > + } > + return g_string_free(s, false); > +} > + > 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); > @@ -470,8 +491,11 @@ void numa_cpu_pre_plug(const CPUArchId *slot, > DeviceState *dev, Error **errp) > "node-id", errp); > } > } else if (node_id != slot->props.node_id) { > - error_setg(errp, "node-id=%d must match numa node specified " > - "with -numa option", node_id); > + char *topology = cpu_topology_to_string(slot); > + error_setg(errp, > + "core-id %"PRId64" can only be plugged into %s", > + slot->props.core_id, topology); I'm not sure it's improvement over an existing error message, it looks like a spapr specific thing in general code and even then I'm not sure it's the correct one. state before patch reports invalid device::'node-id' value, while after patch it reports machine::slot[x]::core-id (-numa ...) which in spapr case coincidentally happens to match device::core-id. But wait machine::slot[x]::core-id is an optional in generic case so it might be not set. So we end up with error message that doesn't report invalid property directly for the affected CPU but rather reports optional core id from board with full slot description from the same board. So I'd leave message as is or add topology info pointing valid slot description: error_setg(errp, "node-id=%d must match numa node specified " "with -numa option '%s'", node_id, topology); > + g_free(topology); > } > } >