[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC QEMU PATCH 8/8] qmp: add a qmp command 'query-nvdimms' to get plugged NVDIMM devices
Xen uses this command to get the backend resource, guest SPA and size of NVDIMM devices so as to map them to guest. Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx> --- Cc: Markus Armbruster <armbru@xxxxxxxxxx> Cc: Xiao Guangrong <guangrong.xiao@xxxxxxxxxxxxxxx> Cc: "Michael S. Tsirkin" <mst@xxxxxxxxxx> Cc: Igor Mammedov <imammedo@xxxxxxxxxx> Cc: Eric Blake <eblake@xxxxxxxxxx> --- docs/qmp-commands.txt | 36 ++++++++++++++++++++++++++++++++++++ hw/acpi/nvdimm.c | 2 +- hw/mem/nvdimm.c | 35 +++++++++++++++++++++++++++++++++++ include/hw/mem/nvdimm.h | 10 ++++++++++ qapi-schema.json | 29 +++++++++++++++++++++++++++++ 5 files changed, 111 insertions(+), 1 deletion(-) diff --git a/docs/qmp-commands.txt b/docs/qmp-commands.txt index e0adceb..90e9fb6 100644 --- a/docs/qmp-commands.txt +++ b/docs/qmp-commands.txt @@ -3800,3 +3800,39 @@ Example for pc machine type started with "props": {"core-id": 0, "socket-id": 0, "thread-id": 0} } ]} + +EQMP + + { + .name = "query-nvdimms", + .args_type = "", + .mhandler.cmd_new = qmp_marshal_query_nvdimms, + }, + +SQMP +Show plugged NVDIMM devices +--------------------------- + +Arguments: None. + +Example for pc machine type started with +-object memory-backend-file,id=mem1,mem-path=/path/to/nvm1,size=4G +-device nvdimm,id=nvdimm1,memdev=mem1 +-object memory-backend-file,id=mem2,mem-path=/path/to/nvm2,size=8G +-device nvdimm,id=nvdimm2,memdev=mem2: + +-> { "execute": "query-nvdimms" } +<- { "returns": [ + { + "mem-path": "/path/to/nvm1", + "slot": 0, + "spa": 17179869184, + "length": 4294967296 + }, + { + "mem-path": "/path/to/nvm2", + "slot": 1, + "spa": 21474836480, + "length": 8589934592 + } + ]} diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c index 4cfb94d..eedc128 100644 --- a/hw/acpi/nvdimm.c +++ b/hw/acpi/nvdimm.c @@ -57,7 +57,7 @@ static int nvdimm_plugged_device_list(Object *obj, void *opaque) * Note: it is the caller's responsibility to free the list to avoid * memory leak. */ -static GSList *nvdimm_get_plugged_device_list(void) +GSList *nvdimm_get_plugged_device_list(void) { GSList *list = NULL; diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c index d25993b..99d0cc9 100644 --- a/hw/mem/nvdimm.c +++ b/hw/mem/nvdimm.c @@ -26,6 +26,7 @@ #include "qapi/error.h" #include "qapi/visitor.h" #include "hw/mem/nvdimm.h" +#include "qmp-commands.h" static void nvdimm_get_label_size(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) @@ -180,3 +181,37 @@ static void nvdimm_register_types(void) } type_init(nvdimm_register_types) + +NvdimmInfoList *qmp_query_nvdimms(Error **errp) +{ + NvdimmInfoList *info_list = NULL; + NvdimmInfoList *info; + GSList *device_list = nvdimm_get_plugged_device_list(); + + while (device_list) { + DeviceState *dev = device_list->data; + PCDIMMDevice *parent = PC_DIMM(OBJECT(dev)); + const char *mem_path; + + info = g_new0(NvdimmInfoList, 1); + info->value = g_new0(NvdimmInfo, 1); + + mem_path = object_property_get_str(OBJECT(parent->hostmem), + "mem-path", NULL); + info->value->mem_path = mem_path ? strdup(mem_path) : NULL; + + info->value->slot = object_property_get_int(OBJECT(dev), + PC_DIMM_SLOT_PROP, NULL); + info->value->spa = object_property_get_int(OBJECT(dev), + PC_DIMM_ADDR_PROP, NULL); + info->value->length = object_property_get_int(OBJECT(dev), + PC_DIMM_SIZE_PROP, NULL); + + info->next = info_list; + info_list = info; + device_list = device_list->next; + } + + g_slist_free(device_list); + return info_list; +} diff --git a/include/hw/mem/nvdimm.h b/include/hw/mem/nvdimm.h index 1cfe9e0..6be269e 100644 --- a/include/hw/mem/nvdimm.h +++ b/include/hw/mem/nvdimm.h @@ -113,4 +113,14 @@ void nvdimm_init_acpi_state(AcpiNVDIMMState *state, MemoryRegion *io, FWCfgState *fw_cfg, Object *owner); void nvdimm_build_acpi(GArray *table_offsets, GArray *table_data, BIOSLinker *linker, GArray *dsm_dma_arrea); + +/* + * Inquire plugged NVDIMM devices and link them into the list which is + * returned to the caller. + * + * Note: it is the caller's responsibility to free the list to avoid + * memory leak. + */ +GSList *nvdimm_get_plugged_device_list(void); + #endif diff --git a/qapi-schema.json b/qapi-schema.json index c3dcf11..6246255 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -4646,3 +4646,32 @@ # Since: 2.7 ## { 'command': 'query-hotpluggable-cpus', 'returns': ['HotpluggableCPU'] } + +## +# @NvdimmInfo +# +# Information about an NVDIMM device. +# +# @mem-path: the backend file of the NVDIMM device +# +# @slot: the slot index of the NVDIMM device +# +# @spa: the 64-bit SPA base address of the NVDIMM device +# +# @length: the 64-bit size in bytes of the NVDIMM device +# +# Since 2.8 +## +{ 'struct': 'NvdimmInfo', + 'data': {'mem-path' : 'str', 'slot': 'int', 'spa': 'int', 'length': 'int'} } + +## +# @query-nvdimms: +# +# Returns information about each NVDIMM device +# +# Returns: a list of @NvdimmInfo for each device +# +# Since: 2.8 +## +{ 'command': 'query-nvdimms', 'returns': ['NvdimmInfo'] } -- 2.10.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |