On Wed, May 04, 2011 at 12:17:06PM +0200, Markus Groß wrote: > 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 | 48 ++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 46 insertions(+), 2 deletions(-) > > diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c > index 247d78e..d4ca025 100644 > --- a/src/libxl/libxl_driver.c > +++ b/src/libxl/libxl_driver.c > @@ -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); That looks okay to me. My main question is if it's critical enough that we should push this in 0.9.1, ACK, but I don't know if it should be commited immediately Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list