]> xenbits.xensource.com Git - libvirt.git/commitdiff
libxl: populate xenstore memory entries at startup, handle dom0_mem
authorMarek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Wed, 19 Jun 2013 02:46:26 +0000 (04:46 +0200)
committerJim Fehlig <jfehlig@suse.com>
Wed, 19 Jun 2013 22:23:40 +0000 (16:23 -0600)
libxl uses some xenstore entries for hints in memory management
(especially when starting new domain). This includes dom0 memory limit
and Xen free memory margin, based on current system state. Entries are
created at first function usage, so force such call at daemon startup,
which most likely will be before any domain startup.
Also prevent automatic memory management if dom0_mem= option passed to
xen hypervisor - it is known to be incompatible with autoballoon.

Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
src/libxl/libxl_conf.h
src/libxl/libxl_driver.c

index 754fc404a6001e319ab238e41341a12651a33d51..16982c384680c36a687d58c24b18a8140508cb57 100644 (file)
@@ -63,6 +63,10 @@ struct _libxlDriverPrivate {
 
     virPortAllocatorPtr reservedVNCPorts;
 
+    /* Controls automatic ballooning of domain0. If true, attempt to get
+     * memory for new domains from domain0. */
+    bool autoballoon;
+
     size_t nactive;
     virStateInhibitCallback inhibitCallback;
     void *inhibitOpaque;
index 9a7cb20415ff5d878f6ae75d62940d5db5e79d92..5d0bd4efa73fc663b53dee9a27c56c5c39a2406e 100644 (file)
@@ -29,6 +29,7 @@
 #include <math.h>
 #include <libxl.h>
 #include <fcntl.h>
+#include <regex.h>
 
 #include "internal.h"
 #include "virlog.h"
@@ -978,7 +979,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
     if (libxlBuildDomainConfig(driver, vm->def, &d_config) < 0)
         goto error;
 
-    if (libxlFreeMem(priv, &d_config) < 0) {
+    if (driver->autoballoon && libxlFreeMem(priv, &d_config) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("libxenlight failed to get free memory for domain '%s'"),
                        d_config.c_info.name);
@@ -1160,6 +1161,29 @@ libxlStateCleanup(void)
     return 0;
 }
 
+static bool
+libxlGetAutoballoon(libxlDriverPrivatePtr driver)
+{
+    const libxl_version_info *info;
+    regex_t regex;
+    int ret;
+
+    info = libxl_get_version_info(driver->ctx);
+    if (!info)
+        return true; /* default to on */
+
+    ret = regcomp(&regex,
+            "(^| )dom0_mem=((|min:|max:)[0-9]+[bBkKmMgG]?,?)+($| )",
+            REG_NOSUB | REG_EXTENDED);
+    if (ret)
+        return true;
+
+    ret = regexec(&regex, info->commandline, 0, NULL, 0);
+    regfree(&regex);
+    return ret == REG_NOMATCH;
+}
+
+
 static int
 libxlStateInitialize(bool privileged,
                      virStateInhibitCallback callback ATTRIBUTE_UNUSED,
@@ -1169,6 +1193,7 @@ libxlStateInitialize(bool privileged,
     char *log_file = NULL;
     virCommandPtr cmd;
     int status, ret = 0;
+    unsigned int free_mem;
     char ebuf[1024];
 
     /* Disable libxl driver if non-root */
@@ -1293,6 +1318,16 @@ libxlStateInitialize(bool privileged,
                                                        NULL)))
         goto error;
 
+    /* This will fill xenstore info about free and dom0 memory if missing,
+     * should be called before starting first domain */
+    if (libxl_get_free_memory(libxl_driver->ctx, &free_mem)) {
+        VIR_ERROR(_("Unable to configure libxl's memory management parameters"));
+        goto error;
+    }
+
+    /* setup autoballoon */
+    libxl_driver->autoballoon = libxlGetAutoballoon(libxl_driver);
+
     /* Load running domains first. */
     if (virDomainObjListLoadAllConfigs(libxl_driver->domains,
                                        libxl_driver->stateDir,