From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hongyang Yang Subject: Re: [PATCH 6/8] libxl: allow a generation ID to be specified at domain creation Date: Wed, 18 Jun 2014 13:18:56 +0800 Message-ID: <53A12140.6040302@cn.fujitsu.com> References: <1402585478-3389-1-git-send-email-david.vrabel@citrix.com> <1402585478-3389-7-git-send-email-david.vrabel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Wx8Ji-0005lI-Ah for xen-devel@lists.xenproject.org; Wed, 18 Jun 2014 05:21:50 +0000 In-Reply-To: <1402585478-3389-7-git-send-email-david.vrabel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: David Vrabel , xen-devel@lists.xenproject.org Cc: Ian Jackson , Ian Campbell , Stefano Stabellini List-Id: xen-devel@lists.xenproject.org Hi David, there are 2 lines that have whitespace. Applying: libxl: allow a generation ID to be specified at domain creation /media/sda5/work/remus/.git/rebase-apply/patch:56: trailing whitespace. if (info->type == LIBXL_DOMAIN_TYPE_HVM /media/sda5/work/remus/.git/rebase-apply/patch:101: trailing whitespace. * warning: 2 lines add whitespace errors. On 06/12/2014 11:04 PM, David Vrabel wrote: > Toolstacks may specify a VM generation ID using the u.hvm.ms_vm_genid > field in the libxl_domain_build_info structure, when creating a > domain. > > The toolstack is responsible for providing the correct generation ID > according to the Microsoft specification (e.g., generating new random > ones with libxl_ms_vm_genid_generate() as appropriate when restoring). > > Although the specification requires that a ACPI Notify event is raised > if the generation ID is changed, the generation ID is never changed > when the domain is in a state to receive such an event (it's either > newly created or suspended). > > Signed-off-by: David Vrabel > --- > tools/libxl/Makefile | 1 + > tools/libxl/libxl.h | 7 +++ > tools/libxl/libxl_dom.c | 10 ++++ > tools/libxl/libxl_genid.c | 104 ++++++++++++++++++++++++++++++++++++++++++ > tools/libxl/libxl_internal.h | 4 ++ > tools/libxl/libxl_types.idl | 2 + > 6 files changed, 128 insertions(+) > create mode 100644 tools/libxl/libxl_genid.c > > diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile > index 4cfa275..6499aa7 100644 > --- a/tools/libxl/Makefile > +++ b/tools/libxl/Makefile > @@ -77,6 +77,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \ > libxl_json.o libxl_aoutils.o libxl_numa.o \ > libxl_save_callout.o _libxl_save_msgs_callout.o \ > libxl_qmp.o libxl_event.o libxl_fork.o $(LIBXL_OBJS-y) > +LIBXL_OBJS += libxl_genid.o > LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o > > LIBXL_TESTS += timedereg > diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h > index 17b8a7b..ab2f66a 100644 > --- a/tools/libxl/libxl.h > +++ b/tools/libxl/libxl.h > @@ -104,6 +104,11 @@ > #define LIBXL_HAVE_BUILDINFO_EVENT_CHANNELS 1 > > /* > + * libxl_domain_build_info has the u.hvm.ms_vm_genid field. > + */ > +#define LIBXL_HAVE_BUILDINFO_HVM_MS_VM_GENID 1 > + > +/* > * LIBXL_HAVE_DEVICE_DISK_DIRECT_IO_SAFE indicates that a > * 'direct_io_safe' field (of boolean type) is present in > * libxl_device_disk. > @@ -1189,6 +1194,8 @@ int libxl_flask_getenforce(libxl_ctx *ctx); > int libxl_flask_setenforce(libxl_ctx *ctx, int mode); > int libxl_flask_loadpolicy(libxl_ctx *ctx, void *policy, uint32_t size); > > +int libxl_ms_vm_genid_generate(libxl_ctx *ctx, libxl_uuid *uuid); > + > /* misc */ > > /* Each of these sets or clears the flag according to whether the > diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c > index 8485488..21ce07f 100644 > --- a/tools/libxl/libxl_dom.c > +++ b/tools/libxl/libxl_dom.c > @@ -314,6 +314,16 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid, > if (info->cpuid != NULL) > libxl_cpuid_set(ctx, domid, info->cpuid); > > + if (info->type == LIBXL_DOMAIN_TYPE_HVM > + && !libxl_uuid_is_nil(&info->u.hvm.ms_vm_genid)) { > + rc = libxl__ms_vm_genid_set(gc, domid, > + &info->u.hvm.ms_vm_genid); > + if (rc) { > + LOG(ERROR, "Failed to set VM Generation ID"); > + return rc; > + } > + } > + > ents = libxl__calloc(gc, 12 + (info->max_vcpus * 2) + 2, sizeof(char *)); > ents[0] = "memory/static-max"; > ents[1] = GCSPRINTF("%"PRId64, info->max_memkb); > diff --git a/tools/libxl/libxl_genid.c b/tools/libxl/libxl_genid.c > new file mode 100644 > index 0000000..565ed00 > --- /dev/null > +++ b/tools/libxl/libxl_genid.c > @@ -0,0 +1,104 @@ > +/* > + * Copyright (C) 2014 Citrix Systems R&D Ltd. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU Lesser General Public License as published > + * by the Free Software Foundation; version 2.1 only. with the special > + * exception on linking described in file LICENSE. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU Lesser General Public License for more details. > + */ > + > +#include "libxl_osdeps.h" /* must come before any other headers */ > + > +#include "libxl_internal.h" > + > +#include > +#include > + > +/* > + * Generate a random VM generation ID. > + * > + * This is similar to libxl_uuid_generate() except that all bits are > + * random, as required by the specification. > + * > + * Returns ERROR_FAIL if a suitable source of random numbers is not > + * available. > + * > + * See Microsoft's "Virtual Machine Generation ID" specification for > + * further details, including when a new generation ID is required. > + * > + * http://www.microsoft.com/en-us/download/details.aspx?id=30707 > + */ > +int libxl_ms_vm_genid_generate(libxl_ctx *ctx, libxl_uuid *uuid) > +{ > + GC_INIT(ctx); > + int ret; > + > + ret = libxl__random_bytes(gc, libxl_uuid_bytearray(uuid), 16); > + > + GC_FREE; > + return ret; > +} > + > +int libxl__ms_vm_genid_set(libxl__gc *gc, uint32_t domid, > + const libxl_uuid *uuid) > +{ > + libxl_ctx *ctx = libxl__gc_owner(gc); > + const char *dom_path; > + uint64_t genid[2]; > + uint64_t paddr = 0; > + int rc; > + > + memcpy(genid, libxl_uuid_bytearray_const(uuid), 16); > + > + /* > + * Set the "platform/generation-id" XenStore key to pass the ID to > + * hvmloader. > + */ > + dom_path = libxl__xs_get_dompath(gc, domid); > + if (!dom_path) { > + rc = ERROR_FAIL; > + goto out; > + } > + rc = libxl__xs_write(gc, XBT_NULL, > + GCSPRINTF("%s/platform/generation-id", dom_path), > + "%"PRIu64 ":%" PRIu64, genid[0], genid[1]); > + if (rc < 0) > + goto out; > + > + /* > + * Update the ID in guest memory (if available). > + */ > + xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_VM_GENERATION_ID_ADDR, &paddr); > + if (paddr) { > + void *vaddr; > + > + vaddr = xc_map_foreign_range(ctx->xch, domid, XC_PAGE_SIZE, > + PROT_READ | PROT_WRITE, > + paddr >> XC_PAGE_SHIFT); > + if (vaddr == NULL) { > + rc = ERROR_FAIL; > + goto out; > + } > + memcpy(vaddr + (paddr & ~XC_PAGE_MASK), genid, 2 * sizeof(*genid)); > + munmap(vaddr, XC_PAGE_SIZE); > + > + /* > + * The spec requires an ACPI Notify event is injected into the > + * guest when the generation ID is changed. > + * > + * This is only called for domains that are suspended or newly > + * created and they won't be in a state to receive such an > + * event. > + */ > + } > + > + rc = 0; > + > + out: > + return rc; > +} > diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h > index d4f32a9..fa9a150 100644 > --- a/tools/libxl/libxl_internal.h > +++ b/tools/libxl/libxl_internal.h > @@ -3086,6 +3086,10 @@ void libxl__numa_candidate_put_nodemap(libxl__gc *gc, > libxl_bitmap_copy(CTX, &cndt->nodemap, nodemap); > } > > +_hidden int libxl__ms_vm_genid_set(libxl__gc *gc, uint32_t domid, > + const libxl_uuid *uuid); > + > + > /* Som handy macros for defbool type. */ > #define LIBXL__DEFBOOL_DEFAULT (0) > #define LIBXL__DEFBOOL_FALSE (-1) > diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl > index f0f6e34..1c5e687 100644 > --- a/tools/libxl/libxl_types.idl > +++ b/tools/libxl/libxl_types.idl > @@ -371,6 +371,8 @@ libxl_domain_build_info = Struct("domain_build_info",[ > ("xen_platform_pci", libxl_defbool), > ("usbdevice_list", libxl_string_list), > ("vendor_device", libxl_vendor_device), > + # See libxl_ms_vm_genid_generate() > + ("ms_vm_genid", libxl_uuid), > ])), > ("pv", Struct(None, [("kernel", string), > ("slack_memkb", MemKB), > -- Thanks, Yang.