From: Yanan Wang <wangyanan55@huawei.com>
To: <qemu-devel@nongnu.org>
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
"Andrew Jones" <drjones@redhat.com>,
"Daniel P . Berrangé" <berrange@redhat.com>,
"Eduardo Habkost" <ehabkost@redhat.com>,
"Michael S . Tsirkin" <mst@redhat.com>,
wanghaibin.wang@huawei.com,
"Richard Henderson" <richard.henderson@linaro.org>,
"Greg Kurz" <groug@kaod.org>, "Halil Pasic" <pasic@linux.ibm.com>,
yuzenghui@huawei.com, "Igor Mammedov" <imammedo@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Yanan Wang" <wangyanan55@huawei.com>,
"David Gibson" <david@gibson.dropbear.id.au>
Subject: [PATCH for-6.2 v2 11/11] tests/unit: Add a unit test for smp parsing
Date: Mon, 19 Jul 2021 11:20:43 +0800 [thread overview]
Message-ID: <20210719032043.25416-12-wangyanan55@huawei.com> (raw)
In-Reply-To: <20210719032043.25416-1-wangyanan55@huawei.com>
Add a QEMU unit test for the parsing of given SMP configuration.
Since all the parsing logic is in generic function smp_parse(),
this test passes diffenent SMP configurations to the function
and compare the parsing result with what is expected.
In the test, all possible collections of the topology parameters
and the corressponding expected results are listed, including the
valid and invalid ones.
The preference of sockets over cores and the preference of cores
over sockets, and the support of multi-dies are also considered.
Signed-off-by: Yanan Wang <wangyanan55@huawei.com>
---
MAINTAINERS | 1 +
tests/unit/meson.build | 1 +
tests/unit/test-smp-parse.c | 1117 +++++++++++++++++++++++++++++++++++
3 files changed, 1119 insertions(+)
create mode 100644 tests/unit/test-smp-parse.c
diff --git a/MAINTAINERS b/MAINTAINERS
index 70633e3bf4..160dba2e57 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1636,6 +1636,7 @@ F: include/hw/boards.h
F: include/hw/core/cpu.h
F: include/hw/cpu/cluster.h
F: include/sysemu/numa.h
+F: tests/unit/test-smp-parse.c
T: git https://gitlab.com/ehabkost/qemu.git machine-next
Xtensa Machines
diff --git a/tests/unit/meson.build b/tests/unit/meson.build
index 3e0504dd21..694a924627 100644
--- a/tests/unit/meson.build
+++ b/tests/unit/meson.build
@@ -44,6 +44,7 @@ tests = {
'test-uuid': [],
'ptimer-test': ['ptimer-test-stubs.c', meson.source_root() / 'hw/core/ptimer.c'],
'test-qapi-util': [],
+ 'test-smp-parse': [qom, meson.source_root() / 'hw/core/machine-smp.c'],
}
if have_system or have_tools
diff --git a/tests/unit/test-smp-parse.c b/tests/unit/test-smp-parse.c
new file mode 100644
index 0000000000..bc1d324c3d
--- /dev/null
+++ b/tests/unit/test-smp-parse.c
@@ -0,0 +1,1117 @@
+/*
+ * SMP parsing unit-tests
+ *
+ * Copyright (C) 2021, Huawei, Inc.
+ *
+ * Authors:
+ * Yanan Wang <wangyanan55@huawei.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "qom/object.h"
+#include "qemu/module.h"
+#include "qapi/error.h"
+
+#include "hw/boards.h"
+
+#define T true
+#define F false
+
+/**
+ * SMPTestData:
+ * @config - the given SMP configuration for parsing
+ * @should_be_valid - whether the given configuration is supposed to be valid
+ * @expect - the CPU topology info expected to be parsed out
+ */
+typedef struct SMPTestData {
+ SMPConfiguration config;
+ bool should_be_valid;
+ CpuTopology expect;
+} SMPTestData;
+
+/* the specific machine type info for this test */
+static const TypeInfo smp_machine_info = {
+ .name = TYPE_MACHINE,
+ .parent = TYPE_OBJECT,
+ .class_size = sizeof(MachineClass),
+ .instance_size = sizeof(MachineState),
+};
+
+/*
+ * prefer sockets over cores over threads before 6.2.
+ * all possible SMP configurations and the corressponding expected outputs
+ * are listed for testing, including the valid and invalid ones.
+ */
+static struct SMPTestData prefer_sockets[] = {
+ {
+ /* config: no smp configuration provided
+ * expect: cpus=1,sockets=1,dies=1,cores=1,threads=1,maxcpus=1 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 1, 1, 1, 1, 1, 1 },
+ }, {
+ /* config: -smp 8
+ * expect: cpus=8,sockets=8,dies=1,cores=1,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 8, 1, 1, 1, 8 },
+ }, {
+ /* config: -smp sockets=2
+ * expect: cpus=2,sockets=2,dies=1,cores=1,threads=1,maxcpus=2 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 2, 2, 1, 1, 1, 2 },
+ }, {
+ /* config: -smp cores=4
+ * expect: cpus=4,sockets=1,dies=1,cores=4,threads=1,maxcpus=4 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 4, 1, 1, 4, 1, 4 },
+ }, {
+ /* config: -smp threads=2
+ * expect: cpus=2,sockets=1,dies=1,cores=1,threads=2,maxcpus=2 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 2, 1, 1, 1, 2, 2 },
+ }, {
+ /* config: -smp maxcpus=16
+ * expect: cpus=16,sockets=16,dies=1,cores=1,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, F, 0, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 16, 1, 1, 1, 16 },
+ }, {
+ /* config: -smp 8,sockets=2
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 1, 8 },
+ }, {
+ /* config: -smp 8,cores=4
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 1, 8 },
+ }, {
+ /* config: -smp 8,threads=2
+ * expect: cpus=8,sockets=4,dies=1,cores=1,threads=2,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 4, 1, 1, 2, 8 },
+ }, {
+ /* config: -smp 8,maxcpus=16
+ * expect: cpus=8,sockets=16,dies=1,cores=1,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, F, 0, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 16, 1, 1, 1, 16 },
+ }, {
+ /* config: -smp sockets=2,cores=4
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 1, 8 },
+ }, {
+ /* config: -smp sockets=2,threads=2
+ * expect: cpus=4,sockets=2,dies=1,cores=1,threads=2,maxcpus=4 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 4, 2, 1, 1, 2, 4 },
+ }, {
+ /* config: -smp sockets=2,maxcpus=16
+ * expect: cpus=16,sockets=2,dies=1,cores=8,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, F, 0, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 8, 1, 16 },
+ }, {
+ /* config: -smp cores=4,threads=2
+ * expect: cpus=8,sockets=1,dies=1,cores=4,threads=2,maxcpus=8 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 1, 1, 4, 2, 8 },
+ }, {
+ /* config: -smp cores=4,maxcpus=16
+ * expect: cpus=16,sockets=4,dies=1,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, T, 4, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 4, 1, 4, 1, 16 },
+ }, {
+ /* config: -smp threads=2,maxcpus=16
+ * expect: cpus=16,sockets=8,dies=1,cores=1,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, F, 0, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 8, 1, 1, 2, 16 },
+ }, {
+ /* config: -smp 8,sockets=2,cores=4
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 1, 8 },
+ }, {
+ /* config: -smp 8,sockets=2,threads=2
+ * expect: cpus=8,sockets=2,dies=1,cores=2,threads=2,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 2, 2, 8 },
+ }, {
+ /* config: -smp 8,sockets=2,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=8,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, F, 0, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 8, 1, 16 },
+ }, {
+ /* config: -smp 8,cores=4,threads=2
+ * expect: cpus=8,sockets=1,dies=1,cores=4,threads=2,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 1, 1, 4, 2, 8 },
+ }, {
+ /* config: -smp 8,cores=4,maxcpus=16
+ * expect: cpus=8,sockets=4,dies=1,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, T, 4, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 4, 1, 4, 1, 16 },
+ }, {
+ /* config: -smp 8,threads=2,maxcpus=16
+ * expect: cpus=8,sockets=8,dies=1,cores=1,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, F, 0, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 8, 1, 1, 2, 16 },
+ }, {
+ /* config: -smp sockets=2,cores=4,threads=2
+ * expect: cpus=16,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp sockets=2,cores=4,maxcpus=16
+ * expect: cpus=16,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, T, 4, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp sockets=2,threads=2,maxcpus=16
+ * expect: cpus=16,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, F, 0, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp cores=4,threads=2,maxcpus=16
+ * expect: cpus=16,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, T, 4, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 8,sockets=2,cores=4,threads=1
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, T, 4, T, 1, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 1, 8 },
+ }, {
+ /* config: -smp 8,sockets=2,cores=4,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, T, 4, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 8,sockets=2,threads=2,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, F, 0, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 8,cores=4,threads=2,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, T, 4, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp sockets=2,cores=4,threads=2,maxcpus=16
+ * expect: -smp 16,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, T, 4, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 8,sockets=2,cores=4,threads=2,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, T, 4, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, T, 2, T, 1, T, 4, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 0, F, 0, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 8, T, 0, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,dies=0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 0, T, 2, T, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,dies=1,cores=0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 8, T, 2, T, 1, T, 0, F, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,dies=1,cores=4,threads=0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 8, T, 2, T, 1, T, 4, T, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,dies=1,cores=4,threads=2,maxcpus=0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 8, T, 2, T, 1, T, 4, T, 2, T, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,dies=2
+ * expect: error, multi-dies not supported */
+ .config = (SMPConfiguration) { T, 8, F, 0, T, 2, F, 0, F, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,cores=8
+ * expect: error, sum (16) != max_cpus (8) */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, T, 4, T, 2, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,cores=5,threads=2,maxcpus=16
+ * expect: error, sum (20) != max_cpus (16) */
+ .config = (SMPConfiguration) { F, 0, T, 3, F, 0, T, 5, T, 1, T, 16 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 16,maxcpus=12
+ * expect: error, sum (12) < smp_cpus (16) */
+ .config = (SMPConfiguration) { T, 16, F, 0, F, 0, F, 0, F, 0, T, 12 },
+ .should_be_valid = false,
+ },
+};
+
+static struct SMPTestData prefer_sockets_support_dies[] = {
+ {
+ /* config: -smp dies=2
+ * expect: cpus=2,sockets=1,dies=2,cores=1,threads=1,maxcpus=2 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 2, 1, 2, 1, 1, 2 },
+ }, {
+ /* config: -smp 16,dies=2
+ * expect: cpus=16,sockets=8,dies=2,cores=1,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 8, 2, 1, 1, 16 },
+ }, {
+ /* config: -smp sockets=2,dies=2
+ * expect: cpus=4,sockets=2,dies=2,cores=1,threads=1,maxcpus=4 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 4, 2, 2, 1, 1, 4 },
+ }, {
+ /* config: -smp dies=2,cores=4
+ * expect: cpus=8,sockets=1,dies=2,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 1, 2, 4, 1, 8 },
+ }, {
+ /* config: -smp dies=2,threads=2
+ * expect: cpus=4,sockets=1,dies=2,cores=1,threads=2,maxcpus=4 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 4, 1, 2, 1, 2, 4 },
+ }, {
+ /* config: -smp dies=2,maxcpus=32
+ * expect: cpus=32,sockets=16,dies=2,cores=1,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, F, 0, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 16, 2, 1, 1, 32 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 1, 16 },
+ }, {
+ /* config: -smp 16,dies=2,cores=4
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 1, 16 },
+ }, {
+ /* config: -smp 16,dies=2,threads=2
+ * expect: cpus=16,sockets=4,dies=2,cores=1,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 4, 2, 1, 2, 16 },
+ }, {
+ /* config: -smp 16,dies=2,maxcpus=32
+ * expect: cpus=16,sockets=16,dies=2,cores=1,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, F, 0, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 16, 2, 1, 1, 32 },
+ }, {
+ /* config: -smp sockets=2,dies=2,cores=4
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 1, 16 },
+ }, {
+ /* config: -smp sockets=2,dies=2,threads=2
+ * expect: cpus=8,sockets=2,dies=2,cores=1,threads=2,maxcpus=8 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 2, 1, 2, 8 },
+ }, {
+ /* config: -smp sockets=2,dies=2,maxcpus=32
+ * expect: cpus=32,sockets=2,dies=2,cores=8,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, F, 0, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 8, 1, 32 },
+ }, {
+ /* config: -smp dies=2,cores=4,threads=2
+ * expect: cpus=16,sockets=1,dies=2,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 1, 2, 4, 2, 16 },
+ }, {
+ /* config: -smp dies=2,cores=4,maxcpus=32
+ * expect: cpus=32,sockets=4,dies=2,cores=4,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, T, 4, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 4, 2, 4, 1, 32 },
+ }, {
+ /* config: -smp dies=2,threads=2,maxcpus=32
+ * expect: cpus=32,sockets=8,dies=2,cores=1,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, F, 0, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 8, 2, 1, 2, 32 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,cores=4
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 1, 16 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,threads=2
+ * expect: cpus=16,sockets=2,dies=2,cores=2,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 2, 2, 16 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,maxcpus=32
+ * expect: cpus=16,sockets=2,dies=2,cores=8,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, F, 0, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 8, 1, 32 },
+ }, {
+ /* config: -smp 16,dies=2,cores=4,threads=2
+ * expect: cpus=16,sockets=1,dies=2,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 1, 2, 4, 2, 16 },
+ }, {
+ /* config: -smp 16,dies=2,cores=4,maxcpus=32
+ * expect: cpus=16,sockets=4,dies=2,cores=4,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, T, 4, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 4, 2, 4, 1, 32 },
+ }, {
+ /* config: -smp 16,dies=2,threads=2,maxcpus=32
+ * expect: cpus=16,sockets=8,dies=2,cores=1,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, F, 0, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 8, 2, 1, 2, 32 },
+ }, {
+ /* config: -smp sockets=2,dies=2,cores=4,threads=2
+ * expect: cpus=32,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp sockets=2,dies=2,cores=4,maxcpus=32
+ * expect: cpus=32,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, T, 4, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp sockets=2,dies=2,threads=2,maxcpus=32
+ * expect: cpus=32,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, F, 0, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp dies=2,cores=4,threads=2,maxcpus=32
+ * expect: cpus=32,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, T, 4, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,cores=4,threads=1
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, T, 4, T, 1, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 1, 16 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,cores=4,maxcpus=32
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, T, 4, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,threads=2,maxcpus=32
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, F, 0, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp 16,dies=2,cores=4,threads=2,maxcpus=32
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, T, 4, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp sockets=2,dies=2,cores=4,threads=2,maxcpus=32
+ * expect: -smp 32,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, T, 4, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,cores=4,threads=2,maxcpus=32
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, T, 4, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 2, 32 },
+ },
+};
+
+/*
+ * prefer cores over sockets over threads since 6.2.
+ * all possible SMP configurations and the corressponding expected outputs
+ * are listed for testing, including the valid and invalid ones.
+ */
+static struct SMPTestData prefer_cores[] = {
+ {
+ /* config: no smp configuration
+ * expect: cpus=1,sockets=1,dies=1,cores=1,threads=1,maxcpus=1 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 1, 1, 1, 1, 1, 1 },
+ }, {
+ /* config: -smp 8
+ * expect: cpus=8,sockets=1,dies=1,cores=8,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 1, 1, 8, 1, 8 },
+ }, {
+ /* config: -smp sockets=2
+ * expect: cpus=2,sockets=2,dies=1,cores=1,threads=1,maxcpus=2 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 2, 2, 1, 1, 1, 2 },
+ }, {
+ /* config: -smp cores=4
+ * expect: cpus=4,sockets=1,dies=1,cores=4,threads=1,maxcpus=4 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 4, 1, 1, 4, 1, 4 },
+ }, {
+ /* config: -smp threads=2
+ * expect: cpus=2,sockets=1,dies=1,cores=1,threads=2,maxcpus=2 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 2, 1, 1, 1, 2, 2 },
+ }, {
+ /* config: -smp maxcpus=16
+ * expect: cpus=16,sockets=1,dies=1,cores=16,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, F, 0, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 1, 1, 16, 1, 16 },
+ }, {
+ /* config: -smp 8,sockets=2
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 1, 8 },
+ }, {
+ /* config: -smp 8,cores=4
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 1, 8 },
+ }, {
+ /* config: -smp 8,threads=2
+ * expect: cpus=8,sockets=1,dies=1,cores=4,threads=2,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 1, 1, 4, 2, 8 },
+ }, {
+ /* config: -smp 8,maxcpus=16
+ * expect: cpus=8,sockets=1,dies=1,cores=16,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, F, 0, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 1, 1, 16, 1, 16 },
+ }, {
+ /* config: -smp sockets=2,cores=4
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 1, 8 },
+ }, {
+ /* config: -smp sockets=2,threads=2
+ * expect: cpus=4,sockets=2,dies=1,cores=1,threads=2,maxcpus=4 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 4, 2, 1, 1, 2, 4 },
+ }, {
+ /* config: -smp sockets=2,maxcpus=16
+ * expect: cpus=16,sockets=2,dies=1,cores=8,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, F, 0, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 8, 1, 16 },
+ }, {
+ /* config: -smp cores=4,threads=2
+ * expect: cpus=8,sockets=1,dies=1,cores=4,threads=2,maxcpus=8 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 1, 1, 4, 2, 8 },
+ }, {
+ /* config: -smp cores=4,maxcpus=16
+ * expect: cpus=16,sockets=4,dies=1,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, T, 4, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 4, 1, 4, 1, 16 },
+ }, {
+ /* config: -smp threads=2,maxcpus=16
+ * expect: cpus=16,sockets=1,dies=1,cores=8,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, F, 0, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 1, 1, 8, 2, 16 },
+ }, {
+ /* config: -smp 8,sockets=2,cores=4
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 1, 8 },
+ }, {
+ /* config: -smp 8,sockets=2,threads=2
+ * expect: cpus=8,sockets=2,dies=1,cores=2,threads=2,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 2, 2, 8 },
+ }, {
+ /* config: -smp 8,sockets=2,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=8,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, F, 0, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 8, 1, 16 },
+ }, {
+ /* config: -smp 8,cores=4,threads=2
+ * expect: cpus=8,sockets=1,dies=1,cores=4,threads=2,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 1, 1, 4, 2, 8 },
+ }, {
+ /* config: -smp 8,cores=4,maxcpus=16
+ * expect: cpus=8,sockets=4,dies=1,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, T, 4, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 4, 1, 4, 1, 16 },
+ }, {
+ /* config: -smp 8,threads=2,maxcpus=16
+ * expect: cpus=8,sockets=1,dies=1,cores=8,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, F, 0, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 1, 1, 8, 2, 16 },
+ }, {
+ /* config: -smp sockets=2,cores=4,threads=2
+ * expect: cpus=16,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp sockets=2,cores=4,maxcpus=16
+ * expect: cpus=16,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, T, 4, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp sockets=2,threads=2,maxcpus=16
+ * expect: cpus=16,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, F, 0, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp cores=4,threads=2,maxcpus=16
+ * expect: cpus=16,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, F, 0, F, 0, T, 4, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 8,sockets=2,cores=4,threads=1
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, T, 4, T, 1, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 1, 8 },
+ }, {
+ /* config: -smp 8,sockets=2,cores=4,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, T, 4, F, 0, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 8,sockets=2,threads=2,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, F, 0, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 8,cores=4,threads=2,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, F, 0, F, 0, T, 4, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp sockets=2,cores=4,threads=2,maxcpus=16
+ * expect: -smp 16,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, F, 0, T, 4, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 8,sockets=2,cores=4,threads=2,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, T, 4, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16
+ * expect: cpus=8,sockets=2,dies=1,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 8, T, 2, T, 1, T, 4, T, 2, T, 16 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 1, 4, 2, 16 },
+ }, {
+ /* config: -smp 0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 0, F, 0, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 8, T, 0, F, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,dies=0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 0, T, 2, T, 0, F, 0, F, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,dies=1,cores=0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 8, T, 2, T, 1, T, 0, F, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,dies=1,cores=4,threads=0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 8, T, 2, T, 1, T, 4, T, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,dies=1,cores=4,threads=2,maxcpus=0
+ * expect: error, "anything=0" is not allowed */
+ .config = (SMPConfiguration) { T, 8, T, 2, T, 1, T, 4, T, 2, T, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,dies=2
+ * expect: error, multi-dies not supported */
+ .config = (SMPConfiguration) { T, 8, F, 0, T, 2, F, 0, F, 0, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,cores=8
+ * expect: error, sum (16) != max_cpus (8) */
+ .config = (SMPConfiguration) { T, 8, T, 2, F, 0, T, 4, T, 2, F, 0 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 8,sockets=2,cores=5,threads=2,maxcpus=16
+ * expect: error, sum (20) != max_cpus (16) */
+ .config = (SMPConfiguration) { F, 0, T, 3, F, 0, T, 5, T, 1, T, 16 },
+ .should_be_valid = false,
+ }, {
+ /* config: -smp 16,maxcpus=12
+ * expect: error, sum (12) < smp_cpus (16) */
+ .config = (SMPConfiguration) { T, 16, F, 0, F, 0, F, 0, F, 0, T, 12 },
+ .should_be_valid = false,
+ },
+};
+
+static struct SMPTestData prefer_cores_support_dies[] = {
+ {
+ /* config: -smp dies=2
+ * expect: cpus=2,sockets=1,dies=2,cores=1,threads=1,maxcpus=2 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 2, 1, 2, 1, 1, 2 },
+ }, {
+ /* config: -smp 16,dies=2
+ * expect: cpus=16,sockets=1,dies=2,cores=8,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 1, 2, 8, 1, 16 },
+ }, {
+ /* config: -smp sockets=2,dies=2
+ * expect: cpus=4,sockets=2,dies=2,cores=1,threads=1,maxcpus=4 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 4, 2, 2, 1, 1, 4 },
+ }, {
+ /* config: -smp dies=2,cores=4
+ * expect: cpus=8,sockets=1,dies=2,cores=4,threads=1,maxcpus=8 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 1, 2, 4, 1, 8 },
+ }, {
+ /* config: -smp dies=2,threads=2
+ * expect: cpus=4,sockets=1,dies=2,cores=1,threads=2,maxcpus=4 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 4, 1, 2, 1, 2, 4 },
+ }, {
+ /* config: -smp dies=2,maxcpus=32
+ * expect: cpus=32,sockets=1,dies=2,cores=16,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, F, 0, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 1, 2, 16, 1, 32 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, F, 0, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 1, 16 },
+ }, {
+ /* config: -smp 16,dies=2,cores=4
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 1, 16 },
+ }, {
+ /* config: -smp 16,dies=2,threads=2
+ * expect: cpus=16,sockets=1,dies=2,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 1, 2, 4, 2, 16 },
+ }, {
+ /* config: -smp 16,dies=2,maxcpus=32
+ * expect: cpus=16,sockets=1,dies=2,cores=16,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, F, 0, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 1, 2, 16, 1, 32 },
+ }, {
+ /* config: -smp sockets=2,dies=2,cores=4
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 1, 16 },
+ }, {
+ /* config: -smp sockets=2,dies=2,threads=2
+ * expect: cpus=8,sockets=2,dies=2,cores=1,threads=2,maxcpus=8 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 8, 2, 2, 1, 2, 8 },
+ }, {
+ /* config: -smp sockets=2,dies=2,maxcpus=32
+ * expect: cpus=32,sockets=2,dies=2,cores=8,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, F, 0, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 8, 1, 32 },
+ }, {
+ /* config: -smp dies=2,cores=4,threads=2
+ * expect: cpus=16,sockets=1,dies=2,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 1, 2, 4, 2, 16 },
+ }, {
+ /* config: -smp dies=2,cores=4,maxcpus=32
+ * expect: cpus=32,sockets=4,dies=2,cores=4,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, T, 4, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 4, 2, 4, 1, 32 },
+ }, {
+ /* config: -smp dies=2,threads=2,maxcpus=32
+ * expect: cpus=32,sockets=1,dies=2,cores=8,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, F, 0, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 1, 2, 8, 2, 32 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,cores=4
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, T, 4, F, 0, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 1, 16 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,threads=2
+ * expect: cpus=16,sockets=2,dies=2,cores=2,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, F, 0, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 2, 2, 16 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,maxcpus=32
+ * expect: cpus=16,sockets=2,dies=2,cores=8,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, F, 0, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 8, 1, 32 },
+ }, {
+ /* config: -smp 16,dies=2,cores=4,threads=2
+ * expect: cpus=16,sockets=1,dies=2,cores=4,threads=2,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 1, 2, 4, 2, 16 },
+ }, {
+ /* config: -smp 16,dies=2,cores=4,maxcpus=32
+ * expect: cpus=16,sockets=4,dies=2,cores=4,threads=1,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, T, 4, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 4, 2, 4, 1, 32 },
+ }, {
+ /* config: -smp 16,dies=2,threads=2,maxcpus=32
+ * expect: cpus=16,sockets=1,dies=2,cores=8,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, F, 0, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 1, 2, 8, 2, 32 },
+ }, {
+ /* config: -smp sockets=2,dies=2,cores=4,threads=2
+ * expect: cpus=32,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, T, 4, T, 2, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp sockets=2,dies=2,cores=4,maxcpus=32
+ * expect: cpus=32,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, T, 4, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp sockets=2,dies=2,threads=2,maxcpus=32
+ * expect: cpus=32,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, F, 0, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp dies=2,cores=4,threads=2,maxcpus=32
+ * expect: cpus=32,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, F, 0, T, 2, T, 4, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,cores=4,threads=1
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=1,maxcpus=16 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, T, 4, T, 1, F, 0 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 1, 16 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,cores=4,maxcpus=32
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, T, 4, F, 0, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,threads=2,maxcpus=32
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, F, 0, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp 16,dies=2,cores=4,threads=2,maxcpus=32
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, F, 0, T, 2, T, 4, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp sockets=2,dies=2,cores=4,threads=2,maxcpus=32
+ * expect: -smp 32,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { F, 0, T, 2, T, 2, T, 4, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 32, 2, 2, 4, 2, 32 },
+ }, {
+ /* config: -smp 16,sockets=2,dies=2,cores=4,threads=2,maxcpus=32
+ * expect: cpus=16,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
+ .config = (SMPConfiguration) { T, 16, T, 2, T, 2, T, 4, T, 2, T, 32 },
+ .should_be_valid = true,
+ .expect = (CpuTopology) { 16, 2, 2, 4, 2, 32 },
+ },
+};
+
+static char *get_config_info(SMPConfiguration *config)
+{
+ return g_strdup_printf(
+ "(SMPConfiguration) {\n"
+ " .has_cpus = %5s, cpus = %ld,\n"
+ " .has_sockets = %5s, sockets = %ld,\n"
+ " .has_dies = %5s, dies = %ld,\n"
+ " .has_cores = %5s, cores = %ld,\n"
+ " .has_threads = %5s, threads = %ld,\n"
+ " .has_maxcpus = %5s, maxcpus = %ld,\n"
+ "}",
+ config->has_cpus ? "true" : "false", config->cpus,
+ config->has_sockets ? "true" : "false", config->sockets,
+ config->has_dies ? "true" : "false", config->dies,
+ config->has_cores ? "true" : "false", config->cores,
+ config->has_threads ? "true" : "false", config->threads,
+ config->has_maxcpus ? "true" : "false", config->maxcpus);
+}
+
+static char *get_topo_info(CpuTopology *topo)
+{
+ return g_strdup_printf(
+ "(CpuTopology) {\n"
+ " .cpus = %u,\n"
+ " .sockets = %u,\n"
+ " .dies = %u,\n"
+ " .cores = %u,\n"
+ " .threads = %u,\n"
+ " .max_cpus = %u,\n"
+ "}",
+ topo->cpus, topo->sockets, topo->dies,
+ topo->cores, topo->threads, topo->max_cpus);
+}
+
+static void check_smp_parse(MachineState *ms, SMPTestData *data)
+{
+ SMPConfiguration *config = &data->config;
+ CpuTopology *expect = &data->expect;
+ g_autofree char *config_info = NULL;
+ g_autofree char *expect_info = NULL;
+ g_autofree char *result_info = NULL;
+ Error *err = NULL;
+
+ /* call the generic parser smp_parse() in hw/core/machine-smp.c */
+ smp_parse(ms, config, &err);
+
+ if (data->should_be_valid) {
+ if ((err == NULL) &&
+ (ms->smp.cpus == expect->cpus) &&
+ (ms->smp.sockets == expect->sockets) &&
+ (ms->smp.dies == expect->dies) &&
+ (ms->smp.cores == expect->cores) &&
+ (ms->smp.threads == expect->threads) &&
+ (ms->smp.max_cpus == expect->max_cpus)) {
+ return;
+ }
+
+ config_info = get_config_info(config);
+ expect_info = get_topo_info(expect);
+
+ if (err != NULL) {
+ g_printerr("Check smp_parse failed:\n"
+ "config: %s\n"
+ "expect: %s\n"
+ "should_be_valid: yes\n\n"
+ "result_is_valid: no\n"
+ "error_msg: %s\n",
+ config_info, expect_info, error_get_pretty(err));
+ error_free(err);
+ } else {
+ result_info = get_topo_info(&ms->smp);
+ g_printerr("Check smp_parse failed:\n"
+ "config: %s\n"
+ "expect: %s\n"
+ "should_be_valid: yes\n\n"
+ "result_is_valid: yes\n"
+ "result: %s\n",
+ config_info, expect_info, result_info);
+ }
+ } else {
+ if (err != NULL) {
+ error_free(err);
+ return;
+ }
+
+ config_info = get_config_info(config);
+ result_info = get_topo_info(&ms->smp);
+
+ g_printerr("Check smp_parse failed:\n"
+ "config: %s\n"
+ "should_be_valid: no\n\n"
+ "result_is_valid: yes\n"
+ "result: %s\n",
+ config_info, result_info);
+ }
+
+ abort();
+}
+
+static void smp_prefer_sockets_test(void)
+{
+ Object *obj = object_new(TYPE_MACHINE);
+ MachineState *ms = MACHINE(obj);
+ MachineClass *mc = MACHINE_GET_CLASS(obj);
+ int i;
+
+ /* make sure that we have created the object */
+ g_assert_nonnull(ms);
+ g_assert_nonnull(mc);
+
+ mc->smp_prefer_sockets = true;
+
+ /* test cases when multi-dies are not supported */
+ mc->smp_dies_supported = false;
+ for (i = 0; i < ARRAY_SIZE(prefer_sockets); i++) {
+ check_smp_parse(ms, &prefer_sockets[i]);
+ }
+
+ /* test cases when multi-dies are supported */
+ mc->smp_dies_supported = true;
+ for (i = 0; i < ARRAY_SIZE(prefer_sockets_support_dies); i++) {
+ check_smp_parse(ms, &prefer_sockets_support_dies[i]);
+ }
+
+ object_unref(obj);
+}
+
+static void smp_prefer_cores_test(void)
+{
+ Object *obj = object_new(TYPE_MACHINE);
+ MachineState *ms = MACHINE(obj);
+ MachineClass *mc = MACHINE_GET_CLASS(obj);
+ int i;
+
+ /* make sure that we have created the object */
+ g_assert_nonnull(ms);
+ g_assert_nonnull(mc);
+
+ mc->smp_prefer_sockets = false;
+
+ /* test cases when multi-dies are not supported */
+ mc->smp_dies_supported = false;
+ for (i = 0; i < ARRAY_SIZE(prefer_cores); i++) {
+ check_smp_parse(ms, &prefer_cores[i]);
+ }
+
+ /* test cases when multi-dies are supported */
+ mc->smp_dies_supported = true;
+ for (i = 0; i < ARRAY_SIZE(prefer_cores_support_dies); i++) {
+ check_smp_parse(ms, &prefer_cores_support_dies[i]);
+ }
+
+ object_unref(obj);
+}
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ module_call_init(MODULE_INIT_QOM);
+ type_register_static(&smp_machine_info);
+
+ g_test_add_func("/test-smp-parse/prefer_sockets", smp_prefer_sockets_test);
+ g_test_add_func("/test-smp-parse/prefer_cores", smp_prefer_cores_test);
+
+ g_test_run();
+
+ return 0;
+}
--
2.19.1
next prev parent reply other threads:[~2021-07-19 3:27 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-19 3:20 [PATCH for-6.2 v2 00/11] machine: smp parsing fixes and improvement Yanan Wang
2021-07-19 3:20 ` [PATCH for-6.2 v2 01/11] machine: Disallow specifying topology parameters as zero Yanan Wang
2021-07-19 16:11 ` Andrew Jones
2021-07-21 12:34 ` wangyanan (Y)
2021-07-19 16:46 ` Daniel P. Berrangé
2021-07-21 12:35 ` wangyanan (Y)
2021-07-19 3:20 ` [PATCH for-6.2 v2 02/11] machine: Make smp_parse generic enough for all arches Yanan Wang
2021-07-19 16:28 ` Andrew Jones
2021-07-19 16:36 ` Daniel P. Berrangé
2021-07-19 16:48 ` Andrew Jones
2021-07-19 16:50 ` Daniel P. Berrangé
2021-07-19 16:53 ` Daniel P. Berrangé
2021-07-22 7:18 ` wangyanan (Y)
2021-07-20 6:57 ` Cornelia Huck
2021-07-22 7:12 ` wangyanan (Y)
2021-07-19 3:20 ` [PATCH for-6.2 v2 03/11] machine: Uniformly use maxcpus to calculate the omitted parameters Yanan Wang
2021-07-19 16:36 ` Andrew Jones
2021-07-22 3:00 ` wangyanan (Y)
2021-07-19 3:20 ` [PATCH for-6.2 v2 04/11] machine: Use the computed parameters to calculate omitted cpus Yanan Wang
2021-07-19 16:42 ` Andrew Jones
2021-07-22 4:42 ` wangyanan (Y)
2021-07-22 12:27 ` Andrew Jones
2021-07-22 14:59 ` wangyanan (Y)
2021-07-22 15:05 ` Andrew Jones
2021-07-22 15:45 ` wangyanan (Y)
2021-07-19 3:20 ` [PATCH for-6.2 v2 05/11] machine: Improve the error reporting of smp parsing Yanan Wang
2021-07-19 16:53 ` Andrew Jones
2021-07-22 8:10 ` wangyanan (Y)
2021-07-22 12:47 ` Andrew Jones
2021-07-19 3:20 ` [PATCH for-6.2 v2 06/11] hw: Add compat machines for 6.2 Yanan Wang
2021-07-19 3:38 ` David Gibson
2021-07-19 17:00 ` Andrew Jones
2021-07-19 17:03 ` Cornelia Huck
2021-07-19 23:45 ` Pankaj Gupta
2021-07-19 3:20 ` [PATCH for-6.2 v2 07/11] machine: Prefer cores over sockets in smp parsing since 6.2 Yanan Wang
2021-07-19 3:40 ` David Gibson
2021-07-22 5:22 ` wangyanan (Y)
2021-07-19 17:13 ` Andrew Jones
2021-07-22 5:32 ` wangyanan (Y)
2021-07-19 3:20 ` [PATCH for-6.2 v2 08/11] machine: Use ms instead of global current_machine in sanity-check Yanan Wang
2021-07-19 17:14 ` Andrew Jones
2021-07-19 3:20 ` [PATCH for-6.2 v2 09/11] machine: Tweak the order of topology members in struct CpuTopology Yanan Wang
2021-07-19 3:20 ` [PATCH for-6.2 v2 10/11] machine: Split out the smp parsing code Yanan Wang
2021-07-19 17:20 ` Andrew Jones
2021-07-22 6:24 ` wangyanan (Y)
2021-07-22 13:07 ` Andrew Jones
2021-07-22 14:29 ` wangyanan (Y)
2021-07-19 3:20 ` Yanan Wang [this message]
2021-07-19 18:57 ` [PATCH for-6.2 v2 11/11] tests/unit: Add a unit test for smp parsing Andrew Jones
2021-07-22 6:15 ` wangyanan (Y)
2021-07-22 13:12 ` Andrew Jones
2021-07-22 14:18 ` wangyanan (Y)
2021-07-19 16:57 ` [PATCH for-6.2 v2 00/11] machine: smp parsing fixes and improvement Cornelia Huck
2021-07-21 12:38 ` wangyanan (Y)
2021-07-21 13:52 ` Pankaj Gupta
2021-07-22 2:22 ` wangyanan (Y)
2021-07-22 7:51 ` Pierre Morel
2021-07-22 8:32 ` wangyanan (Y)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210719032043.25416-12-wangyanan55@huawei.com \
--to=wangyanan55@huawei.com \
--cc=berrange@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=drjones@redhat.com \
--cc=ehabkost@redhat.com \
--cc=groug@kaod.org \
--cc=imammedo@redhat.com \
--cc=mst@redhat.com \
--cc=pasic@linux.ibm.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=thuth@redhat.com \
--cc=wanghaibin.wang@huawei.com \
--cc=yuzenghui@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).