[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 004/136] machine: introduce convenience MachineState::ram
From: |
Paolo Bonzini |
Subject: |
[PULL 004/136] machine: introduce convenience MachineState::ram |
Date: |
Tue, 25 Feb 2020 12:48:54 +0100 |
From: Igor Mammedov <address@hidden>
the new field will be used by boards to get access to main
RAM memory region and will help to save boiler plate in
boards which often introduce a field or variable just for
this purpose.
Memory region will be equivalent to what currently used
memory_region_allocate_system_memory() is returning apart
from that it will come from hostmem backend.
Followup patches will incrementally switch boards to using
RAM from MachineState::ram.
Patch takes care of non-NUMA case and follow up patch will
initialize MachineState::ram for NUMA case.
Signed-off-by: Igor Mammedov <address@hidden>
Reviewed-by: Richard Henderson <address@hidden>
Message-Id: <address@hidden>
---
hw/core/machine.c | 24 ++++++++++++++++++++++++
hw/core/numa.c | 14 +-------------
include/hw/boards.h | 12 +++++++++++-
3 files changed, 36 insertions(+), 14 deletions(-)
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 1a6e485..c8d361b 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -26,6 +26,7 @@
#include "sysemu/qtest.h"
#include "hw/pci/pci.h"
#include "hw/mem/nvdimm.h"
+#include "migration/vmstate.h"
GlobalProperty hw_compat_4_2[] = {
{ "virtio-blk-device", "x-enable-wce-if-config-wce", "off" },
@@ -1059,10 +1060,33 @@ static void machine_numa_finish_cpu_init(MachineState
*machine)
g_string_free(s, true);
}
+MemoryRegion *machine_consume_memdev(MachineState *machine,
+ HostMemoryBackend *backend)
+{
+ MemoryRegion *ret = host_memory_backend_get_memory(backend);
+
+ if (memory_region_is_mapped(ret)) {
+ char *path = object_get_canonical_path_component(OBJECT(backend));
+ error_report("memory backend %s can't be used multiple times.", path);
+ g_free(path);
+ exit(EXIT_FAILURE);
+ }
+ host_memory_backend_set_mapped(backend, true);
+ vmstate_register_ram_global(ret);
+ return ret;
+}
+
void machine_run_board_init(MachineState *machine)
{
MachineClass *machine_class = MACHINE_GET_CLASS(machine);
+ if (machine->ram_memdev_id) {
+ Object *o;
+ o = object_resolve_path_type(machine->ram_memdev_id,
+ TYPE_MEMORY_BACKEND, NULL);
+ machine->ram = machine_consume_memdev(machine, MEMORY_BACKEND(o));
+ }
+
if (machine->numa_state) {
numa_complete_configuration(machine);
if (machine->numa_state->num_nodes) {
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 840e685..8264336 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -817,20 +817,8 @@ void memory_region_allocate_system_memory(MemoryRegion
*mr, Object *owner,
if (!backend) {
continue;
}
- MemoryRegion *seg = host_memory_backend_get_memory(backend);
-
- if (memory_region_is_mapped(seg)) {
- char *path = object_get_canonical_path_component(OBJECT(backend));
- error_report("memory backend %s is used multiple times. Each "
- "-numa option must use a different memdev value.",
- path);
- g_free(path);
- exit(1);
- }
-
- host_memory_backend_set_mapped(backend, true);
+ MemoryRegion *seg = machine_consume_memdev(ms, backend);
memory_region_add_subregion(mr, addr, seg);
- vmstate_register_ram_global(seg);
addr += size;
}
}
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 8e536ca..ae2b60f 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -73,7 +73,12 @@ void machine_set_cpu_numa_node(MachineState *machine,
Error **errp);
void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char
*type);
-
+/*
+ * Checks that backend isn't used, preps it for exclusive usage and
+ * returns migratable MemoryRegion provided by backend.
+ */
+MemoryRegion *machine_consume_memdev(MachineState *machine,
+ HostMemoryBackend *backend);
/**
* CPUArchId:
@@ -295,6 +300,11 @@ struct MachineState {
bool enable_graphics;
char *memory_encryption;
char *ram_memdev_id;
+ /*
+ * convenience alias to ram_memdev_id backend memory region
+ * or to numa container memory region
+ */
+ MemoryRegion *ram;
DeviceMemoryState *device_memory;
ram_addr_t ram_size;
--
1.8.3.1
- [PULL 000/136] Misc patches for 2020-02-25 (refactoring and Coccinelle edition), Paolo Bonzini, 2020/02/25
- [PULL 003/136] machine: alias -mem-path and -mem-prealloc into memory-foo backend, Paolo Bonzini, 2020/02/25
- [PULL 007/136] vl.c: ensure that ram_size matches size of machine.memory-backend, Paolo Bonzini, 2020/02/25
- [PULL 011/136] arm/collie: use memdev for RAM, Paolo Bonzini, 2020/02/25
- [PULL 004/136] machine: introduce convenience MachineState::ram,
Paolo Bonzini <=
- [PULL 002/136] machine: introduce memory-backend property, Paolo Bonzini, 2020/02/25
- [PULL 006/136] vl.c: move -m parsing after memory backends has been processed, Paolo Bonzini, 2020/02/25
- [PULL 012/136] arm/cubieboard: use memdev for RAM, Paolo Bonzini, 2020/02/25
- [PULL 009/136] arm/aspeed: actually check RAM size, Paolo Bonzini, 2020/02/25
- [PULL 008/136] alpha/dp264: use memdev for RAM, Paolo Bonzini, 2020/02/25
- [PULL 014/136] arm/highbank: use memdev for RAM, Paolo Bonzini, 2020/02/25
- [PULL 016/136] arm/imx25_pdk: use memdev for RAM, Paolo Bonzini, 2020/02/25
- [PULL 018/136] arm/kzm: drop RAM size fixup, Paolo Bonzini, 2020/02/25
- [PULL 005/136] initialize MachineState::ram in NUMA case, Paolo Bonzini, 2020/02/25
- [PULL 013/136] arm/digic_boards: use memdev for RAM, Paolo Bonzini, 2020/02/25