Blame SOURCES/kvm-hw-arm-virt-Consider-SMP-configuration-in-CPU-topolo.patch

586cba
From 3b05d3464945295112b5d02d142422f524a52054 Mon Sep 17 00:00:00 2001
586cba
From: Gavin Shan <gshan@redhat.com>
586cba
Date: Wed, 11 May 2022 18:01:35 +0800
586cba
Subject: [PATCH 03/16] hw/arm/virt: Consider SMP configuration in CPU topology
586cba
586cba
RH-Author: Gavin Shan <gshan@redhat.com>
586cba
RH-MergeRequest: 86: hw/arm/virt: Fix the default CPU topology
586cba
RH-Commit: [3/6] 7125b41f038c2b1cb33377d0ef1222f1ea42b648 (gwshan/qemu-rhel-9)
586cba
RH-Bugzilla: 2041823
586cba
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
586cba
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
586cba
RH-Acked-by: Andrew Jones <drjones@redhat.com>
586cba
586cba
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2041823
586cba
586cba
Currently, the SMP configuration isn't considered when the CPU
586cba
topology is populated. In this case, it's impossible to provide
586cba
the default CPU-to-NUMA mapping or association based on the socket
586cba
ID of the given CPU.
586cba
586cba
This takes account of SMP configuration when the CPU topology
586cba
is populated. The die ID for the given CPU isn't assigned since
586cba
it's not supported on arm/virt machine. Besides, the used SMP
586cba
configuration in qtest/numa-test/aarch64_numa_cpu() is corrcted
586cba
to avoid testing failure
586cba
586cba
Signed-off-by: Gavin Shan <gshan@redhat.com>
586cba
Reviewed-by: Yanan Wang <wangyanan55@huawei.com>
586cba
Acked-by: Igor Mammedov <imammedo@redhat.com>
586cba
Message-id: 20220503140304.855514-4-gshan@redhat.com
586cba
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
586cba
(cherry picked from commit c9ec4cb5e4936f980889e717524e73896b0200ed)
586cba
Signed-off-by: Gavin Shan <gshan@redhat.com>
586cba
---
586cba
 hw/arm/virt.c | 15 ++++++++++++++-
586cba
 1 file changed, 14 insertions(+), 1 deletion(-)
586cba
586cba
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
586cba
index 8be12e121d..a87c8d396a 100644
586cba
--- a/hw/arm/virt.c
586cba
+++ b/hw/arm/virt.c
586cba
@@ -2553,6 +2553,7 @@ static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms)
586cba
     int n;
586cba
     unsigned int max_cpus = ms->smp.max_cpus;
586cba
     VirtMachineState *vms = VIRT_MACHINE(ms);
586cba
+    MachineClass *mc = MACHINE_GET_CLASS(vms);
586cba
 
586cba
     if (ms->possible_cpus) {
586cba
         assert(ms->possible_cpus->len == max_cpus);
586cba
@@ -2566,8 +2567,20 @@ static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms)
586cba
         ms->possible_cpus->cpus[n].type = ms->cpu_type;
586cba
         ms->possible_cpus->cpus[n].arch_id =
586cba
             virt_cpu_mp_affinity(vms, n);
586cba
+
586cba
+        assert(!mc->smp_props.dies_supported);
586cba
+        ms->possible_cpus->cpus[n].props.has_socket_id = true;
586cba
+        ms->possible_cpus->cpus[n].props.socket_id =
586cba
+            n / (ms->smp.clusters * ms->smp.cores * ms->smp.threads);
586cba
+        ms->possible_cpus->cpus[n].props.has_cluster_id = true;
586cba
+        ms->possible_cpus->cpus[n].props.cluster_id =
586cba
+            (n / (ms->smp.cores * ms->smp.threads)) % ms->smp.clusters;
586cba
+        ms->possible_cpus->cpus[n].props.has_core_id = true;
586cba
+        ms->possible_cpus->cpus[n].props.core_id =
586cba
+            (n / ms->smp.threads) % ms->smp.cores;
586cba
         ms->possible_cpus->cpus[n].props.has_thread_id = true;
586cba
-        ms->possible_cpus->cpus[n].props.thread_id = n;
586cba
+        ms->possible_cpus->cpus[n].props.thread_id =
586cba
+            n % ms->smp.threads;
586cba
     }
586cba
     return ms->possible_cpus;
586cba
 }
586cba
-- 
586cba
2.31.1
586cba