All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hongyang Yang <yanghy@cn.fujitsu.com>
To: David Vrabel <david.vrabel@citrix.com>, xen-devel@lists.xenproject.org
Cc: Ian Jackson <ian.jackson@eu.citrix.com>,
	Ian Campbell <ian.campbell@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
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	[thread overview]
Message-ID: <53A12140.6040302@cn.fujitsu.com> (raw)
In-Reply-To: <1402585478-3389-7-git-send-email-david.vrabel@citrix.com>

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 <david.vrabel@citrix.com>
> ---
>   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 <xenctrl.h>
> +#include <xen/hvm/params.h>
> +
> +/*
> + * 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.

  reply	other threads:[~2014-06-18  5:21 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-12 15:04 [PATCHv5 0/8] tools: rework VM Generation ID David Vrabel
2014-06-12 15:04 ` [PATCH 1/8] libxc: allow xc_get/set_hvm_param() to get/set 64-bit values David Vrabel
2014-06-18 11:26   ` Ian Campbell
2014-06-18 13:05   ` Ian Campbell
2014-06-12 15:04 ` [PATCH 2/8] libxl: add libxl__random_bytes() which fills a buffer with random bytes David Vrabel
2014-06-18 11:28   ` Ian Campbell
2014-06-18 11:43     ` Roger Pau Monné
2014-06-18 13:10       ` Ian Campbell
2014-06-12 15:04 ` [PATCH 3/8] hvmloader: add helper functions to get/set HVM params David Vrabel
2014-06-12 15:04 ` [PATCH 4/8] hvm: add HVM_PARAM_VM_GENERATION_ID_ADDR David Vrabel
2014-06-12 15:04 ` [PATCH 5/8] libxc, libxl, hvmloader: strip out outdated VM generation ID implementation David Vrabel
2014-06-12 15:04 ` [PATCH 6/8] libxl: allow a generation ID to be specified at domain creation David Vrabel
2014-06-18  5:18   ` Hongyang Yang [this message]
2014-06-18  9:38     ` David Vrabel
2014-06-18  9:39       ` Ian Campbell
2014-06-18 11:33   ` Ian Campbell
2014-06-18 12:09     ` David Vrabel
2014-06-18 12:25       ` Ian Campbell
2014-06-18 13:22         ` David Vrabel
2014-06-12 15:04 ` [PATCH 7/8] xl: generate a new random VM generation ID if requested David Vrabel
2014-06-18 11:37   ` Ian Campbell
2014-06-12 15:04 ` [PATCH 8/8] docs: update docs for the ~/platform/generation-id key David Vrabel
2014-06-18 16:12 [PATCHv6 0/8] tools: rework VM Generation ID David Vrabel
2014-06-18 16:12 ` [PATCH 6/8] libxl: allow a generation ID to be specified at domain creation David Vrabel
2014-06-27 11:16   ` Ian Campbell
2014-06-27 11:35     ` David Vrabel
2014-06-27 12:23       ` Ian Campbell
2014-06-27 12:51   ` Ian Campbell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53A12140.6040302@cn.fujitsu.com \
    --to=yanghy@cn.fujitsu.com \
    --cc=david.vrabel@citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.