thebeanogamer / rpms / qemu-kvm

Forked from rpms/qemu-kvm 5 months ago
Clone

Blame SOURCES/kvm-hw-arm-virt-Introduce-virt_set_high_memmap-helper.patch

ed5979
From 5dff87c5ea60054709021025c9513ec259433ce2 Mon Sep 17 00:00:00 2001
ed5979
From: Gavin Shan <gshan@redhat.com>
ed5979
Date: Wed, 21 Dec 2022 08:48:45 +0800
ed5979
Subject: [PATCH 1/8] hw/arm/virt: Introduce virt_set_high_memmap() helper
ed5979
ed5979
RH-Author: Gavin Shan <gshan@redhat.com>
ed5979
RH-MergeRequest: 126: hw/arm/virt: Optimize high memory region address assignment
ed5979
RH-Bugzilla: 2113840
ed5979
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
ed5979
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
ed5979
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
ed5979
RH-Commit: [1/8] 5f6ba5af7a2c21d8473c58e088ee99b11336c673
ed5979
ed5979
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2113840
ed5979
ed5979
This introduces virt_set_high_memmap() helper. The logic of high
ed5979
memory region address assignment is moved to the helper. The intention
ed5979
is to make the subsequent optimization for high memory region address
ed5979
assignment easier.
ed5979
ed5979
No functional change intended.
ed5979
ed5979
Signed-off-by: Gavin Shan <gshan@redhat.com>
ed5979
Reviewed-by: Eric Auger <eric.auger@redhat.com>
ed5979
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
ed5979
Reviewed-by: Marc Zyngier <maz@kernel.org>
ed5979
Tested-by: Zhenyu Zhang <zhenyzha@redhat.com>
ed5979
Message-id: 20221029224307.138822-2-gshan@redhat.com
ed5979
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
ed5979
(cherry picked from commit 4af6b6edece5ef273d29972d53547f823d2bc1c0)
ed5979
Signed-off-by: Gavin Shan <gshan@redhat.com>
ed5979
---
ed5979
 hw/arm/virt.c | 74 ++++++++++++++++++++++++++++-----------------------
ed5979
 1 file changed, 41 insertions(+), 33 deletions(-)
ed5979
ed5979
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
ed5979
index bf18838b87..bea5f54720 100644
ed5979
--- a/hw/arm/virt.c
ed5979
+++ b/hw/arm/virt.c
ed5979
@@ -1736,6 +1736,46 @@ static uint64_t virt_cpu_mp_affinity(VirtMachineState *vms, int idx)
ed5979
     return arm_cpu_mp_affinity(idx, clustersz);
ed5979
 }
ed5979
 
ed5979
+static void virt_set_high_memmap(VirtMachineState *vms,
ed5979
+                                 hwaddr base, int pa_bits)
ed5979
+{
ed5979
+    int i;
ed5979
+
ed5979
+    for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) {
ed5979
+        hwaddr size = extended_memmap[i].size;
ed5979
+        bool fits;
ed5979
+
ed5979
+        base = ROUND_UP(base, size);
ed5979
+        vms->memmap[i].base = base;
ed5979
+        vms->memmap[i].size = size;
ed5979
+
ed5979
+        /*
ed5979
+         * Check each device to see if they fit in the PA space,
ed5979
+         * moving highest_gpa as we go.
ed5979
+         *
ed5979
+         * For each device that doesn't fit, disable it.
ed5979
+         */
ed5979
+        fits = (base + size) <= BIT_ULL(pa_bits);
ed5979
+        if (fits) {
ed5979
+            vms->highest_gpa = base + size - 1;
ed5979
+        }
ed5979
+
ed5979
+        switch (i) {
ed5979
+        case VIRT_HIGH_GIC_REDIST2:
ed5979
+            vms->highmem_redists &= fits;
ed5979
+            break;
ed5979
+        case VIRT_HIGH_PCIE_ECAM:
ed5979
+            vms->highmem_ecam &= fits;
ed5979
+            break;
ed5979
+        case VIRT_HIGH_PCIE_MMIO:
ed5979
+            vms->highmem_mmio &= fits;
ed5979
+            break;
ed5979
+        }
ed5979
+
ed5979
+        base += size;
ed5979
+    }
ed5979
+}
ed5979
+
ed5979
 static void virt_set_memmap(VirtMachineState *vms, int pa_bits)
ed5979
 {
ed5979
     MachineState *ms = MACHINE(vms);
ed5979
@@ -1791,39 +1831,7 @@ static void virt_set_memmap(VirtMachineState *vms, int pa_bits)
ed5979
     /* We know for sure that at least the memory fits in the PA space */
ed5979
     vms->highest_gpa = memtop - 1;
ed5979
 
ed5979
-    for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) {
ed5979
-        hwaddr size = extended_memmap[i].size;
ed5979
-        bool fits;
ed5979
-
ed5979
-        base = ROUND_UP(base, size);
ed5979
-        vms->memmap[i].base = base;
ed5979
-        vms->memmap[i].size = size;
ed5979
-
ed5979
-        /*
ed5979
-         * Check each device to see if they fit in the PA space,
ed5979
-         * moving highest_gpa as we go.
ed5979
-         *
ed5979
-         * For each device that doesn't fit, disable it.
ed5979
-         */
ed5979
-        fits = (base + size) <= BIT_ULL(pa_bits);
ed5979
-        if (fits) {
ed5979
-            vms->highest_gpa = base + size - 1;
ed5979
-        }
ed5979
-
ed5979
-        switch (i) {
ed5979
-        case VIRT_HIGH_GIC_REDIST2:
ed5979
-            vms->highmem_redists &= fits;
ed5979
-            break;
ed5979
-        case VIRT_HIGH_PCIE_ECAM:
ed5979
-            vms->highmem_ecam &= fits;
ed5979
-            break;
ed5979
-        case VIRT_HIGH_PCIE_MMIO:
ed5979
-            vms->highmem_mmio &= fits;
ed5979
-            break;
ed5979
-        }
ed5979
-
ed5979
-        base += size;
ed5979
-    }
ed5979
+    virt_set_high_memmap(vms, base, pa_bits);
ed5979
 
ed5979
     if (device_memory_size > 0) {
ed5979
         ms->device_memory = g_malloc0(sizeof(*ms->device_memory));
ed5979
-- 
ed5979
2.31.1
ed5979