Currently the only difference between smp_parse and pc_smp_parse
is the support of dies parameter and the related error reporting.
With some arch compat variables like "bool dies_supported", we can
make smp_parse generic enough for all arches and the PC specific
one can be removed.
Making smp_parse() generic enough can reduce code duplication and
ease the code maintenance, and also allows extending the topology
with more arch specific members (e.g., clusters) in the future.
Suggested-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Yanan Wang <wangyanan55@huawei.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
---
hw/core/machine.c | 110 ++++++++++++++++++++++++++++++++++++--------
hw/i386/pc.c | 84 +--------------------------------
include/hw/boards.h | 9 ++++
3 files changed, 100 insertions(+), 103 deletions(-)
diff --git a/hw/core/machine.c b/hw/core/machine.c
index a21fcd7700..4b5c943f8e 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -15,6 +15,7 @@
#include "qapi/qmp/qerror.h"
#include "sysemu/replay.h"
#include "qemu/units.h"
+#include "qemu/cutils.h"
#include "hw/boards.h"
#include "hw/loader.h"
#include "qapi/error.h"
@@ -746,20 +747,87 @@ void machine_set_cpu_numa_node(MachineState *machine,
}
}
+static char *cpu_topology_hierarchy(MachineState *ms)
+{
+ MachineClass *mc = MACHINE_GET_CLASS(ms);
+ SMPCompatProps *smp_props = &mc->smp_props;
+ char topo_msg[256] = "";
+
+ /*
+ * Topology members should be ordered from the largest to the smallest.
+ * Concept of sockets/cores/threads is supported by default and will be
+ * reported in the hierarchy. Unsupported members will not be reported.
+ */
+ g_autofree char *sockets_msg = g_strdup_printf(
+ " * sockets (%u)", ms->smp.sockets);
+ pstrcat(topo_msg, sizeof(topo_msg), sockets_msg);
+
+ if (smp_props->dies_supported) {
+ g_autofree char *dies_msg = g_strdup_printf(
+ " * dies (%u)", ms->smp.dies);
+ pstrcat(topo_msg, sizeof(topo_msg), dies_msg);
+ }
+
+ g_autofree char *cores_msg = g_strdup_printf(
+ " * cores (%u)", ms->smp.cores);
+ pstrcat(topo_msg, sizeof(topo_msg), cores_msg);
+
+ g_autofree char *threads_msg = g_strdup_printf(
+ " * threads (%u)", ms->smp.threads);
+ pstrcat(topo_msg, sizeof(topo_msg), threads_msg);
+
+ return g_strdup_printf("%s", topo_msg + 3);
+}