qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] memory-device: Track used region size in DeviceMemoryState
@ 2023-06-01 12:14 David Hildenbrand
  2023-06-01 12:14 ` [PATCH v3 00/10] memory-device: Some cleanups David Hildenbrand
                   ` (11 more replies)
  0 siblings, 12 replies; 16+ messages in thread
From: David Hildenbrand @ 2023-06-01 12:14 UTC (permalink / raw)
  To: qemu-devel
  Cc: qemu-arm, qemu-ppc, Igor Mammedov, Philippe Mathieu-Daudé,
	Xiao Guangrong, David Hildenbrand

Let's avoid iterating over all devices and simply track it in the
DeviceMemoryState.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/mem/memory-device.c | 22 +++-------------------
 include/hw/boards.h    |  2 ++
 2 files changed, 5 insertions(+), 19 deletions(-)

diff --git a/hw/mem/memory-device.c b/hw/mem/memory-device.c
index 00c7755557..667d56bd29 100644
--- a/hw/mem/memory-device.c
+++ b/hw/mem/memory-device.c
@@ -52,28 +52,11 @@ static int memory_device_build_list(Object *obj, void *opaque)
     return 0;
 }
 
-static int memory_device_used_region_size(Object *obj, void *opaque)
-{
-    uint64_t *size = opaque;
-
-    if (object_dynamic_cast(obj, TYPE_MEMORY_DEVICE)) {
-        const DeviceState *dev = DEVICE(obj);
-        const MemoryDeviceState *md = MEMORY_DEVICE(obj);
-
-        if (dev->realized) {
-            *size += memory_device_get_region_size(md, &error_abort);
-        }
-    }
-
-    object_child_foreach(obj, memory_device_used_region_size, opaque);
-    return 0;
-}
-
 static void memory_device_check_addable(MachineState *ms, MemoryRegion *mr,
                                         Error **errp)
 {
+    const uint64_t used_region_size = ms->device_memory->used_region_size;
     const uint64_t size = memory_region_size(mr);
-    uint64_t used_region_size = 0;
 
     /* we will need a new memory slot for kvm and vhost */
     if (kvm_enabled() && !kvm_has_free_slot(ms)) {
@@ -86,7 +69,6 @@ static void memory_device_check_addable(MachineState *ms, MemoryRegion *mr,
     }
 
     /* will we exceed the total amount of memory specified */
-    memory_device_used_region_size(OBJECT(ms), &used_region_size);
     if (used_region_size + size < used_region_size ||
         used_region_size + size > ms->maxram_size - ms->ram_size) {
         error_setg(errp, "not enough space, currently 0x%" PRIx64
@@ -292,6 +274,7 @@ void memory_device_plug(MemoryDeviceState *md, MachineState *ms)
     mr = mdc->get_memory_region(md, &error_abort);
     g_assert(ms->device_memory);
 
+    ms->device_memory->used_region_size += memory_region_size(mr);
     memory_region_add_subregion(&ms->device_memory->mr,
                                 addr - ms->device_memory->base, mr);
     trace_memory_device_plug(DEVICE(md)->id ? DEVICE(md)->id : "", addr);
@@ -310,6 +293,7 @@ void memory_device_unplug(MemoryDeviceState *md, MachineState *ms)
     g_assert(ms->device_memory);
 
     memory_region_del_subregion(&ms->device_memory->mr, mr);
+    ms->device_memory->used_region_size -= memory_region_size(mr);
     trace_memory_device_unplug(DEVICE(md)->id ? DEVICE(md)->id : "",
                                mdc->get_addr(md));
 }
diff --git a/include/hw/boards.h b/include/hw/boards.h
index be06e8a41f..fcaf40b9da 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -296,11 +296,13 @@ struct MachineClass {
  * address space for memory devices starts
  * @mr: address space container for memory devices
  * @dimm_size: the sum of plugged DIMMs' sizes
+ * @used_region_size: the part of @mr already used by memory devices
  */
 typedef struct DeviceMemoryState {
     hwaddr base;
     MemoryRegion mr;
     uint64_t dimm_size;
+    uint64_t used_region_size;
 } DeviceMemoryState;
 
 /**
-- 
2.40.1



^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2023-06-14 13:05 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-01 12:14 [PATCH] memory-device: Track used region size in DeviceMemoryState David Hildenbrand
2023-06-01 12:14 ` [PATCH v3 00/10] memory-device: Some cleanups David Hildenbrand
2023-06-14  9:10   ` David Hildenbrand
2023-06-01 12:14 ` [PATCH v3 01/10] memory-device: Unify enabled vs. supported error messages David Hildenbrand
2023-06-01 12:14 ` [PATCH v3 02/10] memory-device: Introduce machine_memory_devices_init() David Hildenbrand
2023-06-01 12:14 ` [PATCH v3 03/10] hw/arm/virt: Use machine_memory_devices_init() David Hildenbrand
2023-06-01 12:14 ` [PATCH v3 04/10] hw/ppc/spapr: " David Hildenbrand
2023-06-14 13:04   ` Cédric Le Goater
2023-06-01 12:14 ` [PATCH v3 05/10] hw/loongarch/virt: " David Hildenbrand
2023-06-01 12:14 ` [PATCH v3 06/10] hw/i386/pc: " David Hildenbrand
2023-06-01 12:14 ` [PATCH v3 07/10] hw/i386/acpi-build: Rely on machine->device_memory when building SRAT David Hildenbrand
2023-06-01 12:14 ` [PATCH v3 08/10] hw/i386/pc: Remove PC_MACHINE_DEVMEM_REGION_SIZE David Hildenbrand
2023-06-01 12:14 ` [PATCH v3 09/10] memory-device: Refactor memory_device_pre_plug() David Hildenbrand
2023-06-14 12:27   ` Philippe Mathieu-Daudé
2023-06-01 12:14 ` [PATCH v3 10/10] memory-device: Track used region size in DeviceMemoryState David Hildenbrand
2023-06-01 12:22 ` [PATCH] " David Hildenbrand

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).