Discussion:
[Xen-changelog] [xen staging] xen: report PV capability in sysctl and use it in toolstack
p***@xen.org
2018-11-15 15:22:04 UTC
Permalink
commit f089fddd94101a710575d81207b21794c2ecd881
Author: Wei Liu <***@citrix.com>
AuthorDate: Fri Nov 9 11:23:46 2018 +0000
Commit: Wei Liu <***@citrix.com>
CommitDate: Thu Nov 15 15:16:49 2018 +0000

xen: report PV capability in sysctl and use it in toolstack

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 <***@citrix.com>
Acked-by: Andrew Cooper <***@citrix.com>
Acked-by: Ian Jackson <***@eu.citrix.com>
---
tools/libxl/libxl.c | 4 ++--
tools/libxl/libxl.h | 6 +++---
tools/libxl/libxl_types.idl | 4 ++--
tools/xl/xl_info.c | 7 ++++---
xen/arch/x86/sysctl.c | 2 ++
xen/include/public/sysctl.h | 5 ++++-
6 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index a0d9f2bfe7..ec71574e99 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -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;
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 2cfc1b08ad..a38e5cdba2 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -67,11 +67,11 @@
* 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
*
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 3b8f967651..51cf06a3a2 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -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", [
diff --git a/tools/xl/xl_info.c b/tools/xl/xl_info.c
index 93e2c5fa7d..46d9c9f712 100644
--- a/tools/xl/xl_info.c
+++ b/tools/xl/xl_info.c
@@ -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);
diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c
index 0bec7e5c3c..1916a3de1b 100644
--- a/xen/arch/x86/sysctl.c
+++ b/xen/arch/x86/sysctl.c
@@ -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;
}
diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h
index e3a14dfcc9..1ccf20787a 100644
--- a/xen/include/public/sysctl.h
+++ b/xen/include/public/sysctl.h
@@ -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;
--
generated by git-patchbot for /home/xen/git/xen.git#staging

Loading...