Skip to content

Commit

Permalink
memory-device: Track used region size in DeviceMemoryState
Browse files Browse the repository at this point in the history
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>
Message-Id: <20230623124553.400585-11-david@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
  • Loading branch information
davidhildenbrand committed Jul 12, 2023
1 parent d7f4891 commit ac23dd2
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 19 deletions.
22 changes: 3 additions & 19 deletions hw/mem/memory-device.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand All @@ -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));
}
Expand Down
2 changes: 2 additions & 0 deletions include/hw/boards.h
Original file line number Diff line number Diff line change
Expand Up @@ -298,11 +298,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;

/**
Expand Down

0 comments on commit ac23dd2

Please sign in to comment.