mirror of https://gitee.com/openkylin/qemu.git
qmp: add query-memory-devices command
... allowing to get state of present memory devices. Currently implemented only for PCDIMMDevice. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
c3ba309507
commit
6f2e27301d
|
@ -23,6 +23,45 @@
|
|||
#include "qapi/visitor.h"
|
||||
#include "qemu/range.h"
|
||||
|
||||
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_int(OBJECT(dimm), PC_DIMM_SIZE_PROP,
|
||||
NULL);
|
||||
di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
|
||||
|
||||
info->dimm = 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)
|
||||
{
|
||||
unsigned long *bitmap = opaque;
|
||||
|
|
|
@ -76,4 +76,6 @@ uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
|
|||
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);
|
||||
#endif
|
||||
|
|
|
@ -3194,3 +3194,54 @@
|
|||
# Since: 2.1
|
||||
##
|
||||
{ 'command': 'query-memdev', 'returns': ['Memdev'] }
|
||||
# @PCDIMMDeviceInfo:
|
||||
#
|
||||
# PCDIMMDevice state information
|
||||
#
|
||||
# @id: #optional device's ID
|
||||
#
|
||||
# @addr: physical address, where device is mapped
|
||||
#
|
||||
# @size: size of memory that the device provides
|
||||
#
|
||||
# @slot: slot number at which device is plugged in
|
||||
#
|
||||
# @node: NUMA node number where device is plugged in
|
||||
#
|
||||
# @memdev: memory backend linked with device
|
||||
#
|
||||
# @hotplugged: true if device was hotplugged
|
||||
#
|
||||
# @hotpluggable: true if device if could be added/removed while machine is running
|
||||
#
|
||||
# Since: 2.1
|
||||
##
|
||||
{ 'type': 'PCDIMMDeviceInfo',
|
||||
'data': { '*id': 'str',
|
||||
'addr': 'int',
|
||||
'size': 'int',
|
||||
'slot': 'int',
|
||||
'node': 'int',
|
||||
'memdev': 'str',
|
||||
'hotplugged': 'bool',
|
||||
'hotpluggable': 'bool'
|
||||
}
|
||||
}
|
||||
|
||||
##
|
||||
# @MemoryDeviceInfo:
|
||||
#
|
||||
# Union containing information about a memory device
|
||||
#
|
||||
# Since: 2.1
|
||||
##
|
||||
{ 'union': 'MemoryDeviceInfo', 'data': {'dimm': 'PCDIMMDeviceInfo'} }
|
||||
|
||||
##
|
||||
# @query-memory-devices
|
||||
#
|
||||
# Lists available memory devices and their state
|
||||
#
|
||||
# Since: 2.1
|
||||
##
|
||||
{ 'command': 'query-memory-devices', 'returns': ['MemoryDeviceInfo'] }
|
||||
|
|
|
@ -3611,4 +3611,31 @@ Example (1):
|
|||
]
|
||||
}
|
||||
|
||||
EQMP
|
||||
|
||||
{
|
||||
.name = "query-memory-devices",
|
||||
.args_type = "",
|
||||
.mhandler.cmd_new = qmp_marshal_input_query_memory_devices,
|
||||
},
|
||||
|
||||
SQMP
|
||||
@query-memory-devices
|
||||
--------------------
|
||||
|
||||
Return a list of memory devices.
|
||||
|
||||
Example:
|
||||
-> { "execute": "query-memory-devices" }
|
||||
<- { "return": [ { "data":
|
||||
{ "addr": 5368709120,
|
||||
"hotpluggable": true,
|
||||
"hotplugged": true,
|
||||
"id": "d1",
|
||||
"memdev": "/objects/memX",
|
||||
"node": 0,
|
||||
"size": 1073741824,
|
||||
"slot": 0},
|
||||
"type": "dimm"
|
||||
} ] }
|
||||
EQMP
|
||||
|
|
11
qmp.c
11
qmp.c
|
@ -28,6 +28,7 @@
|
|||
#include "qapi/qmp-input-visitor.h"
|
||||
#include "hw/boards.h"
|
||||
#include "qom/object_interfaces.h"
|
||||
#include "hw/mem/pc-dimm.h"
|
||||
|
||||
NameInfo *qmp_query_name(Error **errp)
|
||||
{
|
||||
|
@ -628,3 +629,13 @@ void qmp_object_del(const char *id, Error **errp)
|
|||
}
|
||||
object_unparent(obj);
|
||||
}
|
||||
|
||||
MemoryDeviceInfoList *qmp_query_memory_devices(Error **errp)
|
||||
{
|
||||
MemoryDeviceInfoList *head = NULL;
|
||||
MemoryDeviceInfoList **prev = &head;
|
||||
|
||||
qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
|
||||
|
||||
return head;
|
||||
}
|
||||
|
|
|
@ -37,3 +37,4 @@ stub-obj-y += vmstate.o
|
|||
stub-obj-$(CONFIG_WIN32) += fd-register.o
|
||||
stub-obj-y += cpus.o
|
||||
stub-obj-y += kvm.o
|
||||
stub-obj-y += qmp_pc_dimm_device_list.o
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
#include "qom/object.h"
|
||||
#include "hw/mem/pc-dimm.h"
|
||||
|
||||
int qmp_pc_dimm_device_list(Object *obj, void *opaque)
|
||||
{
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue