[v4,2/2] sysctl: report shadow paging capability
diff mbox series

Message ID 20190910152538.36921-2-roger.pau@citrix.com
State New
Headers show
Series
  • [v4,1/2] sysctl/libxl: choose a sane default for HAP
Related show

Commit Message

Roger Pau Monné Sept. 10, 2019, 3:25 p.m. UTC
Report whether shadow paging is supported by the hypervisor, since it
can be disabled at build time.

Requested-by: Andrew Cooper <Andrew.Cooper3@citrix.com>
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
---
NB: I'm not sure the added check in
libxl__domain_create_info_setdefault is that useful, or if it could be
better placed somewhere else.
---
Changes since v3:
 - New in this version.
---
 tools/libxl/libxl.c             | 2 ++
 tools/libxl/libxl.h             | 6 ++++++
 tools/libxl/libxl_create.c      | 5 +++++
 tools/libxl/libxl_types.idl     | 1 +
 tools/ocaml/libs/xc/xenctrl.ml  | 1 +
 tools/ocaml/libs/xc/xenctrl.mli | 1 +
 tools/xl/xl_info.c              | 5 +++--
 xen/arch/x86/sysctl.c           | 2 ++
 xen/include/public/sysctl.h     | 5 ++++-
 9 files changed, 25 insertions(+), 3 deletions(-)

Comments

Jan Beulich Sept. 10, 2019, 3:40 p.m. UTC | #1
On 10.09.2019 17:25, Roger Pau Monne wrote:
> Report whether shadow paging is supported by the hypervisor, since it
> can be disabled at build time.
> 
> Requested-by: Andrew Cooper <Andrew.Cooper3@citrix.com>
> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>

The straightforward hypervisor part
Acked-by: Jan Beulich <jbeulich@suse.com>

Jan
Andrew Cooper Sept. 12, 2019, 9:51 a.m. UTC | #2
On 10/09/2019 16:25, Roger Pau Monne wrote:
> diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
> index 3ff67792a7..e8f5ebe929 100644
> --- a/tools/libxl/libxl.h
> +++ b/tools/libxl/libxl.h
> @@ -401,6 +401,12 @@
>   */
>  #define LIBXL_HAVE_PHYSINFO_CAP_HAP 1
>  
> +/*
> + * LIBXL_HAVE_PHYSINFO_CAP_HAP indicates that libxl_physinfo has a cap_shadow
> + * field that indicates whether software implemented paging is supported.
> + */
> +#define LIBXL_HAVE_PHYSINFO_CAP_SHADOW 1
> +

Is it really worth doing this, and not extending the previous define? 
Very little point having two going into the tree at the same time.

> diff --git a/tools/ocaml/libs/xc/xenctrl.ml b/tools/ocaml/libs/xc/xenctrl.ml
> index a5e77c943a..9f56e1df1a 100644
> --- a/tools/ocaml/libs/xc/xenctrl.ml
> +++ b/tools/ocaml/libs/xc/xenctrl.ml
> @@ -108,6 +108,7 @@ type physinfo_cap_flag =
>  	| CAP_PV
>  	| CAP_DirectIO
>  	| CAP_hap
> +	| CAP_shadow

Similarly as with HAP, this should at least be Shadow to match DirectIO.

Can be fixed on commit.

~Andrew
Ian Jackson Sept. 12, 2019, 10:45 a.m. UTC | #3
Roger Pau Monne writes ("[PATCH v4 2/2] sysctl: report shadow paging capability"):
> Report whether shadow paging is supported by the hypervisor, since it
> can be disabled at build time.
...
> NB: I'm not sure the added check in
> libxl__domain_create_info_setdefault is that useful, or if it could be
> better placed somewhere else.

Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>

> +        if (!info.cap_hap && !info.cap_shadow) {
> +            LOG(ERROR, "neither hap nor shadow paging available");
> +            return ERROR_INVAL;
> +        }
> +
>          libxl_defbool_setdefault(&c_info->hap, info.cap_hap);

I would have written

  if (cap_hap) setdefault(info->hap, true);
  else if (cap_shadow) setdefault(info->hap, false);
  else bomb_out();

but the result is equivalent.

Ian.

Patch
diff mbox series

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 5c0fcf320e..57073c06d5 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -400,6 +400,8 @@  int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo)
     physinfo->cap_hvm_directio =
         !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_directio);
     physinfo->cap_hap = !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_hap);
+    physinfo->cap_shadow =
+        !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_shadow);
 
     GC_FREE;
     return 0;
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 3ff67792a7..e8f5ebe929 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -401,6 +401,12 @@ 
  */
 #define LIBXL_HAVE_PHYSINFO_CAP_HAP 1
 
+/*
+ * LIBXL_HAVE_PHYSINFO_CAP_HAP indicates that libxl_physinfo has a cap_shadow
+ * field that indicates whether software implemented paging is supported.
+ */
+#define LIBXL_HAVE_PHYSINFO_CAP_SHADOW 1
+
 /*
  * libxl ABI compatibility
  *
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 3b45065597..47f10da465 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -44,6 +44,11 @@  int libxl__domain_create_info_setdefault(libxl__gc *gc,
         if (rc)
             return rc;
 
+        if (!info.cap_hap && !info.cap_shadow) {
+            LOG(ERROR, "neither hap nor shadow paging available");
+            return ERROR_INVAL;
+        }
+
         libxl_defbool_setdefault(&c_info->hap, info.cap_hap);
         libxl_defbool_setdefault(&c_info->oos, true);
     }
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 9e1f8515d3..6f431baec2 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -1026,6 +1026,7 @@  libxl_physinfo = Struct("physinfo", [
     ("cap_pv", bool),
     ("cap_hvm_directio", bool), # No longer HVM specific
     ("cap_hap", bool),
+    ("cap_shadow", bool),
     ], dir=DIR_OUT)
 
 libxl_connectorinfo = Struct("connectorinfo", [
diff --git a/tools/ocaml/libs/xc/xenctrl.ml b/tools/ocaml/libs/xc/xenctrl.ml
index a5e77c943a..9f56e1df1a 100644
--- a/tools/ocaml/libs/xc/xenctrl.ml
+++ b/tools/ocaml/libs/xc/xenctrl.ml
@@ -108,6 +108,7 @@  type physinfo_cap_flag =
 	| CAP_PV
 	| CAP_DirectIO
 	| CAP_hap
+	| CAP_shadow
 
 type physinfo =
 {
diff --git a/tools/ocaml/libs/xc/xenctrl.mli b/tools/ocaml/libs/xc/xenctrl.mli
index e92256654b..e06c53d0fa 100644
--- a/tools/ocaml/libs/xc/xenctrl.mli
+++ b/tools/ocaml/libs/xc/xenctrl.mli
@@ -93,6 +93,7 @@  type physinfo_cap_flag =
   | CAP_PV
   | CAP_DirectIO
   | CAP_hap
+  | CAP_shadow
 type physinfo = {
   threads_per_core : int;
   cores_per_socket : int;
diff --git a/tools/xl/xl_info.c b/tools/xl/xl_info.c
index aa6724bc7f..148c4740ae 100644
--- a/tools/xl/xl_info.c
+++ b/tools/xl/xl_info.c
@@ -210,12 +210,13 @@  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%s%s\n",
+    maybe_printf("virt_caps              :%s%s%s%s%s%s\n",
          info.cap_pv ? " pv" : "",
          info.cap_hvm ? " hvm" : "",
          info.cap_hvm && info.cap_hvm_directio ? " hvm_directio" : "",
          info.cap_pv && info.cap_hvm_directio ? " pv_directio" : "",
-         info.cap_hap ? " hap" : ""
+         info.cap_hap ? " hap" : "",
+         info.cap_shadow ? " shadow" : ""
         );
 
     vinfo = libxl_get_version_info(ctx);
diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c
index 5777a05ffc..50be0c722a 100644
--- a/xen/arch/x86/sysctl.c
+++ b/xen/arch/x86/sysctl.c
@@ -165,6 +165,8 @@  void arch_do_physinfo(struct xen_sysctl_physinfo *pi)
         pi->capabilities |= XEN_SYSCTL_PHYSCAP_pv;
     if ( hvm_hap_supported() )
         pi->capabilities |= XEN_SYSCTL_PHYSCAP_hap;
+    if ( IS_ENABLED(CONFIG_SHADOW_PAGING) )
+        pi->capabilities |= XEN_SYSCTL_PHYSCAP_shadow;
 }
 
 long arch_do_sysctl(
diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h
index d4b455619c..e324442f92 100644
--- a/xen/include/public/sysctl.h
+++ b/xen/include/public/sysctl.h
@@ -93,9 +93,12 @@  struct xen_sysctl_tbuf_op {
 /* The platform supports Hardware Assisted Paging. */
 #define _XEN_SYSCTL_PHYSCAP_hap          3
 #define XEN_SYSCTL_PHYSCAP_hap           (1u<<_XEN_SYSCTL_PHYSCAP_hap)
+/* The platform supports software paging. */
+#define _XEN_SYSCTL_PHYSCAP_shadow       4
+#define XEN_SYSCTL_PHYSCAP_shadow        (1u<<_XEN_SYSCTL_PHYSCAP_shadow)
 
 /* Max XEN_SYSCTL_PHYSCAP_* constant.  Used for ABI checking. */
-#define XEN_SYSCTL_PHYSCAP_MAX XEN_SYSCTL_PHYSCAP_hap
+#define XEN_SYSCTL_PHYSCAP_MAX XEN_SYSCTL_PHYSCAP_shadow
 
 struct xen_sysctl_physinfo {
     uint32_t threads_per_core;