diff mbox series

[v10,10/12] tools/libxl: use libxenhypfs for setting xen runtime parameters

Message ID 20200519072106.26894-11-jgross@suse.com (mailing list archive)
State New, archived
Headers show
Series Add hypervisor sysfs-like support | expand

Commit Message

Jürgen Groß May 19, 2020, 7:21 a.m. UTC
Instead of xc_set_parameters() use xenhypfs_write() for setting
parameters of the hypervisor.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
V6:
- new patch
---
 tools/Rules.mk               |  2 +-
 tools/libxl/Makefile         |  3 +-
 tools/libxl/libxl.c          | 53 ++++++++++++++++++++++++++++++++----
 tools/libxl/libxl_internal.h |  1 +
 tools/libxl/xenlight.pc.in   |  2 +-
 tools/xl/xl_misc.c           |  1 -
 6 files changed, 52 insertions(+), 10 deletions(-)

Comments

Wei Liu May 19, 2020, 8:17 a.m. UTC | #1
On Tue, May 19, 2020 at 09:21:04AM +0200, Juergen Gross wrote:
> Instead of xc_set_parameters() use xenhypfs_write() for setting
> parameters of the hypervisor.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
> ---
> V6:
> - new patch
> ---
>  tools/Rules.mk               |  2 +-
>  tools/libxl/Makefile         |  3 +-
>  tools/libxl/libxl.c          | 53 ++++++++++++++++++++++++++++++++----
>  tools/libxl/libxl_internal.h |  1 +
>  tools/libxl/xenlight.pc.in   |  2 +-
>  tools/xl/xl_misc.c           |  1 -
>  6 files changed, 52 insertions(+), 10 deletions(-)
> 
> diff --git a/tools/Rules.mk b/tools/Rules.mk
> index ad6073fcad..883a193f9e 100644
> --- a/tools/Rules.mk
> +++ b/tools/Rules.mk
> @@ -178,7 +178,7 @@ CFLAGS += -O2 -fomit-frame-pointer
>  endif
>  
>  CFLAGS_libxenlight = -I$(XEN_XENLIGHT) $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude)
> -SHDEPS_libxenlight = $(SHLIB_libxenctrl) $(SHLIB_libxenstore)
> +SHDEPS_libxenlight = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenhypfs)
>  LDLIBS_libxenlight = $(SHDEPS_libxenlight) $(XEN_XENLIGHT)/libxenlight$(libextension)
>  SHLIB_libxenlight  = $(SHDEPS_libxenlight) -Wl,-rpath-link=$(XEN_XENLIGHT)
>  
> diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
> index 69fcf21577..a89ebab0b4 100644
> --- a/tools/libxl/Makefile
> +++ b/tools/libxl/Makefile
> @@ -20,7 +20,7 @@ LIBUUID_LIBS += -luuid
>  endif
>  
>  LIBXL_LIBS =
> -LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libxentoolcore) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS)
> +LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenhypfs) $(LDLIBS_libxenstore) $(LDLIBS_libxentoolcore) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS)
>  ifeq ($(CONFIG_LIBNL),y)
>  LIBXL_LIBS += $(LIBNL3_LIBS)
>  endif
> @@ -33,6 +33,7 @@ CFLAGS_LIBXL += $(CFLAGS_libxentoolcore)
>  CFLAGS_LIBXL += $(CFLAGS_libxenevtchn)
>  CFLAGS_LIBXL += $(CFLAGS_libxenctrl)
>  CFLAGS_LIBXL += $(CFLAGS_libxenguest)
> +CFLAGS_LIBXL += $(CFLAGS_libxenhypfs)
>  CFLAGS_LIBXL += $(CFLAGS_libxenstore)
>  ifeq ($(CONFIG_LIBNL),y)
>  CFLAGS_LIBXL += $(LIBNL3_CFLAGS)
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index f60fd3e4fd..621acc88f3 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -663,15 +663,56 @@ int libxl_set_parameters(libxl_ctx *ctx, char *params)
>  {
>      int ret;
>      GC_INIT(ctx);
> +    char *par, *val, *end, *path;
> +    xenhypfs_handle *hypfs;
>  
> -    ret = xc_set_parameters(ctx->xch, params);
> -    if (ret < 0) {
> -        LOGEV(ERROR, ret, "setting parameters");
> -        GC_FREE;
> -        return ERROR_FAIL;
> +    hypfs = xenhypfs_open(ctx->lg, 0);
> +    if (!hypfs) {
> +        LOGE(ERROR, "opening Xen hypfs");
> +        ret = ERROR_FAIL;
> +        goto out;
>      }
> +
> +    while (isblank(*params))
> +        params++;
> +
> +    for (par = params; *par; par = end) {
> +        end = strchr(par, ' ');
> +        if (!end)
> +            end = par + strlen(par);
> +
> +        val = strchr(par, '=');
> +        if (val > end)
> +            val = NULL;
> +        if (!val && !strncmp(par, "no", 2)) {
> +            path = libxl__sprintf(gc, "/params/%s", par + 2);
> +            path[end - par - 2 + 8] = 0;
> +            val = "no";
> +            par += 2;
> +        } else {
> +            path = libxl__sprintf(gc, "/params/%s", par);
> +            path[val - par + 8] = 0;
> +            val = libxl__strndup(gc, val + 1, end - val - 1);
> +        }
> +
> +	LOG(DEBUG, "setting node \"%s\" to value \"%s\"", path, val);

Indentation is wrong, but this can be fixed upon committing.

I would very much like the parsing be moved to libxlu. That can wait
till another day.

Acked-by: Wei Liu <wl@xen.org>
Andrew Cooper Sept. 10, 2020, 8:09 p.m. UTC | #2
On 19/05/2020 08:21, Juergen Gross wrote:
> Instead of xc_set_parameters() use xenhypfs_write() for setting
> parameters of the hypervisor.
>
> Signed-off-by: Juergen Gross <jgross@suse.com>

Something here isn't right.  XenServer's testing for XSA-304 has shown
the following bizarre behaviour.

# xl set-parameters ept=
libxl: error: libxl.c:701:libxl_set_parameters: setting parameters:
Invalid argument
cannot set parameters: ept=
# xl set-parameters ept=exec-sp
# xl set-parameters ept=no-exec-sp
libxl: error: libxl.c:701:libxl_set_parameters: setting parameters: No
space left on device
cannot set parameters: ept=no-exec-sp

Instrumentation shows that the first two examples here enter
parse_ept_param_runtime() with the provided string, while the third
example doesn't.

Given the -ENOSPC, I'm guessing there is some overly small internal
buffer somewhere in the hyperfs infrastructure ?

~Andrew
Jürgen Groß Sept. 11, 2020, 5:40 a.m. UTC | #3
On 10.09.20 22:09, Andrew Cooper wrote:
> On 19/05/2020 08:21, Juergen Gross wrote:
>> Instead of xc_set_parameters() use xenhypfs_write() for setting
>> parameters of the hypervisor.
>>
>> Signed-off-by: Juergen Gross <jgross@suse.com>
> 
> Something here isn't right.  XenServer's testing for XSA-304 has shown
> the following bizarre behaviour.
> 
> # xl set-parameters ept=
> libxl: error: libxl.c:701:libxl_set_parameters: setting parameters:
> Invalid argument
> cannot set parameters: ept=
> # xl set-parameters ept=exec-sp
> # xl set-parameters ept=no-exec-sp
> libxl: error: libxl.c:701:libxl_set_parameters: setting parameters: No
> space left on device
> cannot set parameters: ept=no-exec-sp
> 
> Instrumentation shows that the first two examples here enter
> parse_ept_param_runtime() with the provided string, while the third
> example doesn't.
> 
> Given the -ENOSPC, I'm guessing there is some overly small internal
> buffer somewhere in the hyperfs infrastructure ?

Not, really, just a bad test for max length. Patch sent.


Juergen
diff mbox series

Patch

diff --git a/tools/Rules.mk b/tools/Rules.mk
index ad6073fcad..883a193f9e 100644
--- a/tools/Rules.mk
+++ b/tools/Rules.mk
@@ -178,7 +178,7 @@  CFLAGS += -O2 -fomit-frame-pointer
 endif
 
 CFLAGS_libxenlight = -I$(XEN_XENLIGHT) $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude)
-SHDEPS_libxenlight = $(SHLIB_libxenctrl) $(SHLIB_libxenstore)
+SHDEPS_libxenlight = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenhypfs)
 LDLIBS_libxenlight = $(SHDEPS_libxenlight) $(XEN_XENLIGHT)/libxenlight$(libextension)
 SHLIB_libxenlight  = $(SHDEPS_libxenlight) -Wl,-rpath-link=$(XEN_XENLIGHT)
 
diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index 69fcf21577..a89ebab0b4 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -20,7 +20,7 @@  LIBUUID_LIBS += -luuid
 endif
 
 LIBXL_LIBS =
-LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libxentoolcore) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS)
+LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenhypfs) $(LDLIBS_libxenstore) $(LDLIBS_libxentoolcore) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS)
 ifeq ($(CONFIG_LIBNL),y)
 LIBXL_LIBS += $(LIBNL3_LIBS)
 endif
@@ -33,6 +33,7 @@  CFLAGS_LIBXL += $(CFLAGS_libxentoolcore)
 CFLAGS_LIBXL += $(CFLAGS_libxenevtchn)
 CFLAGS_LIBXL += $(CFLAGS_libxenctrl)
 CFLAGS_LIBXL += $(CFLAGS_libxenguest)
+CFLAGS_LIBXL += $(CFLAGS_libxenhypfs)
 CFLAGS_LIBXL += $(CFLAGS_libxenstore)
 ifeq ($(CONFIG_LIBNL),y)
 CFLAGS_LIBXL += $(LIBNL3_CFLAGS)
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index f60fd3e4fd..621acc88f3 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -663,15 +663,56 @@  int libxl_set_parameters(libxl_ctx *ctx, char *params)
 {
     int ret;
     GC_INIT(ctx);
+    char *par, *val, *end, *path;
+    xenhypfs_handle *hypfs;
 
-    ret = xc_set_parameters(ctx->xch, params);
-    if (ret < 0) {
-        LOGEV(ERROR, ret, "setting parameters");
-        GC_FREE;
-        return ERROR_FAIL;
+    hypfs = xenhypfs_open(ctx->lg, 0);
+    if (!hypfs) {
+        LOGE(ERROR, "opening Xen hypfs");
+        ret = ERROR_FAIL;
+        goto out;
     }
+
+    while (isblank(*params))
+        params++;
+
+    for (par = params; *par; par = end) {
+        end = strchr(par, ' ');
+        if (!end)
+            end = par + strlen(par);
+
+        val = strchr(par, '=');
+        if (val > end)
+            val = NULL;
+        if (!val && !strncmp(par, "no", 2)) {
+            path = libxl__sprintf(gc, "/params/%s", par + 2);
+            path[end - par - 2 + 8] = 0;
+            val = "no";
+            par += 2;
+        } else {
+            path = libxl__sprintf(gc, "/params/%s", par);
+            path[val - par + 8] = 0;
+            val = libxl__strndup(gc, val + 1, end - val - 1);
+        }
+
+	LOG(DEBUG, "setting node \"%s\" to value \"%s\"", path, val);
+        ret = xenhypfs_write(hypfs, path, val);
+        if (ret < 0) {
+            LOGE(ERROR, "setting parameters");
+            ret = ERROR_FAIL;
+            goto out;
+        }
+
+        while (isblank(*end))
+            end++;
+    }
+
+    ret = 0;
+
+out:
+    xenhypfs_close(hypfs);
     GC_FREE;
-    return 0;
+    return ret;
 }
 
 static int fd_set_flags(libxl_ctx *ctx, int fd,
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index e5effd2ad1..b85b771659 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -56,6 +56,7 @@ 
 #define XC_WANT_COMPAT_MAP_FOREIGN_API
 #include <xenctrl.h>
 #include <xenguest.h>
+#include <xenhypfs.h>
 #include <xc_dom.h>
 
 #include <xen-tools/libs.h>
diff --git a/tools/libxl/xenlight.pc.in b/tools/libxl/xenlight.pc.in
index c0f769fd20..6b351ba096 100644
--- a/tools/libxl/xenlight.pc.in
+++ b/tools/libxl/xenlight.pc.in
@@ -9,4 +9,4 @@  Description: The Xenlight library for Xen hypervisor
 Version: @@version@@
 Cflags: -I${includedir}
 Libs: @@libsflag@@${libdir} -lxenlight
-Requires.private: xentoollog,xenevtchn,xencontrol,xenguest,xenstore
+Requires.private: xentoollog,xenevtchn,xencontrol,xenguest,xenstore,xenhypfs
diff --git a/tools/xl/xl_misc.c b/tools/xl/xl_misc.c
index 20ed605f4f..08f0fb6dc9 100644
--- a/tools/xl/xl_misc.c
+++ b/tools/xl/xl_misc.c
@@ -168,7 +168,6 @@  int main_set_parameters(int argc, char **argv)
 
     if (libxl_set_parameters(ctx, params)) {
         fprintf(stderr, "cannot set parameters: %s\n", params);
-        fprintf(stderr, "Use \"xl dmesg\" to look for possible reason.\n");
         return EXIT_FAILURE;
     }