pc-dimm: make qmp_pc_dimm_device_list() sort devices by address
Make qmp_pc_dimm_device_list() return sorted by start address list of devices so that it could be reused in places that would need sorted list*. Reuse existing pc_dimm_built_list() to get sorted list. While at it hide recursive callbacks from callers, so that: qmp_pc_dimm_device_list(qdev_get_machine(), &list); could be replaced with simpler: list = qmp_pc_dimm_device_list(); * follow up patch will use it in build_srat() Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Acked-by: David Gibson <david@gibson.dropbear.id.au> for ppc part Reviewed-by: Bharata B Rao <bharata@linux.vnet.ibm.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
1d0cad532c
commit
52c95cae4e
|
@ -162,45 +162,6 @@ uint64_t get_plugged_memory_size(void)
|
||||||
return pc_existing_dimms_capacity(&error_abort);
|
return pc_existing_dimms_capacity(&error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
int qmp_pc_dimm_device_list(Object *obj, void *opaque)
|
|
||||||
{
|
|
||||||
MemoryDeviceInfoList ***prev = opaque;
|
|
||||||
|
|
||||||
if (object_dynamic_cast(obj, TYPE_PC_DIMM)) {
|
|
||||||
DeviceState *dev = DEVICE(obj);
|
|
||||||
|
|
||||||
if (dev->realized) {
|
|
||||||
MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
|
|
||||||
MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
|
|
||||||
PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1);
|
|
||||||
DeviceClass *dc = DEVICE_GET_CLASS(obj);
|
|
||||||
PCDIMMDevice *dimm = PC_DIMM(obj);
|
|
||||||
|
|
||||||
if (dev->id) {
|
|
||||||
di->has_id = true;
|
|
||||||
di->id = g_strdup(dev->id);
|
|
||||||
}
|
|
||||||
di->hotplugged = dev->hotplugged;
|
|
||||||
di->hotpluggable = dc->hotpluggable;
|
|
||||||
di->addr = dimm->addr;
|
|
||||||
di->slot = dimm->slot;
|
|
||||||
di->node = dimm->node;
|
|
||||||
di->size = object_property_get_uint(OBJECT(dimm), PC_DIMM_SIZE_PROP,
|
|
||||||
NULL);
|
|
||||||
di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
|
|
||||||
|
|
||||||
info->u.dimm.data = di;
|
|
||||||
elem->value = info;
|
|
||||||
elem->next = NULL;
|
|
||||||
**prev = elem;
|
|
||||||
*prev = &elem->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object_child_foreach(obj, qmp_pc_dimm_device_list, opaque);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int pc_dimm_slot2bitmap(Object *obj, void *opaque)
|
static int pc_dimm_slot2bitmap(Object *obj, void *opaque)
|
||||||
{
|
{
|
||||||
unsigned long *bitmap = opaque;
|
unsigned long *bitmap = opaque;
|
||||||
|
@ -276,6 +237,50 @@ static int pc_dimm_built_list(Object *obj, void *opaque)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
|
||||||
|
{
|
||||||
|
GSList *dimms = NULL, *item;
|
||||||
|
MemoryDeviceInfoList *list = NULL, *prev = NULL;
|
||||||
|
|
||||||
|
object_child_foreach(qdev_get_machine(), pc_dimm_built_list, &dimms);
|
||||||
|
|
||||||
|
for (item = dimms; item; item = g_slist_next(item)) {
|
||||||
|
PCDIMMDevice *dimm = PC_DIMM(item->data);
|
||||||
|
Object *obj = OBJECT(dimm);
|
||||||
|
MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
|
||||||
|
MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
|
||||||
|
PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1);
|
||||||
|
DeviceClass *dc = DEVICE_GET_CLASS(obj);
|
||||||
|
DeviceState *dev = DEVICE(obj);
|
||||||
|
|
||||||
|
if (dev->id) {
|
||||||
|
di->has_id = true;
|
||||||
|
di->id = g_strdup(dev->id);
|
||||||
|
}
|
||||||
|
di->hotplugged = dev->hotplugged;
|
||||||
|
di->hotpluggable = dc->hotpluggable;
|
||||||
|
di->addr = dimm->addr;
|
||||||
|
di->slot = dimm->slot;
|
||||||
|
di->node = dimm->node;
|
||||||
|
di->size = object_property_get_uint(obj, PC_DIMM_SIZE_PROP, NULL);
|
||||||
|
di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
|
||||||
|
|
||||||
|
info->u.dimm.data = di;
|
||||||
|
elem->value = info;
|
||||||
|
elem->next = NULL;
|
||||||
|
if (prev) {
|
||||||
|
prev->next = elem;
|
||||||
|
} else {
|
||||||
|
list = elem;
|
||||||
|
}
|
||||||
|
prev = elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_slist_free(dimms);
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
|
uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
|
||||||
uint64_t address_space_size,
|
uint64_t address_space_size,
|
||||||
uint64_t *hint, uint64_t align, uint64_t size,
|
uint64_t *hint, uint64_t align, uint64_t size,
|
||||||
|
|
|
@ -722,8 +722,7 @@ static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hotplug_lmb_start) {
|
if (hotplug_lmb_start) {
|
||||||
MemoryDeviceInfoList **prev = &dimms;
|
dimms = qmp_pc_dimm_device_list();
|
||||||
qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ibm,dynamic-memory */
|
/* ibm,dynamic-memory */
|
||||||
|
|
|
@ -93,7 +93,7 @@ uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
|
||||||
|
|
||||||
int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp);
|
int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp);
|
||||||
|
|
||||||
int qmp_pc_dimm_device_list(Object *obj, void *opaque);
|
MemoryDeviceInfoList *qmp_pc_dimm_device_list(void);
|
||||||
uint64_t pc_existing_dimms_capacity(Error **errp);
|
uint64_t pc_existing_dimms_capacity(Error **errp);
|
||||||
uint64_t get_plugged_memory_size(void);
|
uint64_t get_plugged_memory_size(void);
|
||||||
void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
|
void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
|
||||||
|
|
4
numa.c
4
numa.c
|
@ -520,12 +520,10 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
|
||||||
|
|
||||||
static void numa_stat_memory_devices(NumaNodeMem node_mem[])
|
static void numa_stat_memory_devices(NumaNodeMem node_mem[])
|
||||||
{
|
{
|
||||||
MemoryDeviceInfoList *info_list = NULL;
|
MemoryDeviceInfoList *info_list = qmp_pc_dimm_device_list();
|
||||||
MemoryDeviceInfoList **prev = &info_list;
|
|
||||||
MemoryDeviceInfoList *info;
|
MemoryDeviceInfoList *info;
|
||||||
PCDIMMDeviceInfo *pcdimm_info;
|
PCDIMMDeviceInfo *pcdimm_info;
|
||||||
|
|
||||||
qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
|
|
||||||
for (info = info_list; info; info = info->next) {
|
for (info = info_list; info; info = info->next) {
|
||||||
MemoryDeviceInfo *value = info->value;
|
MemoryDeviceInfo *value = info->value;
|
||||||
|
|
||||||
|
|
7
qmp.c
7
qmp.c
|
@ -731,12 +731,7 @@ void qmp_object_del(const char *id, Error **errp)
|
||||||
|
|
||||||
MemoryDeviceInfoList *qmp_query_memory_devices(Error **errp)
|
MemoryDeviceInfoList *qmp_query_memory_devices(Error **errp)
|
||||||
{
|
{
|
||||||
MemoryDeviceInfoList *head = NULL;
|
return qmp_pc_dimm_device_list();
|
||||||
MemoryDeviceInfoList **prev = &head;
|
|
||||||
|
|
||||||
qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
|
|
||||||
|
|
||||||
return head;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ACPIOSTInfoList *qmp_query_acpi_ospm_status(Error **errp)
|
ACPIOSTInfoList *qmp_query_acpi_ospm_status(Error **errp)
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
#include "qom/object.h"
|
#include "qom/object.h"
|
||||||
#include "hw/mem/pc-dimm.h"
|
#include "hw/mem/pc-dimm.h"
|
||||||
|
|
||||||
int qmp_pc_dimm_device_list(Object *obj, void *opaque)
|
MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t get_plugged_memory_size(void)
|
uint64_t get_plugged_memory_size(void)
|
||||||
|
|
Loading…
Reference in a new issue