|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC XEN PATCH 16/16] tools/libxl: initiate pmem mapping via qmp callback
On Mon, Oct 10, 2016 at 08:32:35AM +0800, Haozhong Zhang wrote:
> QMP command 'query-nvdimms' is used by libxl to get the backend, the
> guest SPA and size of each vNVDIMM device, and then libxl starts mapping
> backend to guest for each vNVDIMM device.
>
> Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx>
> ---
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
> tools/libxl/libxl_qmp.c | 64
> +++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 64 insertions(+)
>
> diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
> index f8addf9..02edd09 100644
> --- a/tools/libxl/libxl_qmp.c
> +++ b/tools/libxl/libxl_qmp.c
> @@ -26,6 +26,7 @@
>
> #include "_libxl_list.h"
> #include "libxl_internal.h"
> +#include "libxl_nvdimm.h"
>
> /* #define DEBUG_RECEIVED */
>
> @@ -1146,6 +1147,66 @@ out:
> return rc;
> }
>
> +static int qmp_register_nvdimm_callback(libxl__qmp_handler *qmp,
> + const libxl__json_object *o,
> + void *unused)
> +{
> + GC_INIT(qmp->ctx);
> + const libxl__json_object *obj = NULL;
> + const libxl__json_object *sub_obj = NULL;
> + int i = 0;
unsigned int.
> + const char *mem_path;
> + uint64_t slot, spa, length;
> + int ret = 0;
> +
> + for (i = 0; (obj = libxl__json_array_get(o, i)); i++) {
> + if (!libxl__json_object_is_map(obj))
> + continue;
> +
> + sub_obj = libxl__json_map_get("slot", obj, JSON_INTEGER);
> + slot = libxl__json_object_get_integer(sub_obj);
> +
> + sub_obj = libxl__json_map_get("mem-path", obj, JSON_STRING);
> + mem_path = libxl__json_object_get_string(sub_obj);
> + if (!mem_path) {
> + LOG(ERROR, "No mem-path is specified for NVDIMM #%" PRId64,
> slot);
> + ret = -EINVAL;
> + goto out;
> + }
> +
> + sub_obj = libxl__json_map_get("spa", obj, JSON_INTEGER);
> + spa = libxl__json_object_get_integer(sub_obj);
> +
> + sub_obj = libxl__json_map_get("length", obj, JSON_INTEGER);
> + length = libxl__json_object_get_integer(sub_obj);
> +
> + LOG(DEBUG,
> + "vNVDIMM #%" PRId64 ": %s, spa 0x%" PRIx64 ", length 0x%" PRIx64,
> + slot, mem_path, spa, length);
> +
> + ret = libxl_nvdimm_add_device(gc, qmp->domid, mem_path, spa, length);
> + if (ret) {
> + LOG(ERROR,
> + "Failed to add NVDIMM #%" PRId64
> + "(mem_path %s, spa 0x%" PRIx64 ", length 0x%" PRIx64 ") "
> + "to domain %d (err = %d)",
> + slot, mem_path, spa, length, qmp->domid, ret);
> + goto out;
> + }
> + }
> +
> + out:
> + GC_FREE;
> + return ret;
> +}
> +
> +static int libxl__qmp_query_nvdimms(libxl__qmp_handler *qmp)
> +{
> + return qmp_synchronous_send(qmp, "query-nvdimms", NULL,
> + qmp_register_nvdimm_callback,
> + NULL, qmp->timeout);
> +}
> +
> int libxl__qmp_hmp(libxl__gc *gc, int domid, const char *command_line,
> char **output)
> {
> @@ -1187,6 +1248,9 @@ int libxl__qmp_initializations(libxl__gc *gc, uint32_t
> domid,
> if (!ret) {
> ret = qmp_query_vnc(qmp);
> }
> + if (!ret && guest_config->num_vnvdimms) {
> + ret = libxl__qmp_query_nvdimms(qmp);
> + }
> libxl__qmp_close(qmp);
> return ret;
> }
> --
> 2.10.1
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> https://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |