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

[Xen-devel] [PATCH] tools/libxc: Drop dombuilder support for PV autotranslate guests



c/s 4045953 "x86/paging: Enforce PG_external == PG_translate == PG_refcounts"
in the hypervisor finally prevented the construction of PV autotranslate
guests.

Remove support for such guests in the domain builder, bailing out with an
obvious "no longer supported" message, rather than a more obscure
"SHADOW_OP_ENABLED failed".

As a piece of cleanup, rename xc_dom_feature_translated() to
xc_dom_translated() to match its actual semantics.

Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
CC: Wei Liu <wei.liu2@xxxxxxxxxx>
---
 tools/libxc/include/xc_dom.h |   5 +-
 tools/libxc/xc_dom_arm.c     |   6 +-
 tools/libxc/xc_dom_boot.c    |   2 +-
 tools/libxc/xc_dom_x86.c     | 133 ++++++++-----------------------------------
 tools/libxl/libxl_dom.c      |   2 +-
 5 files changed, 30 insertions(+), 118 deletions(-)

diff --git a/tools/libxc/include/xc_dom.h b/tools/libxc/include/xc_dom.h
index b416eb5..ce47058 100644
--- a/tools/libxc/include/xc_dom.h
+++ b/tools/libxc/include/xc_dom.h
@@ -168,7 +168,6 @@ struct xc_dom_image {
     xc_interface *xch;
     domid_t guest_domid;
     int claim_enabled; /* 0 by default, 1 enables it */
-    int shadow_enabled;
 
     int xen_version;
     xen_capabilities_info_t xen_caps;
@@ -334,7 +333,7 @@ int xc_dom_gnttab_seed(xc_interface *xch, domid_t domid,
                        xen_pfn_t xenstore_gmfn,
                        domid_t console_domid,
                        domid_t xenstore_domid);
-int xc_dom_feature_translated(struct xc_dom_image *dom);
+bool xc_dom_translated(const struct xc_dom_image *dom);
 
 /* --- debugging bits ---------------------------------------------- */
 
@@ -420,7 +419,7 @@ static inline void *xc_dom_vaddr_to_ptr(struct xc_dom_image 
*dom,
 
 static inline xen_pfn_t xc_dom_p2m(struct xc_dom_image *dom, xen_pfn_t pfn)
 {
-    if ( dom->shadow_enabled || xc_dom_feature_translated(dom) )
+    if ( xc_dom_translated(dom) )
         return pfn;
     if (pfn < dom->rambase_pfn || pfn >= dom->rambase_pfn + dom->total_pages)
         return INVALID_MFN;
diff --git a/tools/libxc/xc_dom_arm.c b/tools/libxc/xc_dom_arm.c
index a7e839e..e7d4bd0 100644
--- a/tools/libxc/xc_dom_arm.c
+++ b/tools/libxc/xc_dom_arm.c
@@ -419,8 +419,6 @@ static int meminit(struct xc_dom_image *dom)
     if ( rc )
         return rc;
 
-    dom->shadow_enabled = 1;
-
     for ( i = 0; ramsize && i < GUEST_RAM_BANKS; i++ )
     {
         uint64_t banksize = ramsize > bankmax[i] ? bankmax[i] : ramsize;
@@ -504,9 +502,9 @@ static int meminit(struct xc_dom_image *dom)
     return 0;
 }
 
-int xc_dom_feature_translated(struct xc_dom_image *dom)
+bool xc_dom_translated(const struct xc_dom_image *dom)
 {
-    return 1;
+    return true;
 }
 
 /* ------------------------------------------------------------------------ */
diff --git a/tools/libxc/xc_dom_boot.c b/tools/libxc/xc_dom_boot.c
index 791041b..c3b44dd 100644
--- a/tools/libxc/xc_dom_boot.c
+++ b/tools/libxc/xc_dom_boot.c
@@ -407,7 +407,7 @@ int xc_dom_gnttab_hvm_seed(xc_interface *xch, domid_t domid,
 
 int xc_dom_gnttab_init(struct xc_dom_image *dom)
 {
-    if ( xc_dom_feature_translated(dom) ) {
+    if ( xc_dom_translated(dom) ) {
         return xc_dom_gnttab_hvm_seed(dom->xch, dom->guest_domid,
                                       dom->console_pfn, dom->xenstore_pfn,
                                       dom->console_domid, dom->xenstore_domid);
diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c
index c176c00..cb68efc 100644
--- a/tools/libxc/xc_dom_x86.c
+++ b/tools/libxc/xc_dom_x86.c
@@ -546,7 +546,7 @@ static int alloc_magic_pages(struct xc_dom_image *dom)
     dom->console_pfn = xc_dom_alloc_page(dom, "console");
     if ( dom->console_pfn == INVALID_PFN )
         return -1;
-    if ( xc_dom_feature_translated(dom) )
+    if ( xc_dom_translated(dom) )
     {
         dom->shared_info_pfn = xc_dom_alloc_page(dom, "shared info");
         if ( dom->shared_info_pfn == INVALID_PFN )
@@ -720,8 +720,7 @@ static int start_info_x86_32(struct xc_dom_image *dom)
     start_info_x86_32_t *start_info =
         xc_dom_pfn_to_ptr(dom, dom->start_info_pfn, 1);
     xen_pfn_t shinfo =
-        xc_dom_feature_translated(dom) ? dom->shared_info_pfn : dom->
-        shared_info_mfn;
+        xc_dom_translated(dom) ? dom->shared_info_pfn : dom->shared_info_mfn;
 
     DOMPRINTF_CALLED(dom->xch);
 
@@ -767,8 +766,7 @@ static int start_info_x86_64(struct xc_dom_image *dom)
     start_info_x86_64_t *start_info =
         xc_dom_pfn_to_ptr(dom, dom->start_info_pfn, 1);
     xen_pfn_t shinfo =
-        xc_dom_feature_translated(dom) ? dom->shared_info_pfn : dom->
-        shared_info_mfn;
+        xc_dom_translated(dom) ? dom->shared_info_pfn : dom->shared_info_mfn;
 
     DOMPRINTF_CALLED(dom->xch);
 
@@ -1063,29 +1061,6 @@ static int x86_compat(xc_interface *xch, domid_t domid, 
char *guest_type)
     return rc;
 }
 
-static int x86_shadow(xc_interface *xch, domid_t domid)
-{
-    int rc, mode;
-
-    DOMPRINTF_CALLED(xch);
-
-    mode = XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT |
-        XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE;
-
-    rc = xc_shadow_control(xch, domid,
-                           XEN_DOMCTL_SHADOW_OP_ENABLE,
-                           NULL, 0, NULL, mode, NULL);
-    if ( rc != 0 )
-    {
-        xc_dom_panic(xch, XC_INTERNAL_ERROR,
-                     "%s: SHADOW_OP_ENABLE (mode=0x%x) failed (rc=%d)",
-                     __FUNCTION__, mode, rc);
-        return rc;
-    }
-    xc_dom_printf(xch, "%s: shadow enabled (mode=0x%x)", __FUNCTION__, mode);
-    return rc;
-}
-
 static int meminit_pv(struct xc_dom_image *dom)
 {
     int rc;
@@ -1100,13 +1075,6 @@ static int meminit_pv(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) )
-    {
-        dom->shadow_enabled = 1;
-        rc = x86_shadow(dom->xch, dom->guest_domid);
-        if ( rc )
-            return rc;
-    }
 
     /* try to claim pages for early warning of insufficient memory avail */
     if ( dom->claim_enabled )
@@ -1576,37 +1544,14 @@ static int meminit_hvm(struct xc_dom_image *dom)
 
 static int bootearly(struct xc_dom_image *dom)
 {
-    DOMPRINTF("%s: doing nothing", __FUNCTION__);
-    return 0;
-}
-
-/*
- * Map grant table frames into guest physmap. PVH manages grant during boot
- * via HVM mechanisms.
- */
-static int map_grant_table_frames(struct xc_dom_image *dom)
-{
-    int i, rc;
-
-    for ( i = 0; ; i++ )
+    if ( dom->container_type == XC_DOM_PV_CONTAINER &&
+         elf_xen_feature_get(XENFEAT_auto_translated_physmap, dom->f_active) )
     {
-        rc = xc_domain_add_to_physmap(dom->xch, dom->guest_domid,
-                                      XENMAPSPACE_grant_table,
-                                      i, dom->p2m_size + i);
-        if ( rc != 0 )
-        {
-            if ( (i > 0) && (errno == EINVAL) )
-            {
-                DOMPRINTF("%s: %d grant tables mapped", __FUNCTION__, i);
-                break;
-            }
-            xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
-                         "%s: mapping grant tables failed " "(pfn=0x%" PRIpfn
-                         ", rc=%d, errno=%d)", __FUNCTION__, dom->p2m_size + i,
-                         rc, errno);
-            return rc;
-        }
+        DOMPRINTF("PV Autotranslate guests no longer supported");
+        errno = EOPNOTSUPP;
+        return -1;
     }
+
     return 0;
 }
 
@@ -1629,47 +1574,20 @@ static int bootlate_pv(struct xc_dom_image *dom)
         if ( !strcmp(types[i].guest, dom->guest_type) )
             pgd_type = types[i].pgd_type;
 
-    if ( !xc_dom_feature_translated(dom) )
-    {
-        /* paravirtualized guest */
-
-        /* Drop references to all initial page tables before pinning. */
-        xc_dom_unmap_one(dom, dom->pgtables_seg.pfn);
-        xc_dom_unmap_one(dom, dom->p2m_seg.pfn);
-        rc = pin_table(dom->xch, pgd_type,
-                       xc_dom_p2m(dom, dom->pgtables_seg.pfn),
-                       dom->guest_domid);
-        if ( rc != 0 )
-        {
-            xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
-                         "%s: pin_table failed (pfn 0x%" PRIpfn ", rc=%d)",
-                         __FUNCTION__, dom->pgtables_seg.pfn, rc);
-            return rc;
-        }
-        shinfo = dom->shared_info_mfn;
-    }
-    else
+    /* Drop references to all initial page tables before pinning. */
+    xc_dom_unmap_one(dom, dom->pgtables_seg.pfn);
+    xc_dom_unmap_one(dom, dom->p2m_seg.pfn);
+    rc = pin_table(dom->xch, pgd_type,
+                   xc_dom_p2m(dom, dom->pgtables_seg.pfn),
+                   dom->guest_domid);
+    if ( rc != 0 )
     {
-        /* paravirtualized guest with auto-translation */
-
-        /* Map shared info frame into guest physmap. */
-        rc = xc_domain_add_to_physmap(dom->xch, dom->guest_domid,
-                                      XENMAPSPACE_shared_info,
-                                      0, dom->shared_info_pfn);
-        if ( rc != 0 )
-        {
-            xc_dom_panic(dom->xch, XC_INTERNAL_ERROR, "%s: mapping"
-                         " shared_info failed (pfn=0x%" PRIpfn ", rc=%d, 
errno: %d)",
-                         __FUNCTION__, dom->shared_info_pfn, rc, errno);
-            return rc;
-        }
-
-        rc = map_grant_table_frames(dom);
-        if ( rc != 0 )
-            return rc;
-
-        shinfo = dom->shared_info_pfn;
+        xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
+                     "%s: pin_table failed (pfn 0x%" PRIpfn ", rc=%d)",
+                     __FUNCTION__, dom->pgtables_seg.pfn, rc);
+        return rc;
     }
+    shinfo = dom->shared_info_mfn;
 
     /* setup shared_info page */
     DOMPRINTF("%s: shared_info: pfn 0x%" PRIpfn ", mfn 0x%" PRIpfn "",
@@ -1823,13 +1741,10 @@ static int bootlate_hvm(struct xc_dom_image *dom)
     return 0;
 }
 
-int xc_dom_feature_translated(struct xc_dom_image *dom)
+bool xc_dom_translated(const struct xc_dom_image *dom)
 {
-    /* Guests running inside HVM containers are always auto-translated. */
-    if ( dom->container_type == XC_DOM_HVM_CONTAINER )
-        return 1;
-
-    return elf_xen_feature_get(XENFEAT_auto_translated_physmap, dom->f_active);
+    /* HVM guests are translated.  PV guests are not. */
+    return dom->container_type == XC_DOM_HVM_CONTAINER;
 }
 
 /* ------------------------------------------------------------------------ */
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index e133962..c88b904 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -767,7 +767,7 @@ int libxl__build_pv(libxl__gc *gc, uint32_t domid,
     if (ret != 0)
         goto out;
 
-    if (xc_dom_feature_translated(dom)) {
+    if (xc_dom_translated(dom)) {
         state->console_mfn = dom->console_pfn;
         state->store_mfn = dom->xenstore_pfn;
     } else {
-- 
2.1.4


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

 


Rackspace

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