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

Re: [Xen-devel] [PATCH 08/18] PVH xen: tools changes to create PVH domain



On Fri, 2013-05-24 at 18:25 -0700, Mukesh Rathor wrote:
> This patch contains tools changes for PVH. For now, only one mode is
> supported/tested:
>     dom0> losetup /dev/loop1 guest.img
>     dom0> In vm.cfg file: disk = ['phy:/dev/loop1,xvda,w']
> 
> Chnages in V2: None
> Chnages in V3:
>   - Document pvh boolean flag in xl.cfg.pod.5
>   - Rename ci_pvh and bi_pvh to pvh, and domcr_is_pvh to pvh_enabled.
> 
> Signed-off-by: Mukesh Rathor <mukesh.rathor@xxxxxxxxxx>
> ---
>  docs/man/xl.cfg.pod.5             |    3 +++
>  tools/debugger/gdbsx/xg/xg_main.c |    4 +++-
>  tools/libxc/xc_dom.h              |    1 +
>  tools/libxc/xc_dom_x86.c          |    7 ++++---
>  tools/libxl/libxl_create.c        |    2 ++
>  tools/libxl/libxl_dom.c           |   18 +++++++++++++++++-
>  tools/libxl/libxl_types.idl       |    2 ++
>  tools/libxl/libxl_x86.c           |    4 +++-
>  tools/libxl/xl_cmdimpl.c          |   11 +++++++++++
>  tools/xenstore/xenstored_domain.c |   12 +++++++-----

I think these should be split into
        libxc (dombuilder) changes
        libxl changes
        xenstore changes
        misc other (== gdbsx) changes.

Since most of the changes here are not mentioned at all in the commit
message (it was the xenstore change, which IMHO requires an explanation,
which prompted this)

>  10 files changed, 53 insertions(+), 11 deletions(-)

> diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c
> index f1be43b..24f6759 100644
> --- a/tools/libxc/xc_dom_x86.c
> +++ b/tools/libxc/xc_dom_x86.c
> @@ -832,7 +833,7 @@ int arch_setup_bootlate(struct xc_dom_image *dom)
>          }
>  
>          /* Map grant table frames into guest physmap. */
> -        for ( i = 0; ; i++ )
> +        for ( i = 0; !dom->pvh_enabled; i++ )

This is a bit of an odd way to do this (unless pvh_enabled somehow
changes in this loop, which I doubt). Can we just get a surrounding if
please.

> diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
> index b38d0a7..cefbf76 100644
> --- a/tools/libxl/libxl_dom.c
> +++ b/tools/libxl/libxl_dom.c
> @@ -329,9 +329,23 @@ int libxl__build_pv(libxl__gc *gc, uint32_t domid,
>      struct xc_dom_image *dom;
>      int ret;
>      int flags = 0;
> +    int is_pvh = libxl_defbool_val(info->pvh);
>  
>      xc_dom_loginit(ctx->xch);
>  
> +    if (is_pvh) {
> +        char *pv_feats = "writable_descriptor_tables|auto_translated_physmap"
> +                         "|supervisor_mode_kernel|hvm_callback_vector";
> +
> +        if (info->u.pv.features && info->u.pv.features[0] != '\0')
> +        {
> +            LOG(ERROR, "Didn't expect info->u.pv.features to contain 
> string\n");
> +            LOG(ERROR, "String: %s\n", info->u.pv.features);
> +            return ERROR_FAIL;
> +        }
> +        info->u.pv.features = strdup(pv_feats);

What is this trying to achieve? I think the requirement for certain
features to be present if pvh is enabled needs to be handled in the
xc_dom library and not here. This field is (I think) for the user to
specify other features which they may wish to require.

> +    }
> +
>      dom = xc_dom_allocate(ctx->xch, state->pv_cmdline, info->u.pv.features);
>      if (!dom) {
>          LOGE(ERROR, "xc_dom_allocate failed");
> @@ -370,6 +384,7 @@ int libxl__build_pv(libxl__gc *gc, uint32_t domid,
>      }
>  
>      dom->flags = flags;
> +    dom->pvh_enabled = is_pvh;

Not part of the flags?

>      dom->console_evtchn = state->console_port;
>      dom->console_domid = state->console_domid;
>      dom->xenstore_evtchn = state->store_port;
> @@ -400,7 +415,8 @@ int libxl__build_pv(libxl__gc *gc, uint32_t domid,
>          LOGE(ERROR, "xc_dom_boot_image failed");
>          goto out;
>      }
> -    if ( (ret = xc_dom_gnttab_init(dom)) != 0 ) {
> +    /* PVH sets up its own grant during boot via hvm mechanisms */
> +    if ( !is_pvh && (ret = xc_dom_gnttab_init(dom)) != 0 ) {
>          LOGE(ERROR, "xc_dom_gnttab_init failed");
>          goto out;
>      }
> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> index 8262cba..43e6d95 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -245,6 +245,7 @@ libxl_domain_create_info = Struct("domain_create_info",[
>      ("platformdata", libxl_key_value_list),
>      ("poolid",       uint32),
>      ("run_hotplug_scripts",libxl_defbool),
> +    ("pvh",          libxl_defbool),
>      ], dir=DIR_IN)
>  
>  MemKB = UInt(64, init_val = "LIBXL_MEMKB_DEFAULT")
> @@ -346,6 +347,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
>                                        ])),
>                   ("invalid", Struct(None, [])),
>                   ], keyvar_init_val = "LIBXL_DOMAIN_TYPE_INVALID")),
> +    ("pvh",       libxl_defbool),

I'm not quite convinced if the need for both of these bools in both
create and build, it's a bit of an odd quirk in our API which I need to
consider a bit deeper.

In any case if this one in build_info should exist it belongs in the pv
part of the preceding union since it is PV specific.

>      ], dir=DIR_IN
>  )
>  
> diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c
> index a17f6ae..424bc68 100644
> --- a/tools/libxl/libxl_x86.c
> +++ b/tools/libxl/libxl_x86.c
> @@ -290,7 +290,9 @@ int libxl__arch_domain_create(libxl__gc *gc, 
> libxl_domain_config *d_config,
>      if (rtc_timeoffset)
>          xc_domain_set_time_offset(ctx->xch, domid, rtc_timeoffset);
>  
> -    if (d_config->b_info.type == LIBXL_DOMAIN_TYPE_HVM) {
> +    if (d_config->b_info.type == LIBXL_DOMAIN_TYPE_HVM ||
> +        libxl_defbool_val(d_config->b_info.pvh)) {
> +
>          unsigned long shadow;
>          shadow = (d_config->b_info.shadow_memkb + 1023) / 1024;
>          xc_shadow_control(ctx->xch, domid, 
> XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION, NULL, 0, &shadow, 0, NULL);
> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
> index e13a64e..e032668 100644
> --- a/tools/libxl/xl_cmdimpl.c
> +++ b/tools/libxl/xl_cmdimpl.c
> @@ -610,8 +610,18 @@ static void parse_config_data(const char *config_source,
>          !strncmp(buf, "hvm", strlen(buf)))
>          c_info->type = LIBXL_DOMAIN_TYPE_HVM;
>  
> +    libxl_defbool_setdefault(&c_info->pvh, false);
> +    libxl_defbool_setdefault(&c_info->hap, false);

These belong in libxl__domain_create_info_setdefault() not here.

> +    xlu_cfg_get_defbool(config, "pvh", &c_info->pvh, 0);
>      xlu_cfg_get_defbool(config, "hap", &c_info->hap, 0);
>  
> +    if (libxl_defbool_val(c_info->pvh) &&
> +        !libxl_defbool_val(c_info->hap)) {
> +
> +        fprintf(stderr, "hap is required for PVH domain\n");
> +        exit(1);

This check belongs in setdefault or one of the functions in libxl which
consumes the create_info
> +    }
> +
>      if (xlu_cfg_replace_string (config, "name", &c_info->name, 0)) {
>          fprintf(stderr, "Domain name must be specified.\n");
>          exit(1);
> @@ -918,6 +928,7 @@ static void parse_config_data(const char *config_source,
>  
>          b_info->u.pv.cmdline = cmdline;
>          xlu_cfg_replace_string (config, "ramdisk", &b_info->u.pv.ramdisk, 0);
> +        libxl_defbool_set(&b_info->pvh, libxl_defbool_val(c_info->pvh));

b_info->pvh = c_info->pvh is the right way to do this. If possible I'd
like to remove one or the other from and handle it internally to the
library. As I say I need to chew on this one a bit more.


>          break;
>      }
>      default:
> diff --git a/tools/xenstore/xenstored_domain.c 
> b/tools/xenstore/xenstored_domain.c
> index bf83d58..10c23a1 100644
> --- a/tools/xenstore/xenstored_domain.c
> +++ b/tools/xenstore/xenstored_domain.c
> @@ -168,13 +168,15 @@ static int readchn(struct connection *conn, void *data, 
> unsigned int len)
>  static void *map_interface(domid_t domid, unsigned long mfn)
>  {
>       if (*xcg_handle != NULL) {
> -             /* this is the preferred method */
> -             return xc_gnttab_map_grant_ref(*xcg_handle, domid,
> +                void *addr;
> +                /* this is the preferred method */
> +                addr = xc_gnttab_map_grant_ref(*xcg_handle, domid,
>                       GNTTAB_RESERVED_XENSTORE, PROT_READ|PROT_WRITE);
> -     } else {
> -             return xc_map_foreign_range(*xc_handle, domid,
> -                     getpagesize(), PROT_READ|PROT_WRITE, mfn);
> +                if (addr)
> +                        return addr;
>       }
> +     return xc_map_foreign_range(*xc_handle, domid,
> +                     getpagesize(), PROT_READ|PROT_WRITE, mfn);
>  }
>  
>  static void unmap_interface(void *interface)



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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