Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
memory-device: Track used region size in DeviceMemoryState
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
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
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.