]> xenbits.xensource.com Git - libvirt.git/commitdiff
Balloon dom0 in libxl driver
authorMarkus Groß <gross@univention.de>
Wed, 4 May 2011 10:17:06 +0000 (12:17 +0200)
committerJim Fehlig <jfehlig@novell.com>
Fri, 6 May 2011 17:20:33 +0000 (11:20 -0600)
Creating a domU on a freshly booted dom0 does not work,
because the libxl driver does not allocate memory for the domU.
After creating a domain with xl libvirt is able to create domains too.
This patch reserves enough memory for the domU first.

src/libxl/libxl_driver.c

index dec4f431a118de9a3c2baceafef06b2693682f16..a2c8467a14bfc4bbcecd7eb71b70ae45a3a18af8 100644 (file)
@@ -498,6 +498,46 @@ cleanup:
     return ret;
 }
 
+static int
+libxlFreeMem(libxlDomainObjPrivatePtr priv, libxl_domain_config *d_config)
+{
+    uint32_t needed_mem;
+    uint32_t free_mem;
+    int i;
+    int ret = -1;
+    int tries = 3;
+    int wait_secs = 10;
+
+    if ((ret = libxl_domain_need_memory(&priv->ctx, &d_config->b_info,
+                                        &d_config->dm_info,
+                                        &needed_mem)) >= 0) {
+        for (i = 0; i < tries; ++i) {
+            if ((ret = libxl_get_free_memory(&priv->ctx, &free_mem)) < 0)
+                break;
+
+            if (free_mem >= needed_mem) {
+                ret = 0;
+                break;
+            }
+
+            if ((ret = libxl_set_memory_target(&priv->ctx, 0,
+                                               free_mem - needed_mem,
+                                               /* relative */ 1, 0)) < 0)
+                break;
+
+            ret = libxl_wait_for_free_memory(&priv->ctx, 0, needed_mem,
+                                             wait_secs);
+            if (ret == 0 || ret != ERROR_NOMEM)
+                break;
+
+            if ((ret = libxl_wait_for_memory_target(&priv->ctx, 0, 1)) < 0)
+                break;
+        }
+    }
+
+    return ret;
+}
+
 /*
  * Start a domain through libxenlight.
  *
@@ -521,8 +561,12 @@ libxlVmStart(libxlDriverPrivatePtr driver,
     if (libxlBuildDomainConfig(driver, def, &d_config) < 0 )
         return -1;
 
-    //TODO: Balloon dom0 ??
-    //ret = freemem(&d_config->b_info, &d_config->dm_info);
+    if (libxlFreeMem(priv, &d_config) < 0) {
+        libxlError(VIR_ERR_INTERNAL_ERROR,
+                   _("libxenlight failed to get free memory for domain '%s'"),
+                   d_config.c_info.name);
+        goto error;
+    }
 
     ret = libxl_domain_create_new(&priv->ctx, &d_config,
                                   NULL, &child_console_pid, &domid);