|
|
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 |
|