thebeanogamer / rpms / qemu-kvm

Forked from rpms/qemu-kvm 5 months ago
Clone

Blame SOURCES/kvm-hw-arm-virt-Improve-high-memory-region-address-assig.patch

ed5979
From 1c7fad3776a14ca35b24dc2fdb262d4ddf40d6eb 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 5/8] hw/arm/virt: Improve high memory region address
ed5979
 assignment
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: [5/8] 4d77fa78b5258a1bd8d30405cec5ba3311d42f92
ed5979
ed5979
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2113840
ed5979
ed5979
There are three high memory regions, which are VIRT_HIGH_REDIST2,
ed5979
VIRT_HIGH_PCIE_ECAM and VIRT_HIGH_PCIE_MMIO. Their base addresses
ed5979
are floating on highest RAM address. However, they can be disabled
ed5979
in several cases.
ed5979
ed5979
(1) One specific high memory region is likely to be disabled by
ed5979
    code by toggling vms->highmem_{redists, ecam, mmio}.
ed5979
ed5979
(2) VIRT_HIGH_PCIE_ECAM region is disabled on machine, which is
ed5979
    'virt-2.12' or ealier than it.
ed5979
ed5979
(3) VIRT_HIGH_PCIE_ECAM region is disabled when firmware is loaded
ed5979
    on 32-bits system.
ed5979
ed5979
(4) One specific high memory region is disabled when it breaks the
ed5979
    PA space limit.
ed5979
ed5979
The current implementation of virt_set_{memmap, high_memmap}() isn't
ed5979
optimized because the high memory region's PA space is always reserved,
ed5979
regardless of whatever the actual state in the corresponding
ed5979
vms->highmem_{redists, ecam, mmio} flag. In the code, 'base' and
ed5979
'vms->highest_gpa' are always increased for case (1), (2) and (3).
ed5979
It's unnecessary since the assigned PA space for the disabled high
ed5979
memory region won't be used afterwards.
ed5979
ed5979
Improve the address assignment for those three high memory region by
ed5979
skipping the address assignment for one specific high memory region if
ed5979
it has been disabled in case (1), (2) and (3). The memory layout may
ed5979
be changed after the improvement is applied, which leads to potential
ed5979
migration breakage. So 'vms->highmem_compact' is added to control if
ed5979
the improvement should be applied. For now, 'vms->highmem_compact' is
ed5979
set to false, meaning that we don't have memory layout change until it
ed5979
becomes configurable through property 'compact-highmem' in next patch.
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-6-gshan@redhat.com
ed5979
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
ed5979
(cherry picked from commit 4a4ff9edc6a8fdc76082af5b41b059217138c09b)
ed5979
Signed-off-by: Gavin Shan <gshan@redhat.com>
ed5979
---
ed5979
 hw/arm/virt.c         | 15 ++++++++++-----
ed5979
 include/hw/arm/virt.h |  1 +
ed5979
 2 files changed, 11 insertions(+), 5 deletions(-)
ed5979
ed5979
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
ed5979
index 6e3b9fc060..6896e0ca0f 100644
ed5979
--- a/hw/arm/virt.c
ed5979
+++ b/hw/arm/virt.c
ed5979
@@ -1768,18 +1768,23 @@ static void virt_set_high_memmap(VirtMachineState *vms,
ed5979
         vms->memmap[i].size = region_size;
ed5979
 
ed5979
         /*
ed5979
-         * Check each device to see if they fit in the PA space,
ed5979
-         * moving highest_gpa as we go.
ed5979
+         * Check each device to see if it fits in the PA space,
ed5979
+         * moving highest_gpa as we go. For compatibility, move
ed5979
+         * highest_gpa for disabled fitting devices as well, if
ed5979
+         * the compact layout has been disabled.
ed5979
          *
ed5979
          * For each device that doesn't fit, disable it.
ed5979
          */
ed5979
         fits = (region_base + region_size) <= BIT_ULL(pa_bits);
ed5979
-        if (fits) {
ed5979
-            vms->highest_gpa = region_base + region_size - 1;
ed5979
+        *region_enabled &= fits;
ed5979
+        if (vms->highmem_compact && !*region_enabled) {
ed5979
+            continue;
ed5979
         }
ed5979
 
ed5979
-        *region_enabled &= fits;
ed5979
         base = region_base + region_size;
ed5979
+        if (fits) {
ed5979
+            vms->highest_gpa = base - 1;
ed5979
+        }
ed5979
     }
ed5979
 }
ed5979
 
ed5979
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
ed5979
index 22b54ec510..15bd291311 100644
ed5979
--- a/include/hw/arm/virt.h
ed5979
+++ b/include/hw/arm/virt.h
ed5979
@@ -144,6 +144,7 @@ struct VirtMachineState {
ed5979
     PFlashCFI01 *flash[2];
ed5979
     bool secure;
ed5979
     bool highmem;
ed5979
+    bool highmem_compact;
ed5979
     bool highmem_ecam;
ed5979
     bool highmem_mmio;
ed5979
     bool highmem_redists;
ed5979
-- 
ed5979
2.31.1
ed5979