tools: Delete XEN_DOMCTL_disable_migrate
authorAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 11 Feb 2020 20:27:15 +0000 (20:27 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 18 Sep 2020 19:40:52 +0000 (20:40 +0100)
It is conceptually wrong for this information to exist in the hypervisor in
the first place.  Only the toolstack is capable of correctly reasoning about
the non-migrateability of guests.

This hypercall has only ever existed to control the visibility of the
Invariant TSC flag to the guest.  Now that we have properly disentanged that
and moved ITSC into the guests CPUID policy, delete this hypercall.

Furthermore, this fixes a corner case where Xen would override the toolstacks
choice of ITSC for a xenstore stubdomain.  That said, init-xenstore-domain
doesn't currently ask for ITSC, and MiniOS doesn't know what ITSC is either,
so nothing actually changes in practice.

Bump the DOMCTL_INTERFACE_VERSION for 4.15

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
12 files changed:
tools/libs/ctrl/include/xenctrl.h
tools/libs/ctrl/xc_domain.c
tools/libxl/libxl_dom.c
tools/python/xen/lowlevel/xc/xc.c
xen/arch/arm/domctl.c
xen/arch/x86/cpuid.c
xen/arch/x86/domctl.c
xen/common/domain.c
xen/include/public/domctl.h
xen/include/xen/sched.h
xen/xsm/flask/hooks.c
xen/xsm/flask/policy/access_vectors

index 0a921a95fabb0047d1f14e9e39b5a9dcf9497bda..73e9535fc8fbbc11ab2eb7c2712065e3deb0139d 100644 (file)
@@ -1351,8 +1351,6 @@ int xc_domain_get_tsc_info(xc_interface *xch,
                            uint32_t *gtsc_khz,
                            uint32_t *incarnation);
 
-int xc_domain_disable_migrate(xc_interface *xch, uint32_t domid);
-
 int xc_domain_maximum_gpfn(xc_interface *xch, uint32_t domid, xen_pfn_t *gpfns);
 
 int xc_domain_nr_gpfns(xc_interface *xch, uint32_t domid, xen_pfn_t *gpfns);
index 43fab50c06224dd39fb68f356ee485fafff3adbe..e7cea4a17db012ae5621965aff0750dc293bb21c 100644 (file)
@@ -815,15 +815,6 @@ int xc_domain_set_time_offset(xc_interface *xch,
     return do_domctl(xch, &domctl);
 }
 
-int xc_domain_disable_migrate(xc_interface *xch, uint32_t domid)
-{
-    DECLARE_DOMCTL;
-    domctl.cmd = XEN_DOMCTL_disable_migrate;
-    domctl.domain = domid;
-    domctl.u.disable_migrate.disable = 1;
-    return do_domctl(xch, &domctl);
-}
-
 int xc_domain_set_tsc_info(xc_interface *xch,
                            uint32_t domid,
                            uint32_t tsc_mode,
index e2dca64aa13654126b9a4f7f4b50eee916c3fb89..597a6826d1f4b924f8a82c969ac06ae0361db869 100644 (file)
@@ -257,12 +257,6 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid,
         return ERROR_FAIL;
     }
 
-    if (libxl_defbool_val(d_config->b_info.disable_migrate) &&
-        xc_domain_disable_migrate(ctx->xch, domid) != 0) {
-        LOG(ERROR, "Couldn't set nomigrate");
-        return ERROR_FAIL;
-    }
-
     /*
      * Check if the domain has any CPU or node affinity already. If not, try
      * to build up the latter via automatic NUMA placement. In fact, in case
index 8c7b184f0b3ce20b1f8fddd3b4e85287999c0c25..ce123f04095c565d3155fc943cc16b35b2cbaa97 100644 (file)
@@ -1469,20 +1469,6 @@ static PyObject *pyxc_domain_set_tsc_info(XcObject *self, PyObject *args)
     return zero;
 }
 
-static PyObject *pyxc_domain_disable_migrate(XcObject *self, PyObject *args)
-{
-    uint32_t dom;
-
-    if (!PyArg_ParseTuple(args, "i", &dom))
-        return NULL;
-
-    if (xc_domain_disable_migrate(self->xc_handle, dom) != 0)
-        return pyxc_error_to_exception(self->xc_handle);
-
-    Py_INCREF(zero);
-    return zero;
-}
-
 static PyObject *pyxc_domain_send_trigger(XcObject *self,
                                           PyObject *args,
                                           PyObject *kwds)
@@ -2306,13 +2292,6 @@ static PyMethodDef pyxc_methods[] = {
       "                   1=always emulate 2=never emulate\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
-    { "domain_disable_migrate",
-      (PyCFunction)pyxc_domain_disable_migrate,
-      METH_VARARGS, "\n"
-      "Marks domain as non-migratable AND non-restoreable\n"
-      " dom        [int]: Domain whose TSC mode is being set.\n"
-      "Returns: [int] 0 on success; -1 on error.\n" },
-
     { "domain_send_trigger",
       (PyCFunction)pyxc_domain_send_trigger,
       METH_VARARGS | METH_KEYWORDS, "\n"
index 9da88b8c64e2cf21996693ea824227c1e771cc8f..b7d27f37df8b0569b4ac0fd283fceaae3966f2b6 100644 (file)
@@ -146,10 +146,6 @@ long arch_do_domctl(struct xen_domctl *domctl, struct domain *d,
         return 0;
     }
 
-    case XEN_DOMCTL_disable_migrate:
-        d->disable_migrate = domctl->u.disable_migrate.disable;
-        return 0;
-
     case XEN_DOMCTL_vuart_op:
     {
         int rc;
index 23425790e1639afb09d22cb99099eb90cbb15970..dde3e95284735f33978d82188db4799c28580010 100644 (file)
@@ -708,7 +708,8 @@ int init_domain_cpuid_policy(struct domain *d)
     if ( !p )
         return -ENOMEM;
 
-    if ( d->disable_migrate )
+    /* The hardware domain can't migrate.  Give it ITSC if available. */
+    if ( is_hardware_domain(d) )
         p->extd.itsc = cpu_has_itsc;
 
     /*
index 7c644add922d3d38453156f7ce9da867326cadab..2ee29a0f783ceb334eec19951ca5015868d8c9ba 100644 (file)
@@ -1277,11 +1277,6 @@ long arch_do_domctl(
 
         break;
 
-    case XEN_DOMCTL_disable_migrate:
-        d->disable_migrate = domctl->u.disable_migrate.disable;
-        recalculate_cpuid_policy(d);
-        break;
-
     case XEN_DOMCTL_get_cpu_policy:
         /* Process the CPUID leaves. */
         if ( guest_handle_is_null(domctl->u.cpu_policy.cpuid_policy) )
index f0f9c62feb80a00b21955aadb6bd56ede9129ac4..61ffccde0cdf5c91557522646a69f7b6db8c516f 100644 (file)
@@ -371,7 +371,6 @@ struct domain *domain_create(domid_t domid,
         if ( hardware_domid < 0 || hardware_domid >= DOMID_FIRST_RESERVED )
             panic("The value of hardware_dom must be a valid domain ID\n");
 
-        d->disable_migrate = true;
         old_hwdom = hardware_domain;
         hardware_domain = d;
     }
@@ -452,9 +451,6 @@ struct domain *domain_create(domid_t domid,
         watchdog_domain_init(d);
         init_status |= INIT_watchdog;
 
-        if ( is_xenstore_domain(d) )
-            d->disable_migrate = true;
-
         d->iomem_caps = rangeset_new(d, "I/O Memory", RANGESETF_prettyprint_hex);
         d->irq_caps   = rangeset_new(d, "Interrupts", 0);
         if ( !d->iomem_caps || !d->irq_caps )
index 9464a9058a849b3a015935b80f1a2e2d7d632d54..5c5e55ebcb765fbac861aa1a997561248b79fef3 100644 (file)
@@ -38,7 +38,7 @@
 #include "hvm/save.h"
 #include "memory.h"
 
-#define XEN_DOMCTL_INTERFACE_VERSION 0x00000012
+#define XEN_DOMCTL_INTERFACE_VERSION 0x00000013
 
 /*
  * NB. xen_domctl.domain is an IN/OUT parameter for this operation.
@@ -730,11 +730,6 @@ struct xen_domctl_hvmcontext_partial {
     XEN_GUEST_HANDLE_64(uint8) buffer;  /* OUT: buffer to write record into */
 };
 
-/* XEN_DOMCTL_disable_migrate */
-struct xen_domctl_disable_migrate {
-    uint32_t disable; /* IN: 1: disable migration and restore */
-};
-
 
 /* XEN_DOMCTL_gettscinfo */
 /* XEN_DOMCTL_settscinfo */
@@ -1191,7 +1186,7 @@ struct xen_domctl {
 #define XEN_DOMCTL_gethvmcontext_partial         55
 #define XEN_DOMCTL_vm_event_op                   56
 #define XEN_DOMCTL_mem_sharing_op                57
-#define XEN_DOMCTL_disable_migrate               58
+/* #define XEN_DOMCTL_disable_migrate            58 - Obsolete */
 #define XEN_DOMCTL_gettscinfo                    59
 #define XEN_DOMCTL_settscinfo                    60
 #define XEN_DOMCTL_getpageframeinfo3             61
@@ -1242,7 +1237,6 @@ struct xen_domctl {
         struct xen_domctl_ioport_permission ioport_permission;
         struct xen_domctl_hypercall_init    hypercall_init;
         struct xen_domctl_settimeoffset     settimeoffset;
-        struct xen_domctl_disable_migrate   disable_migrate;
         struct xen_domctl_tsc_info          tsc_info;
         struct xen_domctl_hvmcontext        hvmcontext;
         struct xen_domctl_hvmcontext_partial hvmcontext_partial;
index ac53519d7f500e30b1b3c122c21a316b149b96b8..e9ce43cc9a7eec823d423b3eebed248c7f4bc4db 100644 (file)
@@ -401,8 +401,6 @@ struct domain
     bool             is_privileged;
     /* Can this guest access the Xen console? */
     bool             is_console;
-    /* Non-migratable and non-restoreable? */
-    bool             disable_migrate;
     /* Is this guest being debugged by dom0? */
     bool             debugger_attached;
     /*
index a314bf85ce6149c39a63a04ae1c2ab04776bb62e..fab5d30c3a93fbf5c9615db6c371cc333849bec9 100644 (file)
@@ -710,7 +710,6 @@ static int flask_domctl(struct domain *d, int cmd)
         return current_has_perm(d, SECCLASS_DOMAIN, DOMAIN__SETDEBUGGING);
 
     case XEN_DOMCTL_subscribe:
-    case XEN_DOMCTL_disable_migrate:
         return current_has_perm(d, SECCLASS_DOMAIN, DOMAIN__SET_MISC_INFO);
 
     case XEN_DOMCTL_set_virq_handler:
index b87c99ea98f13be73310e92f35f246a51596d44e..fde5162c7e4b8a3c7dbcb7a9273f9221e85ea291 100644 (file)
@@ -176,7 +176,7 @@ class domain
     getpodtarget
 # XENMEM_set_pod_target
     setpodtarget
-# XEN_DOMCTL_subscribe, XEN_DOMCTL_disable_migrate
+# XEN_DOMCTL_subscribe
     set_misc_info
 # XEN_DOMCTL_set_virq_handler
     set_virq_handler