[libvirt] [PATCH 2/3] libxl: Introduce configuration file for libxl driver

Jim Fehlig jfehlig at suse.com
Fri Apr 17 21:36:21 UTC 2015


Introduce libxl.conf configuration file, adding the 'autoballoon'
setting as the first knob for controlling the libxl driver.

Signed-off-by: Jim Fehlig <jfehlig at suse.com>
---
 libvirt.spec.in                      |  8 +++++
 src/Makefile.am                      | 24 +++++++++++++-
 src/libxl/libvirtd_libxl.aug         | 42 +++++++++++++++++++++++++
 src/libxl/libxl.conf                 | 12 +++++++
 src/libxl/libxl_conf.c               | 61 ++++++++++++++++++++++++++++++++----
 src/libxl/libxl_conf.h               |  5 +++
 src/libxl/libxl_driver.c             |  9 ++++++
 src/libxl/test_libvirtd_libxl.aug.in |  5 +++
 8 files changed, 159 insertions(+), 7 deletions(-)

diff --git a/libvirt.spec.in b/libvirt.spec.in
index e08c9e7..5d8a9d4 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -1592,6 +1592,11 @@ rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/libvirtd.qemu
 rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/lxc.conf
 rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/libvirtd.lxc
 %endif
+%if ! %{with_libxl}
+rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/libxl.conf
+rm -f $RPM_BUILD_ROOT%{_datadir}/augeas/lenses/libvirtd_libxl.aug
+rm -f $RPM_BUILD_ROOT%{_datadir}/augeas/lenses/tests/test_libvirtd_libxl.aug
+%endif
 %if ! %{with_uml}
 rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/libvirtd.uml
 %endif
@@ -1997,9 +2002,12 @@ exit 0
 %dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/uml/
         %endif
         %if %{with_libxl}
+%config(noreplace) %{_sysconfdir}/libvirt/libxl.conf
 %dir %attr(0700, root, root) %{_localstatedir}/log/libvirt/libxl/
 %ghost %dir %{_localstatedir}/run/libvirt/libxl/
 %dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/libxl/
+%{_datadir}/augeas/lenses/libvirtd_libxl.aug
+%{_datadir}/augeas/lenses/tests/test_libvirtd_libxl.aug
         %endif
         %if %{with_xen}
 %dir %attr(0700, root, root) %{_localstatedir}/lib/libvirt/xen/
diff --git a/src/Makefile.am b/src/Makefile.am
index 3c9eac6..9a5f16c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1222,7 +1222,15 @@ libvirt_driver_libxl_impl_la_CFLAGS = 		\
 libvirt_driver_libxl_impl_la_LDFLAGS = $(AM_LDFLAGS)
 libvirt_driver_libxl_impl_la_LIBADD = $(LIBXL_LIBS) libvirt_xenconfig.la
 libvirt_driver_libxl_impl_la_SOURCES = $(LIBXL_DRIVER_SOURCES)
+
+conf_DATA += libxl/libxl.conf
+augeas_DATA += libxl/libvirtd_libxl.aug
+augeastest_DATA += test_libvirtd_libxl.aug
+CLEANFILES += test_libvirtd_libxl.aug
+
 endif WITH_LIBXL
+EXTRA_DIST += libxl/libxl.conf libxl/libvirtd_libxl.aug \
+		libxl/test_libvirtd_libxl.aug.in
 
 if WITH_QEMU
 noinst_LTLIBRARIES += libvirt_driver_qemu_impl.la
@@ -1785,10 +1793,11 @@ check-local: check-augeas
 	check-augeas-lxc \
 	check-augeas-sanlock \
 	check-augeas-lockd \
+	check-augeas-libxl \
 	$(NULL)
 
 check-augeas: check-augeas-qemu check-augeas-lxc check-augeas-sanlock \
-	check-augeas-lockd check-augeas-virtlockd
+	check-augeas-lockd check-augeas-virtlockd check-augeas-libxl
 
 AUG_GENTEST = $(PERL) $(top_srcdir)/build-aux/augeas-gentest.pl
 EXTRA_DIST += $(top_srcdir)/build-aux/augeas-gentest.pl
@@ -1858,6 +1867,19 @@ check-augeas-virtlockd: test_virtlockd.aug
 	    '$(AUGPARSE)' -I $(srcdir)/locking test_virtlockd.aug; \
 	fi
 
+if WITH_LIBXL
+test_libvirtd_libxl.aug: libxl/test_libvirtd_libxl.aug.in \
+		$(srcdir)/libxl/libxl.conf $(AUG_GENTEST)
+	$(AM_V_GEN)$(AUG_GENTEST) $(srcdir)/libxl/libxl.conf $< $@
+
+check-augeas-libxl: test_libvirtd_libxl.aug
+	$(AM_V_GEN)if test -x '$(AUGPARSE)'; then \
+	    '$(AUGPARSE)' -I $(srcdir)/libxl test_libvirtd_libxl.aug; \
+	fi
+else ! WITH_LIBXL
+check-augeas-libxl:
+endif ! WITH_LIBXL
+
 #
 # Build our version script.  This is composed of three parts:
 #
diff --git a/src/libxl/libvirtd_libxl.aug b/src/libxl/libvirtd_libxl.aug
new file mode 100644
index 0000000..f225954
--- /dev/null
+++ b/src/libxl/libvirtd_libxl.aug
@@ -0,0 +1,42 @@
+(* /etc/libvirt/libxl.conf *)
+
+module Libvirtd_libxl =
+   autoload xfm
+
+   let eol   = del /[ \t]*\n/ "\n"
+   let value_sep   = del /[ \t]*=[ \t]*/  " = "
+   let indent = del /[ \t]*/ ""
+
+   let array_sep  = del /,[ \t\n]*/ ", "
+   let array_start = del /\[[ \t\n]*/ "[ "
+   let array_end = del /\]/ "]"
+
+   let str_val = del /\"/ "\"" . store /[^\"]*/ . del /\"/ "\""
+   let bool_val = store /0|1/
+   let int_val = store /[0-9]+/
+   let str_array_element = [ seq "el" . str_val ] . del /[ \t\n]*/ ""
+   let str_array_val = counter "el" . array_start . ( str_array_element . ( array_sep . str_array_element ) * ) ? . array_end
+
+   let str_entry       (kw:string) = [ key kw . value_sep . str_val ]
+   let bool_entry      (kw:string) = [ key kw . value_sep . bool_val ]
+   let int_entry       (kw:string) = [ key kw . value_sep . int_val ]
+   let str_array_entry (kw:string) = [ key kw . value_sep . str_array_val ]
+
+
+   (* Config entry grouped by function - same order as example config *)
+   let autoballoon_entry = bool_entry "autoballoon"
+
+   (* Each entry in the config is one of the following ... *)
+   let entry = autoballoon_entry
+
+   let comment = [ label "#comment" . del /#[ \t]*/ "# " .  store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]
+   let empty = [ label "#empty" . eol ]
+
+   let record = indent . entry . eol
+
+   let lns = ( record | comment | empty ) *
+
+   let filter = incl "/etc/libvirt/libxl.conf"
+              . Util.stdexcl
+
+   let xfm = transform lns filter
diff --git a/src/libxl/libxl.conf b/src/libxl/libxl.conf
new file mode 100644
index 0000000..c104d40
--- /dev/null
+++ b/src/libxl/libxl.conf
@@ -0,0 +1,12 @@
+# Master configuration file for the libxl driver.
+# All settings described here are optional.  If omitted, sensible
+# defaults are used.
+
+# Enable autoballooning of domain0
+#
+# By default, autoballooning of domain0 is enabled unless its memory
+# is already limited with Xen's "dom0_mem=" parameter, in which case
+# autoballooning is disabled.  Override the default behavior with the
+# autoballoon setting.
+#
+#autoballoon = 1
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 230daec..6ea2889 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -35,6 +35,7 @@
 #include "virlog.h"
 #include "virerror.h"
 #include "datatypes.h"
+#include "virconf.h"
 #include "virfile.h"
 #include "virstring.h"
 #include "viralloc.h"
@@ -1348,12 +1349,33 @@ libxlMakeVfbList(virPortAllocatorPtr graphicsports,
     return -1;
 }
 
+/*
+ * Get domain0 autoballoon configuration.  Honor user-specified
+ * setting in libxl.conf first.  If not specified, autoballooning
+ * is disabled when domain0's memory is set with 'dom0_mem'.
+ * Otherwise autoballooning is enabled.
+ */
 static int
-libxlGetAutoballoonConf(libxlDriverConfigPtr cfg, bool *autoballoon)
+libxlGetAutoballoonConf(libxlDriverConfigPtr cfg,
+                        virConfPtr conf)
 {
+    virConfValuePtr p;
     regex_t regex;
     int res;
 
+    p = virConfGetValue(conf, "autoballoon");
+    if (p) {
+        if (p->type != VIR_CONF_ULONG) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           "%s",
+                           _("Unexpected type for 'autoballoon' setting"));
+
+            return -1;
+        }
+        cfg->autoballoon = p->l != 0;
+        return 0;
+    }
+
     if ((res = regcomp(&regex,
                       "(^| )dom0_mem=((|min:|max:)[0-9]+[bBkKmMgG]?,?)+($| )",
                        REG_NOSUB | REG_EXTENDED)) != 0) {
@@ -1368,7 +1390,7 @@ libxlGetAutoballoonConf(libxlDriverConfigPtr cfg, bool *autoballoon)
 
     res = regexec(&regex, cfg->verInfo->commandline, 0, NULL, 0);
     regfree(&regex);
-    *autoballoon = res == REG_NOMATCH;
+    cfg->autoballoon = res == REG_NOMATCH;
     return 0;
 }
 
@@ -1386,6 +1408,8 @@ libxlDriverConfigNew(void)
     if (!(cfg = virObjectNew(libxlDriverConfigClass)))
         return NULL;
 
+    if (VIR_STRDUP(cfg->configBaseDir, LIBXL_CONFIG_BASE_DIR) < 0)
+        goto error;
     if (VIR_STRDUP(cfg->configDir, LIBXL_CONFIG_DIR) < 0)
         goto error;
     if (VIR_STRDUP(cfg->autostartDir, LIBXL_AUTOSTART_DIR) < 0)
@@ -1448,10 +1472,6 @@ libxlDriverConfigNew(void)
         goto error;
     }
 
-    /* setup autoballoon */
-    if (libxlGetAutoballoonConf(cfg, &cfg->autoballoon) < 0)
-        goto error;
-
     return cfg;
 
  error:
@@ -1471,6 +1491,35 @@ libxlDriverConfigGet(libxlDriverPrivatePtr driver)
     return cfg;
 }
 
+int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg,
+                              const char *filename)
+{
+    virConfPtr conf = NULL;
+    int ret = -1;
+
+    /* Check the file is readable before opening it, otherwise
+     * libvirt emits an error.
+     */
+    if (access(filename, R_OK) == -1) {
+        VIR_INFO("Could not read libxl config file %s", filename);
+        return 0;
+    }
+
+    if (!(conf = virConfReadFile(filename, 0)))
+        goto cleanup;
+
+    /* setup autoballoon */
+    if (libxlGetAutoballoonConf(cfg, conf) < 0)
+        goto cleanup;
+
+    ret = 0;
+
+ cleanup:
+    virConfFree(conf);
+    return ret;
+
+}
+
 int
 libxlMakePCI(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev)
 {
diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
index 59389d1..5ba1a71 100644
--- a/src/libxl/libxl_conf.h
+++ b/src/libxl/libxl_conf.h
@@ -46,6 +46,7 @@
 # define LIBXL_MIGRATION_PORT_MIN  49152
 # define LIBXL_MIGRATION_PORT_MAX  49216
 
+# define LIBXL_CONFIG_BASE_DIR SYSCONFDIR "/libvirt"
 # define LIBXL_CONFIG_DIR SYSCONFDIR "/libvirt/libxl"
 # define LIBXL_AUTOSTART_DIR LIBXL_CONFIG_DIR "/autostart"
 # define LIBXL_STATE_DIR LOCALSTATEDIR "/run/libvirt/libxl"
@@ -100,6 +101,7 @@ struct _libxlDriverConfig {
     /* Once created, caps are immutable */
     virCapsPtr caps;
 
+    char *configBaseDir;
     char *configDir;
     char *autostartDir;
     char *logDir;
@@ -167,6 +169,9 @@ int
 libxlDriverNodeGetInfo(libxlDriverPrivatePtr driver,
                        virNodeInfoPtr info);
 
+int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg,
+                              const char *filename);
+
 virCapsPtr
 libxlMakeCapabilities(libxl_ctx *ctx);
 
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 9eb071e..d4be8b7 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -504,6 +504,7 @@ libxlStateInitialize(bool privileged,
                      void *opaque ATTRIBUTE_UNUSED)
 {
     libxlDriverConfigPtr cfg;
+    char *driverConf = NULL;
     char ebuf[1024];
 
     if (!libxlDriverShouldLoad(privileged))
@@ -543,6 +544,13 @@ libxlStateInitialize(bool privileged,
     if (!(cfg = libxlDriverConfigNew()))
         goto error;
 
+    if (virAsprintf(&driverConf, "%s/libxl.conf", cfg->configBaseDir) < 0)
+        goto error;
+
+    if (libxlDriverConfigLoadFile(cfg, driverConf) < 0)
+        goto error;
+    VIR_FREE(driverConf);
+
     /* Register the callbacks providing access to libvirt's event loop */
     libxl_osevent_register_hooks(cfg->ctx, &libxl_osevent_callbacks, cfg->ctx);
 
@@ -628,6 +636,7 @@ libxlStateInitialize(bool privileged,
     return 0;
 
  error:
+    VIR_FREE(driverConf);
     libxlStateCleanup();
     return -1;
 }
diff --git a/src/libxl/test_libvirtd_libxl.aug.in b/src/libxl/test_libvirtd_libxl.aug.in
new file mode 100644
index 0000000..23e667c
--- /dev/null
+++ b/src/libxl/test_libvirtd_libxl.aug.in
@@ -0,0 +1,5 @@
+module Test_libvirtd_libxl =
+  ::CONFIG::
+
+   test Libvirtd_libxl.lns get conf =
+{ "autoballoon" = "1" }
-- 
1.8.4.5




More information about the libvir-list mailing list