All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Subject: [PULL 06/29] hw/arm/virt: Add 'compact-highmem' property
Date: Thu, 15 Dec 2022 12:49:46 +0000	[thread overview]
Message-ID: <20221215125009.980128-7-peter.maydell@linaro.org> (raw)
In-Reply-To: <20221215125009.980128-1-peter.maydell@linaro.org>

From: Gavin Shan <gshan@redhat.com>

After the improvement to high memory region address assignment is
applied, the memory layout can be changed, introducing possible
migration breakage. For example, VIRT_HIGH_PCIE_MMIO memory region
is disabled or enabled when the optimization is applied or not, with
the following configuration. The configuration is only achievable by
modifying the source code until more properties are added to allow
users selectively disable those high memory regions.

  pa_bits              = 40;
  vms->highmem_redists = false;
  vms->highmem_ecam    = false;
  vms->highmem_mmio    = true;

  # qemu-system-aarch64 -accel kvm -cpu host    \
    -machine virt-7.2,compact-highmem={on, off} \
    -m 4G,maxmem=511G -monitor stdio

  Region             compact-highmem=off         compact-highmem=on
  ----------------------------------------------------------------
  MEM                [1GB         512GB]        [1GB         512GB]
  HIGH_GIC_REDISTS2  [512GB       512GB+64MB]   [disabled]
  HIGH_PCIE_ECAM     [512GB+256MB 512GB+512MB]  [disabled]
  HIGH_PCIE_MMIO     [disabled]                 [512GB       1TB]

In order to keep backwords compatibility, we need to disable the
optimization on machine, which is virt-7.1 or ealier than it. It
means the optimization is enabled by default from virt-7.2. Besides,
'compact-highmem' property is added so that the optimization can be
explicitly enabled or disabled on all machine types by users.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Tested-by: Zhenyu Zhang <zhenyzha@redhat.com>
Message-id: 20221029224307.138822-7-gshan@redhat.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 docs/system/arm/virt.rst |  4 ++++
 include/hw/arm/virt.h    |  1 +
 hw/arm/virt.c            | 32 ++++++++++++++++++++++++++++++++
 3 files changed, 37 insertions(+)

diff --git a/docs/system/arm/virt.rst b/docs/system/arm/virt.rst
index 20442ea2c13..4454706392c 100644
--- a/docs/system/arm/virt.rst
+++ b/docs/system/arm/virt.rst
@@ -94,6 +94,10 @@ highmem
   address space above 32 bits. The default is ``on`` for machine types
   later than ``virt-2.12``.
 
+compact-highmem
+  Set ``on``/``off`` to enable/disable the compact layout for high memory regions.
+  The default is ``on`` for machine types later than ``virt-7.2``.
+
 gic-version
   Specify the version of the Generic Interrupt Controller (GIC) to provide.
   Valid values are:
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
index 709f6237412..c7dd59d7f1f 100644
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
@@ -125,6 +125,7 @@ struct VirtMachineClass {
     bool no_pmu;
     bool claim_edge_triggered_timers;
     bool smbios_old_sys_ver;
+    bool no_highmem_compact;
     bool no_highmem_ecam;
     bool no_ged;   /* Machines < 4.2 have no support for ACPI GED device */
     bool kvm_no_adjvtime;
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 807175707e7..3d1371c05c0 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -174,6 +174,12 @@ static const MemMapEntry base_memmap[] = {
  * Note the extended_memmap is sized so that it eventually also includes the
  * base_memmap entries (VIRT_HIGH_GIC_REDIST2 index is greater than the last
  * index of base_memmap).
+ *
+ * The memory map for these Highmem IO Regions can be in legacy or compact
+ * layout, depending on 'compact-highmem' property. With legacy layout, the
+ * PA space for one specific region is always reserved, even if the region
+ * has been disabled or doesn't fit into the PA space. However, the PA space
+ * for the region won't be reserved in these circumstances with compact layout.
  */
 static MemMapEntry extended_memmap[] = {
     /* Additional 64 MB redist region (can contain up to 512 redistributors) */
@@ -2352,6 +2358,20 @@ static void virt_set_highmem(Object *obj, bool value, Error **errp)
     vms->highmem = value;
 }
 
+static bool virt_get_compact_highmem(Object *obj, Error **errp)
+{
+    VirtMachineState *vms = VIRT_MACHINE(obj);
+
+    return vms->highmem_compact;
+}
+
+static void virt_set_compact_highmem(Object *obj, bool value, Error **errp)
+{
+    VirtMachineState *vms = VIRT_MACHINE(obj);
+
+    vms->highmem_compact = value;
+}
+
 static bool virt_get_its(Object *obj, Error **errp)
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
@@ -2970,6 +2990,13 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
                                           "Set on/off to enable/disable using "
                                           "physical address space above 32 bits");
 
+    object_class_property_add_bool(oc, "compact-highmem",
+                                   virt_get_compact_highmem,
+                                   virt_set_compact_highmem);
+    object_class_property_set_description(oc, "compact-highmem",
+                                          "Set on/off to enable/disable compact "
+                                          "layout for high memory regions");
+
     object_class_property_add_str(oc, "gic-version", virt_get_gic_version,
                                   virt_set_gic_version);
     object_class_property_set_description(oc, "gic-version",
@@ -3054,6 +3081,7 @@ static void virt_instance_init(Object *obj)
 
     /* High memory is enabled by default */
     vms->highmem = true;
+    vms->highmem_compact = !vmc->no_highmem_compact;
     vms->gic_version = VIRT_GIC_VERSION_NOSEL;
 
     vms->highmem_ecam = !vmc->no_highmem_ecam;
@@ -3123,8 +3151,12 @@ DEFINE_VIRT_MACHINE_AS_LATEST(7, 2)
 
 static void virt_machine_7_1_options(MachineClass *mc)
 {
+    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
+
     virt_machine_7_2_options(mc);
     compat_props_add(mc->compat_props, hw_compat_7_1, hw_compat_7_1_len);
+    /* Compact layout for high memory regions was introduced with 7.2 */
+    vmc->no_highmem_compact = true;
 }
 DEFINE_VIRT_MACHINE(7, 1)
 
-- 
2.25.1



  parent reply	other threads:[~2022-12-15 13:10 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-15 12:49 [PULL 00/29] target-arm queue Peter Maydell
2022-12-15 12:49 ` [PULL 01/29] hw/arm/virt: Introduce virt_set_high_memmap() helper Peter Maydell
2022-12-15 12:49 ` [PULL 02/29] hw/arm/virt: Rename variable size to region_size in virt_set_high_memmap() Peter Maydell
2022-12-15 12:49 ` [PULL 03/29] hw/arm/virt: Introduce variable region_base " Peter Maydell
2022-12-15 12:49 ` [PULL 04/29] hw/arm/virt: Introduce virt_get_high_memmap_enabled() helper Peter Maydell
2022-12-15 12:49 ` [PULL 05/29] hw/arm/virt: Improve high memory region address assignment Peter Maydell
2022-12-15 12:49 ` Peter Maydell [this message]
2022-12-15 12:49 ` [PULL 07/29] hw/arm/virt: Add properties to disable high memory regions Peter Maydell
2022-12-15 12:49 ` [PULL 08/29] hw/arm/virt: build SMBIOS 19 table Peter Maydell
2022-12-15 12:49 ` [PULL 09/29] target/arm: Add Cortex-A55 CPU Peter Maydell
2022-12-15 12:49 ` [PULL 10/29] hw/intc/arm_gicv3: Fix GICD_TYPER ITLinesNumber advertisement Peter Maydell
2022-12-15 12:49 ` [PULL 11/29] target/arm: Allow relevant HCR bits to be written for FEAT_EVT Peter Maydell
2022-12-15 12:49 ` [PULL 12/29] target/arm: Implement HCR_EL2.TTLBIS traps Peter Maydell
2022-12-15 12:49 ` [PULL 13/29] target/arm: Implement HCR_EL2.TTLBOS traps Peter Maydell
2022-12-15 12:49 ` [PULL 14/29] target/arm: Implement HCR_EL2.TICAB,TOCU traps Peter Maydell
2022-12-15 12:49 ` [PULL 15/29] target/arm: Implement HCR_EL2.TID4 traps Peter Maydell
2022-12-15 12:49 ` [PULL 16/29] target/arm: Report FEAT_EVT for TCG '-cpu max' Peter Maydell
2022-12-15 12:49 ` [PULL 17/29] hw/arm: Convert TYPE_ARM_SMMU to 3-phase reset Peter Maydell
2022-12-15 12:49 ` [PULL 18/29] hw/arm: Convert TYPE_ARM_SMMUV3 " Peter Maydell
2022-12-15 12:49 ` [PULL 19/29] hw/intc: Convert TYPE_ARM_GIC_COMMON " Peter Maydell
2022-12-15 12:50 ` [PULL 20/29] hw/intc: Convert TYPE_ARM_GIC_KVM " Peter Maydell
2022-12-15 12:50 ` [PULL 21/29] hw/intc: Convert TYPE_ARM_GICV3_COMMON " Peter Maydell
2022-12-15 12:50 ` [PULL 22/29] hw/intc: Convert TYPE_KVM_ARM_GICV3 " Peter Maydell
2022-12-15 12:50 ` [PULL 23/29] hw/intc: Convert TYPE_ARM_GICV3_ITS_COMMON " Peter Maydell
2022-12-15 12:50 ` [PULL 24/29] hw/intc: Convert TYPE_ARM_GICV3_ITS " Peter Maydell
2022-12-15 12:50 ` [PULL 25/29] hw/intc: Convert TYPE_KVM_ARM_ITS " Peter Maydell
2022-12-15 12:50 ` [PULL 26/29] hw/arm/boot: set initrd with #address-cells type in fdt Peter Maydell
2022-12-15 12:50 ` [PULL 27/29] target/arm: align exposed ID registers with Linux Peter Maydell
2022-12-15 12:50 ` [PULL 28/29] hw/misc: Move some arm-related files from specific_ss into softmmu_ss Peter Maydell
2022-12-15 12:50 ` [PULL 29/29] target/arm: Restrict arm_cpu_exec_interrupt() to TCG accelerator Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221215125009.980128-7-peter.maydell@linaro.org \
    --to=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.