|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 7/18 V2]: PVH xen: tools changes to create PVH domain
On Fri, Mar 15, 2013 at 05:34:23PM -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
Changes.
Two nit-picks below.
Otherwise 'Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>'
>
> Signed-off-by: Mukesh Rathor <mukesh.rathor@xxxxxxxxxx>
> ---
> 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 | 14 ++++++++------
> xen/include/public/domctl.h | 3 +++
> 10 files changed, 54 insertions(+), 12 deletions(-)
You are missing the changes to docs/man/xl.cfg.pod.5 to document
the 'pvh' boolean flag.
>
> diff --git a/tools/debugger/gdbsx/xg/xg_main.c
> b/tools/debugger/gdbsx/xg/xg_main.c
> index 64c7484..5736b86 100644
> --- a/tools/debugger/gdbsx/xg/xg_main.c
> +++ b/tools/debugger/gdbsx/xg/xg_main.c
> @@ -81,6 +81,7 @@ int xgtrc_on = 0;
> struct xen_domctl domctl; /* just use a global domctl */
>
> static int _hvm_guest; /* hvm guest? 32bit HVMs have 64bit
> context */
> +static int _pvh_guest; /* PV guest in HVM container */
> static domid_t _dom_id; /* guest domid */
> static int _max_vcpu_id; /* thus max_vcpu_id+1 VCPUs */
> static int _dom0_fd; /* fd of /dev/privcmd */
> @@ -309,6 +310,7 @@ xg_attach(int domid, int guest_bitness)
>
> _max_vcpu_id = domctl.u.getdomaininfo.max_vcpu_id;
> _hvm_guest = (domctl.u.getdomaininfo.flags & XEN_DOMINF_hvm_guest);
> + _pvh_guest = (domctl.u.getdomaininfo.flags & XEN_DOMINF_pvh_guest);
> return _max_vcpu_id;
> }
>
> @@ -369,7 +371,7 @@ _change_TF(vcpuid_t which_vcpu, int guest_bitness, int
> setit)
> int sz = sizeof(anyc);
>
> /* first try the MTF for hvm guest. otherwise do manually */
> - if (_hvm_guest) {
> + if (_hvm_guest || _pvh_guest) {
> domctl.u.debug_op.vcpu = which_vcpu;
> domctl.u.debug_op.op = setit ? XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON :
> XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF;
> diff --git a/tools/libxc/xc_dom.h b/tools/libxc/xc_dom.h
> index 779b9d4..e8a5260 100644
> --- a/tools/libxc/xc_dom.h
> +++ b/tools/libxc/xc_dom.h
> @@ -130,6 +130,7 @@ struct xc_dom_image {
> domid_t console_domid;
> domid_t xenstore_domid;
> xen_pfn_t shared_info_mfn;
> + int domcr_is_pvh;
How about 'pvh_enabled'? Could you also attach a little blurb in
a comment ? Perhaps saying:
/* PVH means no P2M, which means no page-tables for the guest
in the toolstack (it is all done in the hypervisor via
HAP. Also grant setup is done the HVM-ish way. */
>
> xc_interface *xch;
> domid_t guest_domid;
> diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c
> index eb9ac07..ca1bc95 100644
> --- a/tools/libxc/xc_dom_x86.c
> +++ b/tools/libxc/xc_dom_x86.c
> @@ -355,7 +355,8 @@ static int setup_pgtables_x86_64(struct xc_dom_image *dom)
> pgpfn = (addr - dom->parms.virt_base) >> PAGE_SHIFT_X86;
> l1tab[l1off] =
> pfn_to_paddr(xc_dom_p2m_guest(dom, pgpfn)) | L1_PROT;
> - if ( (addr >= dom->pgtables_seg.vstart) &&
> + if ( (!dom->domcr_is_pvh) &&
> + (addr >= dom->pgtables_seg.vstart) &&
> (addr < dom->pgtables_seg.vend) )
> l1tab[l1off] &= ~_PAGE_RW; /* page tables are r/o */
> if ( l1off == (L1_PAGETABLE_ENTRIES_X86_64 - 1) )
> @@ -672,7 +673,7 @@ int arch_setup_meminit(struct xc_dom_image *dom)
> rc = x86_compat(dom->xch, dom->guest_domid, dom->guest_type);
> if ( rc )
> return rc;
> - if ( xc_dom_feature_translated(dom) )
> + if ( xc_dom_feature_translated(dom) && !dom->domcr_is_pvh )
> {
> dom->shadow_enabled = 1;
> rc = x86_shadow(dom->xch, dom->guest_domid);
> @@ -786,7 +787,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->domcr_is_pvh; i++ )
> {
> rc = xc_domain_add_to_physmap(dom->xch, dom->guest_domid,
> XENMAPSPACE_grant_table,
> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
> index efeebf2..7f96dbd 100644
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -405,6 +405,8 @@ int libxl__domain_make(libxl__gc *gc,
> libxl_domain_create_info *info,
> flags |= XEN_DOMCTL_CDF_hvm_guest;
> flags |= libxl_defbool_val(info->hap) ? XEN_DOMCTL_CDF_hap : 0;
> flags |= libxl_defbool_val(info->oos) ? 0 : XEN_DOMCTL_CDF_oos_off;
> + } else if ( libxl_defbool_val(info->ci_pvh) ) {
> + flags |= XEN_DOMCTL_CDF_hap;
> }
> *domid = -1;
>
> diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
> index de555ee..4b23cf4 100644
> --- a/tools/libxl/libxl_dom.c
> +++ b/tools/libxl/libxl_dom.c
> @@ -322,9 +322,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->bi_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);
> + }
> +
> dom = xc_dom_allocate(ctx->xch, state->pv_cmdline, info->u.pv.features);
> if (!dom) {
> LOGE(ERROR, "xc_dom_allocate failed");
> @@ -363,6 +377,7 @@ int libxl__build_pv(libxl__gc *gc, uint32_t domid,
> }
>
> dom->flags = flags;
> + dom->domcr_is_pvh = is_pvh;
> dom->console_evtchn = state->console_port;
> dom->console_domid = state->console_domid;
> dom->xenstore_evtchn = state->store_port;
> @@ -392,7 +407,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 5b080ed..ae11309 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -244,6 +244,7 @@ libxl_domain_create_info = Struct("domain_create_info",[
> ("platformdata", libxl_key_value_list),
> ("poolid", uint32),
> ("run_hotplug_scripts",libxl_defbool),
> + ("ci_pvh", libxl_defbool),
No need for the 'ci'. When you start searching in the code it is obvious
that you using either b_info or c_info.
> ], dir=DIR_IN)
>
> MemKB = UInt(64, init_val = "LIBXL_MEMKB_DEFAULT")
> @@ -343,6 +344,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
> ])),
> ("invalid", Struct(None, [])),
> ], keyvar_init_val = "LIBXL_DOMAIN_TYPE_INVALID")),
> + ("bi_pvh", libxl_defbool),
Ditto. Just make it 'pvh'
> ], dir=DIR_IN
> )
>
> diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c
> index a17f6ae..3caba5c 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.bi_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 a98705e..788aa4a 100644
> --- a/tools/libxl/xl_cmdimpl.c
> +++ b/tools/libxl/xl_cmdimpl.c
> @@ -633,8 +633,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->ci_pvh, false);
> + libxl_defbool_setdefault(&c_info->hap, false);
> + xlu_cfg_get_defbool(config, "pvh", &c_info->ci_pvh, 0);
> xlu_cfg_get_defbool(config, "hap", &c_info->hap, 0);
>
> + if (libxl_defbool_val(c_info->ci_pvh) &&
> + !libxl_defbool_val(c_info->hap)) {
> +
> + fprintf(stderr, "hap is required for PVH domain\n");
> + exit(1);
> + }
> +
> if (xlu_cfg_replace_string (config, "name", &c_info->name, 0)) {
> fprintf(stderr, "Domain name must be specified.\n");
> exit(1);
> @@ -939,6 +949,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->bi_pvh,
> libxl_defbool_val(c_info->ci_pvh));
> break;
> }
> default:
> diff --git a/tools/xenstore/xenstored_domain.c
> b/tools/xenstore/xenstored_domain.c
> index bf83d58..6b7b986 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)
> diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
> index 113b8dc..a6241ef 100644
> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -89,6 +89,9 @@ struct xen_domctl_getdomaininfo {
> /* Being debugged. */
> #define _XEN_DOMINF_debugged 6
> #define XEN_DOMINF_debugged (1U<<_XEN_DOMINF_debugged)
> + /* domain is PVH */
> +#define _XEN_DOMINF_pvh_guest 7
> +#define XEN_DOMINF_pvh_guest (1U<<_XEN_DOMINF_pvh_guest)
> /* XEN_DOMINF_shutdown guest-supplied code. */
> #define XEN_DOMINF_shutdownmask 255
> #define XEN_DOMINF_shutdownshift 16
> --
> 1.7.2.3
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |