Message ID | 20220503140304.855514-5-gshan@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/arm/virt: Fix CPU's default NUMA node ID | expand |
On Tue, 3 May 2022 22:03:02 +0800 Gavin Shan <gshan@redhat.com> wrote: > In aarch64_numa_cpu(), the CPU and NUMA association is something > like below. Two threads in the same core/cluster/socket are > associated with two individual NUMA nodes, which is unreal as > Igor Mammedov mentioned. We don't expect the association to break > NUMA-to-socket boundary, which matches with the real world. > > NUMA-node socket cluster core thread > ------------------------------------------ > 0 0 0 0 0 > 1 0 0 0 1 > > This corrects the topology for CPUs and their association with > NUMA nodes. After this patch is applied, the CPU and NUMA > association becomes something like below, which looks real. > Besides, socket/cluster/core/thread IDs are all checked when > the NUMA node IDs are verified. It helps to check if the CPU > topology is properly populated or not. > > NUMA-node socket cluster core thread > ------------------------------------------ > 0 1 0 0 0 > 1 0 0 0 0 I'd place 'socket 1' on node 0, so it wouldn't look odd. But it probably doesn't matter, so Acked-by: Igor Mammedov <imammedo@redhat.com> > Suggested-by: Igor Mammedov <imammedo@redhat.com> > Signed-off-by: Gavin Shan <gshan@redhat.com> > --- > tests/qtest/numa-test.c | 18 ++++++++++++------ > 1 file changed, 12 insertions(+), 6 deletions(-) > > diff --git a/tests/qtest/numa-test.c b/tests/qtest/numa-test.c > index aeda8c774c..32e35daaae 100644 > --- a/tests/qtest/numa-test.c > +++ b/tests/qtest/numa-test.c > @@ -224,17 +224,17 @@ static void aarch64_numa_cpu(const void *data) > g_autofree char *cli = NULL; > > cli = make_cli(data, "-machine " > - "smp.cpus=2,smp.sockets=1,smp.clusters=1,smp.cores=1,smp.threads=2 " > + "smp.cpus=2,smp.sockets=2,smp.clusters=1,smp.cores=1,smp.threads=1 " > "-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 " > - "-numa cpu,node-id=1,thread-id=0 " > - "-numa cpu,node-id=0,thread-id=1"); > + "-numa cpu,node-id=0,socket-id=1,cluster-id=0,core-id=0,thread-id=0 " > + "-numa cpu,node-id=1,socket-id=0,cluster-id=0,core-id=0,thread-id=0"); > qts = qtest_init(cli); > cpus = get_cpus(qts, &resp); > g_assert(cpus); > > while ((e = qlist_pop(cpus))) { > QDict *cpu, *props; > - int64_t thread, node; > + int64_t socket, cluster, core, thread, node; > > cpu = qobject_to(QDict, e); > g_assert(qdict_haskey(cpu, "props")); > @@ -242,12 +242,18 @@ static void aarch64_numa_cpu(const void *data) > > g_assert(qdict_haskey(props, "node-id")); > node = qdict_get_int(props, "node-id"); > + g_assert(qdict_haskey(props, "socket-id")); > + socket = qdict_get_int(props, "socket-id"); > + g_assert(qdict_haskey(props, "cluster-id")); > + cluster = qdict_get_int(props, "cluster-id"); > + g_assert(qdict_haskey(props, "core-id")); > + core = qdict_get_int(props, "core-id"); > g_assert(qdict_haskey(props, "thread-id")); > thread = qdict_get_int(props, "thread-id"); > > - if (thread == 0) { > + if (socket == 0 && cluster == 0 && core == 0 && thread == 0) { > g_assert_cmpint(node, ==, 1); > - } else if (thread == 1) { > + } else if (socket == 1 && cluster == 0 && core == 0 && thread == 0) { > g_assert_cmpint(node, ==, 0); > } else { > g_assert(false);
diff --git a/tests/qtest/numa-test.c b/tests/qtest/numa-test.c index aeda8c774c..32e35daaae 100644 --- a/tests/qtest/numa-test.c +++ b/tests/qtest/numa-test.c @@ -224,17 +224,17 @@ static void aarch64_numa_cpu(const void *data) g_autofree char *cli = NULL; cli = make_cli(data, "-machine " - "smp.cpus=2,smp.sockets=1,smp.clusters=1,smp.cores=1,smp.threads=2 " + "smp.cpus=2,smp.sockets=2,smp.clusters=1,smp.cores=1,smp.threads=1 " "-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 " - "-numa cpu,node-id=1,thread-id=0 " - "-numa cpu,node-id=0,thread-id=1"); + "-numa cpu,node-id=0,socket-id=1,cluster-id=0,core-id=0,thread-id=0 " + "-numa cpu,node-id=1,socket-id=0,cluster-id=0,core-id=0,thread-id=0"); qts = qtest_init(cli); cpus = get_cpus(qts, &resp); g_assert(cpus); while ((e = qlist_pop(cpus))) { QDict *cpu, *props; - int64_t thread, node; + int64_t socket, cluster, core, thread, node; cpu = qobject_to(QDict, e); g_assert(qdict_haskey(cpu, "props")); @@ -242,12 +242,18 @@ static void aarch64_numa_cpu(const void *data) g_assert(qdict_haskey(props, "node-id")); node = qdict_get_int(props, "node-id"); + g_assert(qdict_haskey(props, "socket-id")); + socket = qdict_get_int(props, "socket-id"); + g_assert(qdict_haskey(props, "cluster-id")); + cluster = qdict_get_int(props, "cluster-id"); + g_assert(qdict_haskey(props, "core-id")); + core = qdict_get_int(props, "core-id"); g_assert(qdict_haskey(props, "thread-id")); thread = qdict_get_int(props, "thread-id"); - if (thread == 0) { + if (socket == 0 && cluster == 0 && core == 0 && thread == 0) { g_assert_cmpint(node, ==, 1); - } else if (thread == 1) { + } else if (socket == 1 && cluster == 0 && core == 0 && thread == 0) { g_assert_cmpint(node, ==, 0); } else { g_assert(false);
In aarch64_numa_cpu(), the CPU and NUMA association is something like below. Two threads in the same core/cluster/socket are associated with two individual NUMA nodes, which is unreal as Igor Mammedov mentioned. We don't expect the association to break NUMA-to-socket boundary, which matches with the real world. NUMA-node socket cluster core thread ------------------------------------------ 0 0 0 0 0 1 0 0 0 1 This corrects the topology for CPUs and their association with NUMA nodes. After this patch is applied, the CPU and NUMA association becomes something like below, which looks real. Besides, socket/cluster/core/thread IDs are all checked when the NUMA node IDs are verified. It helps to check if the CPU topology is properly populated or not. NUMA-node socket cluster core thread ------------------------------------------ 0 1 0 0 0 1 0 0 0 0 Suggested-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Gavin Shan <gshan@redhat.com> --- tests/qtest/numa-test.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)