From 4aea04b720a8dc73cb3b56b49e1b86555c907d59 Mon Sep 17 00:00:00 2001 From: Henglong Fan Date: Tue, 18 Aug 2020 21:42:33 +0800 Subject: [PATCH 1/2] build smt processor structure to support smt topology if vcpu support smt, create new smt hierarchy according to Processor Properties Topology Table(PPTT) in acpi spec 6.3. Threads sharing a core must be grouped under a unique Processor hierarchy node structure for each group of threads Signed-off-by: Henglong Fan Signed-off-by: imxcc --- hw/acpi/aml-build.c | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index 74e950057b..8a3b51c835 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -53,7 +53,7 @@ static void build_append_array(GArray *array, GArray *val) } /* - * ACPI 6.2 Processor Properties Topology Table (PPTT) + * ACPI 6.3 Processor Properties Topology Table (PPTT) */ #ifdef __aarch64__ static void build_cache_head(GArray *tbl, uint32_t next_level) @@ -126,7 +126,7 @@ static void build_arm_socket_hierarchy(GArray *tbl, build_append_int_noprefix(tbl, offset, 4); } -static void build_arm_cpu_hierarchy(GArray *tbl, +static void build_arm_core_hierarchy(GArray *tbl, struct offset_status *offset, uint32_t id) { if (!offset) { @@ -144,18 +144,35 @@ static void build_arm_cpu_hierarchy(GArray *tbl, build_append_int_noprefix(tbl, offset->l2_offset, 4); } +static void build_arm_smt_hierarchy(GArray *tbl, + uint32_t offset, uint32_t id) +{ + if (!offset) { + return; + } + build_append_byte(tbl, 0); /* Type 0 - processor */ + build_append_byte(tbl, 20); /* Length, add private resources */ + build_append_int_noprefix(tbl, 0, 2); /* Reserved */ + build_append_int_noprefix(tbl, 14, 4); /* Valid id*/ + build_append_int_noprefix(tbl, offset, 4); + build_append_int_noprefix(tbl, id, 4); + build_append_int_noprefix(tbl, 0, 4); /* Num private resources */ +} + void build_pptt(GArray *table_data, BIOSLinker *linker, int possible_cpus) { int pptt_start = table_data->len; - int uid = 0, cpus = 0, socket; + int uid = 0, socket; + uint32_t core_offset; struct offset_status offset; const MachineState *ms = MACHINE(qdev_get_machine()); unsigned int smp_cores = ms->smp.cores; + unsigned int smp_sockets = ms->smp.cpus / (smp_cores * ms->smp.threads); acpi_data_push(table_data, sizeof(AcpiTableHeader)); - for (socket = 0; cpus < possible_cpus; socket++) { - int core; + for (socket = 0; socket < smp_sockets; socket++) { + int core,thread; uint32_t l3_offset = table_data->len - pptt_start; build_cache_hierarchy(table_data, 0, ARM_L3_CACHE); @@ -169,14 +186,21 @@ void build_pptt(GArray *table_data, BIOSLinker *linker, int possible_cpus) build_cache_hierarchy(table_data, offset.l2_offset, ARM_L1D_CACHE); offset.l1i_offset = table_data->len - pptt_start; build_cache_hierarchy(table_data, offset.l2_offset, ARM_L1I_CACHE); - build_arm_cpu_hierarchy(table_data, &offset, uid++); - cpus++; + core_offset = table_data->len - pptt_start; + if (ms->smp.threads <= 1) { + build_arm_core_hierarchy(table_data, &offset, uid++); + } else { + build_arm_core_hierarchy(table_data, &offset, core); + for (thread = 0; thread < ms->smp.threads; thread++) { + build_arm_smt_hierarchy(table_data, core_offset, uid++); + } + } } } build_header(linker, table_data, (void *)(table_data->data + pptt_start), "PPTT", - table_data->len - pptt_start, 1, NULL, NULL); + table_data->len - pptt_start, 2, NULL, NULL); } #else -- Gitee From 7ce377a61a6d8be62e1f5b7b878d93a44b3cdf4d Mon Sep 17 00:00:00 2001 From: kevinZhu Date: Thu, 29 Oct 2020 19:24:48 +0800 Subject: [PATCH 2/2] Bugfix: hw/acpi: Use max_cpus instead of cpus when build PPTT table The field "cpus" is the initial number of CPU for guest, and the field "max_cpus" is the max number of CPU after CPU hotplug. When building PPTT for guest, we should take all CPUs into account, otherwise the "smp_sockets" is wrong. Fixes: 7cfcd8c8a2fe ("build smt processor structure to support smt topology") Signed-off-by: Keqian Zhu Signed-off-by: imxcc --- hw/acpi/aml-build.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index 8a3b51c835..f01669df57 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -167,7 +167,7 @@ void build_pptt(GArray *table_data, BIOSLinker *linker, int possible_cpus) struct offset_status offset; const MachineState *ms = MACHINE(qdev_get_machine()); unsigned int smp_cores = ms->smp.cores; - unsigned int smp_sockets = ms->smp.cpus / (smp_cores * ms->smp.threads); + unsigned int smp_sockets = ms->smp.max_cpus / (smp_cores * ms->smp.threads); acpi_data_push(table_data, sizeof(AcpiTableHeader)); -- Gitee