Lines Matching +full:memory +full:- +full:region

2  * Memory Device Interface
9 * See the COPYING file in the top-level directory.
13 #include "qemu/error-report.h"
14 #include "hw/mem/memory-device.h"
20 #include "system/address-spaces.h"
29 /* dropping const here is fine as we don't touch the memory region */ in memory_device_is_empty()
30 mr = mdc->get_memory_region((MemoryDeviceState *)md, &local_err); in memory_device_is_empty()
45 const uint64_t addr_a = mdc_a->get_addr(md_a); in memory_device_addr_sort()
46 const uint64_t addr_b = mdc_b->get_addr(md_b); in memory_device_addr_sort()
51 return -1; in memory_device_addr_sort()
62 if (dev->realized) { /* only realized memory devices matter */ in memory_device_build_list()
75 if (mdc->get_memslots) { in memory_device_get_memslots()
76 return mdc->get_memslots(md); in memory_device_get_memslots()
82 * Memslots that are reserved by memory devices (required but still reported
87 if (ms->device_memory->used_memslots > in get_reserved_memslots()
88 ms->device_memory->required_memslots) { in get_reserved_memslots()
89 /* This is unexpected, and we warned already in the memory notifier. */ in get_reserved_memslots()
92 return ms->device_memory->required_memslots - in get_reserved_memslots()
93 ms->device_memory->used_memslots; in get_reserved_memslots()
98 if (!current_machine->device_memory) { in memory_devices_get_reserved_memslots()
106 if (!current_machine->device_memory) { in memory_devices_memslot_auto_decision_active()
110 return current_machine->device_memory->memslot_auto_decision_active; in memory_devices_memslot_auto_decision_active()
137 * Consider our soft-limit across all memory devices. We don't really in memory_device_memslot_decision_limit()
141 ms->device_memory->required_memslots) { in memory_device_memslot_decision_limit()
144 memslots = MEMORY_DEVICES_SOFT_MEMSLOT_LIMIT - in memory_device_memslot_decision_limit()
145 ms->device_memory->required_memslots; in memory_device_memslot_decision_limit()
153 memslots = MIN(memslots, free - reserved); in memory_device_memslot_decision_limit()
158 /* We cannot have any other memory devices? So give all to this device. */ in memory_device_memslot_decision_limit()
159 if (size == ms->maxram_size - ms->ram_size) { in memory_device_memslot_decision_limit()
165 * still available for memory devices. in memory_device_memslot_decision_limit()
167 available_space = ms->maxram_size - ms->ram_size - in memory_device_memslot_decision_limit()
168 ms->device_memory->used_region_size; in memory_device_memslot_decision_limit()
177 const uint64_t used_region_size = ms->device_memory->used_region_size; in memory_device_check_addable()
186 if (mdc->decide_memslots) { in memory_device_check_addable()
188 mdc->decide_memslots(md, memslot_limit); in memory_device_check_addable()
192 /* we will need memory slots for kvm and vhost */ in memory_device_check_addable()
195 error_setg(errp, "hypervisor has not enough free memory slots left"); in memory_device_check_addable()
199 error_setg(errp, "a used vhost backend has not enough free memory slots left"); in memory_device_check_addable()
203 /* will we exceed the total amount of memory specified */ in memory_device_check_addable()
205 used_region_size + size > ms->maxram_size - ms->ram_size) { in memory_device_check_addable()
207 " in use of total space for memory devices 0x" RAM_ADDR_FMT, in memory_device_check_addable()
208 used_region_size, ms->maxram_size - ms->ram_size); in memory_device_check_addable()
222 range_init_nofail(&as, ms->device_memory->base, in memory_device_get_free_addr()
223 memory_region_size(&ms->device_memory->mr)); in memory_device_get_free_addr()
228 " maximum alignment, memory will get fragmented and not" in memory_device_get_free_addr()
229 " all 'maxmem' might be usable for memory devices.", in memory_device_get_free_addr()
241 error_setg(errp, "can't add memory device [0x%" PRIx64 ":0x%" PRIx64 in memory_device_get_free_addr()
242 "], usable range for memory devices [0x%" PRIx64 ":0x%" in memory_device_get_free_addr()
249 error_setg(errp, "can't add memory device, device too big"); in memory_device_get_free_addr()
254 /* find address range that will fit new memory device */ in memory_device_get_free_addr()
257 const MemoryDeviceState *md = item->data; in memory_device_get_free_addr()
266 range_init_nofail(&tmp, mdc->get_addr(md), in memory_device_get_free_addr()
272 error_setg(errp, "address range conflicts with memory device" in memory_device_get_free_addr()
273 " id='%s'", d->id ? d->id : "(unnamed)"); in memory_device_get_free_addr()
289 "memory device - memory fragmented due to alignments"); in memory_device_get_free_addr()
305 const MemoryDeviceState *md = MEMORY_DEVICE(item->data); in qmp_memory_device_list()
306 const MemoryDeviceClass *mdc = MEMORY_DEVICE_GET_CLASS(item->data); in qmp_memory_device_list()
309 /* Let's query infotmation even for empty memory devices. */ in qmp_memory_device_list()
310 mdc->fill_device_info(md, info); in qmp_memory_device_list()
329 if (dev->realized && !memory_device_is_empty(md)) { in memory_device_plugged_size()
330 *size += mdc->get_plugged_size(md, &error_abort); in memory_device_plugged_size()
355 /* We support empty memory devices even without device memory. */ in memory_device_pre_plug()
360 if (!ms->device_memory) { in memory_device_pre_plug()
361 error_setg(errp, "the configuration is not prepared for memory devices" in memory_device_pre_plug()
362 " (e.g., for memory hotplug), consider specifying the" in memory_device_pre_plug()
367 mr = mdc->get_memory_region(md, &local_err); in memory_device_pre_plug()
378 * We always want the memory region size to be multiples of the memory in memory_device_pre_plug()
379 * region alignment: for example, DIMMs with 1G+1byte size don't make in memory_device_pre_plug()
381 * of any additional alignment requirements the memory device might in memory_device_pre_plug()
386 error_setg(errp, "backend memory size must be multiple of 0x%" in memory_device_pre_plug()
391 if (mdc->get_min_alignment) { in memory_device_pre_plug()
392 align = mdc->get_min_alignment(md); in memory_device_pre_plug()
395 addr = mdc->get_addr(md); in memory_device_pre_plug()
401 mdc->set_addr(md, addr, &local_err); in memory_device_pre_plug()
403 trace_memory_device_pre_plug(DEVICE(md)->id ? DEVICE(md)->id : "", in memory_device_pre_plug()
422 addr = mdc->get_addr(md); in memory_device_plug()
428 mr = mdc->get_memory_region(md, &error_abort); in memory_device_plug()
429 g_assert(ms->device_memory); in memory_device_plug()
431 ms->device_memory->used_region_size += memory_region_size(mr); in memory_device_plug()
432 ms->device_memory->required_memslots += memslots; in memory_device_plug()
433 if (mdc->decide_memslots && memslots > 1) { in memory_device_plug()
434 ms->device_memory->memslot_auto_decision_active++; in memory_device_plug()
437 memory_region_add_subregion(&ms->device_memory->mr, in memory_device_plug()
438 addr - ms->device_memory->base, mr); in memory_device_plug()
439 trace_memory_device_plug(DEVICE(md)->id ? DEVICE(md)->id : "", addr); in memory_device_plug()
456 mr = mdc->get_memory_region(md, &error_abort); in memory_device_unplug()
457 g_assert(ms->device_memory); in memory_device_unplug()
459 memory_region_del_subregion(&ms->device_memory->mr, mr); in memory_device_unplug()
461 if (mdc->decide_memslots && memslots > 1) { in memory_device_unplug()
462 ms->device_memory->memslot_auto_decision_active--; in memory_device_unplug()
464 ms->device_memory->used_region_size -= memory_region_size(mr); in memory_device_unplug()
465 ms->device_memory->required_memslots -= memslots; in memory_device_unplug()
466 trace_memory_device_unplug(DEVICE(md)->id ? DEVICE(md)->id : "", in memory_device_unplug()
467 mdc->get_addr(md)); in memory_device_unplug()
476 /* dropping const here is fine as we don't touch the memory region */ in memory_device_get_region_size()
477 mr = mdc->get_memory_region((MemoryDeviceState *)md, errp); in memory_device_get_region_size()
491 if (!memory_region_is_ram(mrs->mr)) { in memory_devices_region_mod()
492 warn_report("Unexpected memory region mapped into device memory region."); in memory_devices_region_mod()
497 * The expectation is that each distinct RAM memory region section in in memory_devices_region_mod()
498 * our region for memory devices consumes exactly one memslot in KVM in memory_devices_region_mod()
500 * * ROM memory regions don't consume a memslot. These get used very in memory_devices_region_mod()
501 * rarely for memory devices (R/O NVDIMMs). in memory_devices_region_mod()
502 * * Memslots without a fd (memory-backend-ram) don't necessarily in memory_devices_region_mod()
504 * the memory would be inaccessible by such vhost devices. in memory_devices_region_mod()
506 * So for vhost, in corner cases we might over-estimate the number of in memory_devices_region_mod()
508 * (required - used). in memory_devices_region_mod()
510 dms->used_memslots += add ? 1 : -1; in memory_devices_region_mod()
512 if (dms->used_memslots > dms->required_memslots) { in memory_devices_region_mod()
513 warn_report("Memory devices use more memory slots than indicated as required."); in memory_devices_region_mod()
532 g_assert(!ms->device_memory); in machine_memory_devices_init()
533 ms->device_memory = g_new0(DeviceMemoryState, 1); in machine_memory_devices_init()
534 ms->device_memory->base = base; in machine_memory_devices_init()
536 memory_region_init(&ms->device_memory->mr, OBJECT(ms), "device-memory", in machine_memory_devices_init()
538 address_space_init(&ms->device_memory->as, &ms->device_memory->mr, in machine_memory_devices_init()
539 "device-memory"); in machine_memory_devices_init()
540 memory_region_add_subregion(get_system_memory(), ms->device_memory->base, in machine_memory_devices_init()
541 &ms->device_memory->mr); in machine_memory_devices_init()
543 /* Track the number of memslots used by memory devices. */ in machine_memory_devices_init()
544 ms->device_memory->listener.region_add = memory_devices_region_add; in machine_memory_devices_init()
545 ms->device_memory->listener.region_del = memory_devices_region_del; in machine_memory_devices_init()
546 memory_listener_register(&ms->device_memory->listener, in machine_memory_devices_init()
547 &ms->device_memory->as); in machine_memory_devices_init()