[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] libxl: use named options for tsc_mode



On Thu, 2011-11-10 at 10:55 +0000, Ian Campbell wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@xxxxxxxxxx>
> # Date 1320922479 0
> # Node ID bc79b560aafa1e4dc42af00e6a326dc651b5636a
> # Parent  460b507e15f864dd6712f5040e36538d6e076ae4
> libxl: use named options for tsc_mode.
> 
> It seems that this knob is expoerted from the hypervisor as a raw
> integer (no symbolic names) documented in xen/include/asm-x86. Propagating 
> that
> all the way to the end user is hardly friendly (it's bad enough in the
> hypercall interface).

I've just seen docs/misc/tscmode.txt which is actually a pretty
comprehensive explanation of what's going on so the above is
unwarranted. I'll update this patch to include a reference in the
xl-domain-config.

> 
> Add an enum at the libxl level with a hopefully descriptive set of names.
> Deprecate the use of an integer in xl cfg files.

I think the naming at the libxl level is still useful even if the values
are documented.

Ian.

> 
> Signed-off-by: Ian Campbell
> 
> diff -r 460b507e15f8 -r bc79b560aafa docs/user/xl-domain-config.markdown
> --- a/docs/user/xl-domain-config.markdown     Thu Nov 10 10:18:29 2011 +0000
> +++ b/docs/user/xl-domain-config.markdown     Thu Nov 10 10:54:39 2011 +0000
> @@ -1,4 +1,4 @@
> - # xl Domain Configuration
> +# xl Domain Configuration
>  
>  To create a VM (a domain in Xen terminology, sometimes called a guest)
>  with xl requires the provision of a domain config file.  Typically
> @@ -338,6 +338,29 @@ accept the defaults for these options wh
>     extensions (e.g. Windows XP compatibility mode on more modern
>     Windows OS).
>  
> +### Guest Virtual Time Controls
> +
> + * `tsc_mode="MODE"`: Specifies how the TSC (Time Stamp Counter)
> +   should be provided to the guest (X86 only). Specifying this option as a 
> number
> +   is deprecated. Options are:
> +
> +   * `"default"`: guest rdtsc/p executed natively when monotonicity
> +     can be guaranteed and emulated otherwise (with frequency scaled
> +     if necessary).
> +
> +   * `"always_emulate"`: guest rdtsc/p always emulated at 1GHz (kernel
> +     and user).
> +
> +   * `"native"`: guest rdtsc always executed natively (no
> +     monotonicity/frequency guarantees); guest rdtscp emulated at
> +     native frequency if unsupported by h/w, else executed natively.
> +
> +   * `"native_paravirt"`: same as `native`, except xen manages TSC_AUX
> +      register so guest can determine when a restore/migration has
> +      occurred and assumes guest obtains/uses pvclock-like mechanism
> +      to adjust for monotonicity and frequency changes.
> +
> +
>  ### Support for Paravirtualisation of HVM Guests
>  
>  The following options allow Paravirtualised features (such as devices)
> @@ -546,9 +569,6 @@ certainly belong in a more appropriate s
>     enables certain other features which are incompatible with
>     migration (currently certain TSC modes XXX ?).
>  
> - * `tsc_mode=VALUE`: Specifies how the TSC (Time Stamp Counter) should
> -   be provided to the guest.  XXX ???
> -
>   * `pci_msitranslate=BOOLEAN`: XXX
>  
>   * `pci_power_mgmt=BOOLEAN`: XXX
> diff -r 460b507e15f8 -r bc79b560aafa tools/libxl/libxl_dom.c
> --- a/tools/libxl/libxl_dom.c Thu Nov 10 10:18:29 2011 +0000
> +++ b/tools/libxl/libxl_dom.c Thu Nov 10 10:54:39 2011 +0000
> @@ -73,12 +73,29 @@ int libxl__build_pre(libxl__gc *gc, uint
>                libxl_domain_build_info *info, libxl__domain_build_state 
> *state)
>  {
>      libxl_ctx *ctx = libxl__gc_owner(gc);
> +    int tsc_mode;
>      xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus);
>      xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + 
> LIBXL_MAXMEM_CONSTANT);
>      if (info->type == LIBXL_DOMAIN_TYPE_PV)
>          xc_domain_set_memmap_limit(ctx->xch, domid,
>                  (info->max_memkb + info->u.pv.slack_memkb));
> -    xc_domain_set_tsc_info(ctx->xch, domid, info->tsc_mode, 0, 0, 0);
> +    switch (info->tsc_mode) {
> +    case LIBXL_TSC_MODE_DEFAULT:
> +        tsc_mode = 0;
> +        break;
> +    case LIBXL_TSC_MODE_ALWAYS_EMULATE:
> +        tsc_mode = 1;
> +        break;
> +    case LIBXL_TSC_MODE_NATIVE:
> +        tsc_mode = 2;
> +        break;
> +    case LIBXL_TSC_MODE_NATIVE_PARAVIRT:
> +        tsc_mode = 3;
> +        break;
> +    default:
> +        abort();
> +    }
> +    xc_domain_set_tsc_info(ctx->xch, domid, tsc_mode, 0, 0, 0);
>      if ( info->disable_migrate )
>          xc_domain_disable_migrate(ctx->xch, domid);
>  
> diff -r 460b507e15f8 -r bc79b560aafa tools/libxl/libxl_types.idl
> --- a/tools/libxl/libxl_types.idl     Thu Nov 10 10:18:29 2011 +0000
> +++ b/tools/libxl/libxl_types.idl     Thu Nov 10 10:54:39 2011 +0000
> @@ -85,6 +85,13 @@ libxl_button = Enumeration("button", [
>      (2, "SLEEP"),
>      ])
>  
> +libxl_tsc_mode = Enumeration("tsc_mode", [
> +    (0, "default"),
> +    (1, "always_emulate"),
> +    (2, "native"),
> +    (3, "native_paravirt"),
> +    ])
> +
>  #
>  # Complex libxl types
>  #
> @@ -154,7 +161,7 @@ libxl_domain_create_info = Struct("domai
>  libxl_domain_build_info = Struct("domain_build_info",[
>      ("max_vcpus",       integer),
>      ("cur_vcpus",       integer),
> -    ("tsc_mode",        integer),
> +    ("tsc_mode",        libxl_tsc_mode),
>      ("max_memkb",       uint32),
>      ("target_memkb",    uint32),
>      ("video_memkb",     uint32),
> diff -r 460b507e15f8 -r bc79b560aafa tools/libxl/xl_cmdimpl.c
> --- a/tools/libxl/xl_cmdimpl.c        Thu Nov 10 10:18:29 2011 +0000
> +++ b/tools/libxl/xl_cmdimpl.c        Thu Nov 10 10:54:39 2011 +0000
> @@ -328,7 +328,7 @@ static void printf_info(int domid,
>  
>      printf("\t(build_info)\n");
>      printf("\t(max_vcpus %d)\n", b_info->max_vcpus);
> -    printf("\t(tsc_mode %d)\n", b_info->tsc_mode);
> +    printf("\t(tsc_mode %s)\n", libxl_tsc_mode_to_string(b_info->tsc_mode));
>      printf("\t(max_memkb %d)\n", b_info->max_memkb);
>      printf("\t(target_memkb %d)\n", b_info->target_memkb);
>      printf("\t(nomigrate %d)\n", b_info->disable_migrate);
> @@ -662,8 +662,23 @@ static void parse_config_data(const char
>      if (!xlu_cfg_get_long (config, "nomigrate", &l, 0))
>          b_info->disable_migrate = l;
>  
> -    if (!xlu_cfg_get_long(config, "tsc_mode", &l, 0))
> +    if (!xlu_cfg_get_long(config, "tsc_mode", &l, 1)) {
> +        fprintf(stderr, "WARNING: specifying \"tsc_mode\" as an integer is 
> deprecated. "
> +                "Please use the named parameter variant.\n");
> +        if (l < LIBXL_TSC_MODE_DEFAULT ||
> +            l > LIBXL_TSC_MODE_NATIVE_PARAVIRT) {
> +            fprintf(stderr, "ERROR: invalid value %ld for \"tsc_mode\"\n", 
> l);
> +            exit (1);
> +        }
>          b_info->tsc_mode = l;
> +    } else if (!xlu_cfg_get_string(config, "tsc_mode", &buf, 0)) {
> +        fprintf(stderr, "got a tsc mode string: \"%s\"\n", buf);
> +        if (libxl_tsc_mode_from_string(buf, &b_info->tsc_mode)) {
> +            fprintf(stderr, "ERROR: invalid value \"%s\" for \"tsc_mode\"\n",
> +                    buf);
> +            exit (1);
> +        }
> +    }
>  
>      if (!xlu_cfg_get_long (config, "videoram", &l, 0))
>          b_info->video_memkb = l * 1024;
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.