memory device wants to figure out at per-device memslot limit for memory devices that want to consume more than a single memslot. We want to try setting the memslots required for DIMMs/NVDIMMs (1 memslot per such device) aside, so expose how many of these slots are still free. Keep it simple and place the stub into qmp_memory_device.c. Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> --- hw/mem/pc-dimm.c | 27 +++++++++++++++++++++++++++ include/hw/mem/pc-dimm.h | 1 + stubs/qmp_memory_device.c | 6 ++++++ 3 files changed, 34 insertions(+) diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c index 37f1f4ccfd..64ee0c38c0 100644 --- a/hw/mem/pc-dimm.c +++ b/hw/mem/pc-dimm.c @@ -152,6 +152,33 @@ out: return slot; } +static int pc_dimm_count_slots(Object *obj, void *opaque) +{ + unsigned int *slots = opaque; + + if (object_dynamic_cast(obj, TYPE_PC_DIMM)) { + DeviceState *dev = DEVICE(obj); + if (dev->realized) { /* count only realized DIMMs */ + (*slots)++; + } + } + return 0; +} + +unsigned int pc_dimm_get_free_slots(MachineState *machine) +{ + const unsigned int max_slots = machine->ram_slots; + unsigned int slots = 0; + + if (!max_slots) { + return 0; + } + + object_child_foreach_recursive(OBJECT(machine), pc_dimm_count_slots, + &slots); + return max_slots - slots; +} + static Property pc_dimm_properties[] = { DEFINE_PROP_UINT64(PC_DIMM_ADDR_PROP, PCDIMMDevice, addr, 0), DEFINE_PROP_UINT32(PC_DIMM_NODE_PROP, PCDIMMDevice, node, 0), diff --git a/include/hw/mem/pc-dimm.h b/include/hw/mem/pc-dimm.h index 322bebe555..60051ac753 100644 --- a/include/hw/mem/pc-dimm.h +++ b/include/hw/mem/pc-dimm.h @@ -70,4 +70,5 @@ void pc_dimm_pre_plug(PCDIMMDevice *dimm, MachineState *machine, const uint64_t *legacy_align, Error **errp); void pc_dimm_plug(PCDIMMDevice *dimm, MachineState *machine); void pc_dimm_unplug(PCDIMMDevice *dimm, MachineState *machine); +unsigned int pc_dimm_get_free_slots(MachineState *machine); #endif diff --git a/stubs/qmp_memory_device.c b/stubs/qmp_memory_device.c index 74707ed9fd..7022bd188b 100644 --- a/stubs/qmp_memory_device.c +++ b/stubs/qmp_memory_device.c @@ -1,5 +1,6 @@ #include "qemu/osdep.h" #include "hw/mem/memory-device.h" +#include "hw/mem/pc-dimm.h" MemoryDeviceInfoList *qmp_memory_device_list(void) { @@ -19,3 +20,8 @@ unsigned int memory_devices_get_reserved_memslots(void) { return 0; } + +unsigned int pc_dimm_get_free_slots(MachineState *machine) +{ + return 0; +} -- 2.40.1