|
@@ -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));
|
|
|
}
|