]> xenbits.xensource.com Git - people/iwj/xen.git/commitdiff
xen: report PV capability in sysctl and use it in toolstack
authorWei Liu <wei.liu2@citrix.com>
Fri, 9 Nov 2018 11:23:46 +0000 (11:23 +0000)
committerWei Liu <wei.liu2@citrix.com>
Thu, 15 Nov 2018 15:16:49 +0000 (15:16 +0000)
0e2c886ef ("xen: decouple HVM and IOMMU capabilities") provided a
truth table for what `xl info` would report. In order to make the
table work xen will need to report its PV capability.

Replace cap_directio with cap_pv in libxl IDL. It is safe to do so
because cap_directio has never been released. Revert to use
cap_hvm_directio to mark the availability of IOMMU, to save us from
providing a compatibility layer.

Don't bump sysctl version number because we've already done so.

Also provide a new virt_caps "pv", change "directio" to "pv_directio".
The truth table is now:

    pv      hvm     iommu           flags in xl info
    0       0       x               n/a
    0       1       0               hvm
    0       1       1               hvm hvm_directio
    1       0       0               pv
    1       0       1               pv pv_directio
    1       1       0               pv hvm
    1       1       1               pv hvm hvm_directio pv_directio

Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxl/libxl.c
tools/libxl/libxl.h
tools/libxl/libxl_types.idl
tools/xl/xl_info.c
xen/arch/x86/sysctl.c
xen/include/public/sysctl.h

index a0d9f2bfe7df61f09d010d0a76de5c93069c4461..ec71574e998a4e4f4f27bf4694636206b11113ba 100644 (file)
@@ -396,9 +396,9 @@ int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo)
     memcpy(physinfo->hw_cap,xcphysinfo.hw_cap, sizeof(physinfo->hw_cap));
 
     physinfo->cap_hvm = !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_hvm);
-    physinfo->cap_directio =
+    physinfo->cap_pv = !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_pv);
+    physinfo->cap_hvm_directio =
         !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_directio);
-    physinfo->cap_hvm_directio = physinfo->cap_hvm && physinfo->cap_directio;
 
     GC_FREE;
     return 0;
index 2cfc1b08adbcc2a16b4b69b03c33e8649a9c24d0..a38e5cdba2d60e8c82b9cc4aed81163f31509cb7 100644 (file)
  * the same $(XEN_VERSION) (e.g. throughout a major release).
  */
 
-/* LIBXL_HAVE_PHYSINFO_CAP_DIRECTIO
+/* LIBXL_HAVE_PHYSINFO_CAP_PV
  *
- * If this is defined, libxl_physinfo has a "cap_directio" field.
+ * If this is defined, libxl_physinfo has a "cap_pv" field.
  */
-#define LIBXL_HAVE_PHYSINFO_CAP_DIRECTIO 1
+#define LIBXL_HAVE_PHYSINFO_CAP_PV 1
 
 /* LIBXL_HAVE_CONSOLE_NOTIFY_FD
  *
index 3b8f96765190771cf5295285133bb257b5710524..51cf06a3a2cd63715b0b403455aae41574f271b3 100644 (file)
@@ -1013,8 +1013,8 @@ libxl_physinfo = Struct("physinfo", [
     ("hw_cap", libxl_hwcap),
 
     ("cap_hvm", bool),
-    ("cap_hvm_directio", bool),
-    ("cap_directio", bool),
+    ("cap_pv", bool),
+    ("cap_hvm_directio", bool), # No longer HVM specific
     ], dir=DIR_OUT)
 
 libxl_connectorinfo = Struct("connectorinfo", [
index 93e2c5fa7d73f3371fa51fc212f89aeb0cf88879..46d9c9f712315ef9c10769d77d16a166c497d84f 100644 (file)
@@ -210,10 +210,11 @@ static void output_physinfo(void)
          info.hw_cap[4], info.hw_cap[5], info.hw_cap[6], info.hw_cap[7]
         );
 
-    maybe_printf("virt_caps              :%s%s%s\n",
+    maybe_printf("virt_caps              :%s%s%s%s\n",
+         info.cap_pv ? " pv" : "",
          info.cap_hvm ? " hvm" : "",
-         info.cap_hvm_directio ? " hvm_directio" : "",
-         info.cap_directio ? " directio" : ""
+         info.cap_hvm && info.cap_hvm_directio ? " hvm_directio" : "",
+         info.cap_pv && info.cap_hvm_directio ? " pv_directio" : ""
         );
 
     vinfo = libxl_get_version_info(ctx);
index 0bec7e5c3c39c6e3a2c60423e1c4cb75ff8860c1..1916a3de1b9581cd6ede28104c46a3b0974c48fd 100644 (file)
@@ -120,6 +120,8 @@ void arch_do_physinfo(struct xen_sysctl_physinfo *pi)
            min(sizeof(pi->hw_cap), sizeof(boot_cpu_data.x86_capability)));
     if ( hvm_enabled )
         pi->capabilities |= XEN_SYSCTL_PHYSCAP_hvm;
+    if ( IS_ENABLED(CONFIG_PV) )
+        pi->capabilities |= XEN_SYSCTL_PHYSCAP_pv;
     if ( iommu_enabled )
         pi->capabilities |= XEN_SYSCTL_PHYSCAP_directio;
 }
index e3a14dfcc953844b8dc62922109c080216372f5f..1ccf20787a5471e387bc2c9dfab8d035dc8e2b9a 100644 (file)
@@ -85,8 +85,11 @@ struct xen_sysctl_tbuf_op {
  /* (x86) The platform supports HVM guests. */
 #define _XEN_SYSCTL_PHYSCAP_hvm          0
 #define XEN_SYSCTL_PHYSCAP_hvm           (1u<<_XEN_SYSCTL_PHYSCAP_hvm)
+ /* (x86) The platform supports PV guests. */
+#define _XEN_SYSCTL_PHYSCAP_pv           1
+#define XEN_SYSCTL_PHYSCAP_pv            (1u<<_XEN_SYSCTL_PHYSCAP_pv)
  /* (x86) The platform supports direct access to I/O devices with IOMMU. */
-#define _XEN_SYSCTL_PHYSCAP_directio 1
+#define _XEN_SYSCTL_PHYSCAP_directio     2
 #define XEN_SYSCTL_PHYSCAP_directio  (1u<<_XEN_SYSCTL_PHYSCAP_directio)
 struct xen_sysctl_physinfo {
     uint32_t threads_per_core;