microvm: memory config tweaks

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.22 (GNU/Linux)
 
 iQIcBAABCgAGBQJe6gx8AAoJEEy22O7T6HE4+9AP/ifAJaD8aAfzUe4OFZPGBELc
 cLLwq4EdEeq+WCYxbIIc3wQo2PY6PD/yHvPxtMApnMQjwyIiHyFFGe/TmbUc/s2w
 KZKiUU++X+eVGJwkWXijT7K0us11gs64k5n6YynV2cOAosl+YtAVk6Xd9FuJIc0y
 G/hEsGckkVVuSgHZBUt+HH8yaMjG2K10PQyiaUp0NoJbGv+Xviccds+H3pCNl6JD
 NCSRFNdVdb1sR5APgBDlmt/51oV/TaXMKpF4FBTzfLZCvcXBFkBaI1Z2hJQ25QM0
 9pSRA0GT/gQu69HuTMDZ6FZ9oH/w5gTkadvMeAZx8pyjQHkQWV3O3SP3eogSa+Up
 iAbg6JNzRZkaCReQoz8Gd9HgElSjYzlOsxiw2v7uXXIrEBLXGxKcMwdd9+Y/M2Lw
 aDHsI2T36KMVBPKGrcJgNPwKNZkHB6GulsYR47Zjcd3ASmQGmLD+KOhoL4cskMh+
 D3VxA8nJFQzdx+N3LTg2yYmolohyW6QN11mRcdkhsX+CjlpEmjVRvIDnYJSt3jf2
 5hdsKAxF9xKgk2oR6vXVUIllG24zxpP/cldB4U7tkSSBPRJvfZD44aD1vPI9ogpo
 NUaPllTWk39DkieiwMd2YtEKPEFIVKJWM51UvaNxWhInjAkeD+vx/iPSHkY6Cuje
 WWM485onOc3lzlYW+JZo
 =k1bm
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/kraxel/tags/microvm-20200617-pull-request' into staging

microvm: memory config tweaks

# gpg: Signature made Wed 17 Jun 2020 13:28:44 BST
# gpg:                using RSA key 4CB6D8EED3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" [full]
# gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>" [full]
# gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>" [full]
# Primary key fingerprint: A032 8CFF B93A 17A7 9901  FE7D 4CB6 D8EE D3E8 7138

* remotes/kraxel/tags/microvm-20200617-pull-request:
  microvm: move virtio base to 0xfeb00000
  x86: move max-ram-below-4g to pc
  microvm: drop max-ram-below-4g support
  microvm: use 3G split unconditionally

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2020-06-18 11:23:15 +01:00
commit 3f429a3400
9 changed files with 61 additions and 96 deletions

View File

@ -170,42 +170,9 @@ static void microvm_memory_init(MicrovmMachineState *mms)
MemoryRegion *ram_below_4g, *ram_above_4g; MemoryRegion *ram_below_4g, *ram_above_4g;
MemoryRegion *system_memory = get_system_memory(); MemoryRegion *system_memory = get_system_memory();
FWCfgState *fw_cfg; FWCfgState *fw_cfg;
ram_addr_t lowmem; ram_addr_t lowmem = 0xc0000000; /* 3G */
int i; int i;
/*
* Check whether RAM fits below 4G (leaving 1/2 GByte for IO memory
* and 256 Mbytes for PCI Express Enhanced Configuration Access Mapping
* also known as MMCFG).
* If it doesn't, we need to split it in chunks below and above 4G.
* In any case, try to make sure that guest addresses aligned at
* 1G boundaries get mapped to host addresses aligned at 1G boundaries.
*/
if (machine->ram_size >= 0xb0000000) {
lowmem = 0x80000000;
} else {
lowmem = 0xb0000000;
}
/*
* Handle the machine opt max-ram-below-4g. It is basically doing
* min(qemu limit, user limit).
*/
if (!x86ms->max_ram_below_4g) {
x86ms->max_ram_below_4g = 4 * GiB;
}
if (lowmem > x86ms->max_ram_below_4g) {
lowmem = x86ms->max_ram_below_4g;
if (machine->ram_size - lowmem > lowmem &&
lowmem & (1 * GiB - 1)) {
warn_report("There is possibly poor performance as the ram size "
" (0x%" PRIx64 ") is more then twice the size of"
" max-ram-below-4g (%"PRIu64") and"
" max-ram-below-4g is not a multiple of 1G.",
(uint64_t)machine->ram_size, x86ms->max_ram_below_4g);
}
}
if (machine->ram_size > lowmem) { if (machine->ram_size > lowmem) {
x86ms->above_4g_mem_size = machine->ram_size - lowmem; x86ms->above_4g_mem_size = machine->ram_size - lowmem;
x86ms->below_4g_mem_size = lowmem; x86ms->below_4g_mem_size = lowmem;

View File

@ -1857,6 +1857,45 @@ static void pc_machine_set_pit(Object *obj, bool value, Error **errp)
pcms->pit_enabled = value; pcms->pit_enabled = value;
} }
static void pc_machine_get_max_ram_below_4g(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
PCMachineState *pcms = PC_MACHINE(obj);
uint64_t value = pcms->max_ram_below_4g;
visit_type_size(v, name, &value, errp);
}
static void pc_machine_set_max_ram_below_4g(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
PCMachineState *pcms = PC_MACHINE(obj);
Error *error = NULL;
uint64_t value;
visit_type_size(v, name, &value, &error);
if (error) {
error_propagate(errp, error);
return;
}
if (value > 4 * GiB) {
error_setg(&error,
"Machine option 'max-ram-below-4g=%"PRIu64
"' expects size less than or equal to 4G", value);
error_propagate(errp, error);
return;
}
if (value < 1 * MiB) {
warn_report("Only %" PRIu64 " bytes of RAM below the 4GiB boundary,"
"BIOS may not work with less than 1MiB", value);
}
pcms->max_ram_below_4g = value;
}
static void pc_machine_initfn(Object *obj) static void pc_machine_initfn(Object *obj)
{ {
PCMachineState *pcms = PC_MACHINE(obj); PCMachineState *pcms = PC_MACHINE(obj);
@ -1866,6 +1905,7 @@ static void pc_machine_initfn(Object *obj)
#else #else
pcms->vmport = ON_OFF_AUTO_OFF; pcms->vmport = ON_OFF_AUTO_OFF;
#endif /* CONFIG_VMPORT */ #endif /* CONFIG_VMPORT */
pcms->max_ram_below_4g = 0; /* use default */
/* acpi build is enabled by default if machine supports it */ /* acpi build is enabled by default if machine supports it */
pcms->acpi_build_enabled = PC_MACHINE_GET_CLASS(pcms)->has_acpi_build; pcms->acpi_build_enabled = PC_MACHINE_GET_CLASS(pcms)->has_acpi_build;
pcms->smbus_enabled = true; pcms->smbus_enabled = true;
@ -1964,6 +2004,12 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
mc->numa_mem_supported = true; mc->numa_mem_supported = true;
mc->default_ram_id = "pc.ram"; mc->default_ram_id = "pc.ram";
object_class_property_add(oc, PC_MACHINE_MAX_RAM_BELOW_4G, "size",
pc_machine_get_max_ram_below_4g, pc_machine_set_max_ram_below_4g,
NULL, NULL);
object_class_property_set_description(oc, PC_MACHINE_MAX_RAM_BELOW_4G,
"Maximum ram below the 4G boundary (32bit boundary)");
object_class_property_add(oc, PC_MACHINE_DEVMEM_REGION_SIZE, "int", object_class_property_add(oc, PC_MACHINE_DEVMEM_REGION_SIZE, "int",
pc_machine_get_device_memory_region_size, NULL, pc_machine_get_device_memory_region_size, NULL,
NULL, NULL); NULL, NULL);

View File

@ -129,11 +129,11 @@ static void pc_init1(MachineState *machine,
if (xen_enabled()) { if (xen_enabled()) {
xen_hvm_init(pcms, &ram_memory); xen_hvm_init(pcms, &ram_memory);
} else { } else {
if (!x86ms->max_ram_below_4g) { if (!pcms->max_ram_below_4g) {
x86ms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */ pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
} }
lowmem = x86ms->max_ram_below_4g; lowmem = pcms->max_ram_below_4g;
if (machine->ram_size >= x86ms->max_ram_below_4g) { if (machine->ram_size >= pcms->max_ram_below_4g) {
if (pcmc->gigabyte_align) { if (pcmc->gigabyte_align) {
if (lowmem > 0xc0000000) { if (lowmem > 0xc0000000) {
lowmem = 0xc0000000; lowmem = 0xc0000000;
@ -142,7 +142,7 @@ static void pc_init1(MachineState *machine,
warn_report("Large machine and max_ram_below_4g " warn_report("Large machine and max_ram_below_4g "
"(%" PRIu64 ") not a multiple of 1G; " "(%" PRIu64 ") not a multiple of 1G; "
"possible bad performance.", "possible bad performance.",
x86ms->max_ram_below_4g); pcms->max_ram_below_4g);
} }
} }
} }

View File

@ -156,18 +156,18 @@ static void pc_q35_init(MachineState *machine)
/* Handle the machine opt max-ram-below-4g. It is basically doing /* Handle the machine opt max-ram-below-4g. It is basically doing
* min(qemu limit, user limit). * min(qemu limit, user limit).
*/ */
if (!x86ms->max_ram_below_4g) { if (!pcms->max_ram_below_4g) {
x86ms->max_ram_below_4g = 4 * GiB; pcms->max_ram_below_4g = 4 * GiB;
} }
if (lowmem > x86ms->max_ram_below_4g) { if (lowmem > pcms->max_ram_below_4g) {
lowmem = x86ms->max_ram_below_4g; lowmem = pcms->max_ram_below_4g;
if (machine->ram_size - lowmem > lowmem && if (machine->ram_size - lowmem > lowmem &&
lowmem & (1 * GiB - 1)) { lowmem & (1 * GiB - 1)) {
warn_report("There is possibly poor performance as the ram size " warn_report("There is possibly poor performance as the ram size "
" (0x%" PRIx64 ") is more then twice the size of" " (0x%" PRIx64 ") is more then twice the size of"
" max-ram-below-4g (%"PRIu64") and" " max-ram-below-4g (%"PRIu64") and"
" max-ram-below-4g is not a multiple of 1G.", " max-ram-below-4g is not a multiple of 1G.",
(uint64_t)machine->ram_size, x86ms->max_ram_below_4g); (uint64_t)machine->ram_size, pcms->max_ram_below_4g);
} }
} }

View File

@ -846,45 +846,6 @@ void x86_bios_rom_init(MemoryRegion *rom_memory, bool isapc_ram_fw)
bios); bios);
} }
static void x86_machine_get_max_ram_below_4g(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
X86MachineState *x86ms = X86_MACHINE(obj);
uint64_t value = x86ms->max_ram_below_4g;
visit_type_size(v, name, &value, errp);
}
static void x86_machine_set_max_ram_below_4g(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
X86MachineState *x86ms = X86_MACHINE(obj);
Error *error = NULL;
uint64_t value;
visit_type_size(v, name, &value, &error);
if (error) {
error_propagate(errp, error);
return;
}
if (value > 4 * GiB) {
error_setg(&error,
"Machine option 'max-ram-below-4g=%"PRIu64
"' expects size less than or equal to 4G", value);
error_propagate(errp, error);
return;
}
if (value < 1 * MiB) {
warn_report("Only %" PRIu64 " bytes of RAM below the 4GiB boundary,"
"BIOS may not work with less than 1MiB", value);
}
x86ms->max_ram_below_4g = value;
}
bool x86_machine_is_smm_enabled(X86MachineState *x86ms) bool x86_machine_is_smm_enabled(X86MachineState *x86ms)
{ {
bool smm_available = false; bool smm_available = false;
@ -958,7 +919,6 @@ static void x86_machine_initfn(Object *obj)
x86ms->smm = ON_OFF_AUTO_AUTO; x86ms->smm = ON_OFF_AUTO_AUTO;
x86ms->acpi = ON_OFF_AUTO_AUTO; x86ms->acpi = ON_OFF_AUTO_AUTO;
x86ms->max_ram_below_4g = 0; /* use default */
x86ms->smp_dies = 1; x86ms->smp_dies = 1;
x86ms->apicid_from_cpu_idx = x86_apicid_from_cpu_idx; x86ms->apicid_from_cpu_idx = x86_apicid_from_cpu_idx;
@ -980,12 +940,6 @@ static void x86_machine_class_init(ObjectClass *oc, void *data)
x86mc->save_tsc_khz = true; x86mc->save_tsc_khz = true;
nc->nmi_monitor_handler = x86_nmi; nc->nmi_monitor_handler = x86_nmi;
object_class_property_add(oc, X86_MACHINE_MAX_RAM_BELOW_4G, "size",
x86_machine_get_max_ram_below_4g, x86_machine_set_max_ram_below_4g,
NULL, NULL);
object_class_property_set_description(oc, X86_MACHINE_MAX_RAM_BELOW_4G,
"Maximum ram below the 4G boundary (32bit boundary)");
object_class_property_add(oc, X86_MACHINE_SMM, "OnOffAuto", object_class_property_add(oc, X86_MACHINE_SMM, "OnOffAuto",
x86_machine_get_smm, x86_machine_set_smm, x86_machine_get_smm, x86_machine_set_smm,
NULL, NULL); NULL, NULL);

View File

@ -205,7 +205,7 @@ static void xen_ram_init(PCMachineState *pcms,
ram_addr_t block_len; ram_addr_t block_len;
uint64_t user_lowmem = uint64_t user_lowmem =
object_property_get_uint(qdev_get_machine(), object_property_get_uint(qdev_get_machine(),
X86_MACHINE_MAX_RAM_BELOW_4G, PC_MACHINE_MAX_RAM_BELOW_4G,
&error_abort); &error_abort);
/* Handle the machine opt max-ram-below-4g. It is basically doing /* Handle the machine opt max-ram-below-4g. It is basically doing

View File

@ -26,7 +26,7 @@
#include "hw/i386/x86.h" #include "hw/i386/x86.h"
/* Platform virtio definitions */ /* Platform virtio definitions */
#define VIRTIO_MMIO_BASE 0xc0000000 #define VIRTIO_MMIO_BASE 0xfeb00000
#define VIRTIO_IRQ_BASE 5 #define VIRTIO_IRQ_BASE 5
#define VIRTIO_NUM_TRANSPORTS 8 #define VIRTIO_NUM_TRANSPORTS 8
#define VIRTIO_CMDLINE_MAXLEN 64 #define VIRTIO_CMDLINE_MAXLEN 64

View File

@ -35,6 +35,7 @@ struct PCMachineState {
PFlashCFI01 *flash[2]; PFlashCFI01 *flash[2];
/* Configuration options: */ /* Configuration options: */
uint64_t max_ram_below_4g;
OnOffAuto vmport; OnOffAuto vmport;
bool acpi_build_enabled; bool acpi_build_enabled;
@ -51,6 +52,7 @@ struct PCMachineState {
}; };
#define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device" #define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device"
#define PC_MACHINE_MAX_RAM_BELOW_4G "max-ram-below-4g"
#define PC_MACHINE_DEVMEM_REGION_SIZE "device-memory-region-size" #define PC_MACHINE_DEVMEM_REGION_SIZE "device-memory-region-size"
#define PC_MACHINE_VMPORT "vmport" #define PC_MACHINE_VMPORT "vmport"
#define PC_MACHINE_SMBUS "smbus" #define PC_MACHINE_SMBUS "smbus"

View File

@ -51,9 +51,6 @@ typedef struct {
qemu_irq *gsi; qemu_irq *gsi;
GMappedFile *initrd_mapped_file; GMappedFile *initrd_mapped_file;
/* Configuration options: */
uint64_t max_ram_below_4g;
/* RAM information (sizes, addresses, configuration): */ /* RAM information (sizes, addresses, configuration): */
ram_addr_t below_4g_mem_size, above_4g_mem_size; ram_addr_t below_4g_mem_size, above_4g_mem_size;
@ -82,7 +79,6 @@ typedef struct {
AddressSpace *ioapic_as; AddressSpace *ioapic_as;
} X86MachineState; } X86MachineState;
#define X86_MACHINE_MAX_RAM_BELOW_4G "max-ram-below-4g"
#define X86_MACHINE_SMM "smm" #define X86_MACHINE_SMM "smm"
#define X86_MACHINE_ACPI "acpi" #define X86_MACHINE_ACPI "acpi"