Marek Marczykowski-Górecki wrote: > 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@xxxxxxxxxxxxxxxxxxxxxx> > --- > Changes in v2: > - disable autoballoon when dom0_mem option detected > - rebase on 1.0.6+ > Changes in v3: > - improve comments and error messages > - rename auto_autoballoon > > src/libxl/libxl_conf.h | 4 ++++ > src/libxl/libxl_driver.c | 37 ++++++++++++++++++++++++++++++++++++- > 2 files changed, 40 insertions(+), 1 deletion(-) > > diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h > index 44ecd41..42bcdbc 100644 > --- a/src/libxl/libxl_conf.h > +++ b/src/libxl/libxl_conf.h > @@ -62,6 +62,10 @@ struct _libxlDriverPrivate { > > virPortAllocatorPtr reservedVNCPorts; > > + /* Controls automatic ballooning of domain0. If true, get memory for new > + * domains from domain0. */ > + bool autoballoon; > + > size_t nactive; > virStateInhibitCallback inhibitCallback; > void *inhibitOpaque; > diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c > index 3990354..89f4f12 100644 > --- a/src/libxl/libxl_driver.c > +++ b/src/libxl/libxl_driver.c > @@ -29,6 +29,7 @@ > #include <math.h> > #include <libxl.h> > #include <fcntl.h> > +#include <regex.h> > > #include "internal.h" > #include "virlog.h" > @@ -963,7 +964,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); > @@ -1146,6 +1147,29 @@ libxlStateCleanup(void) > } > > static int > +libxlGetAutoballoon(libxlDriverPrivatePtr driver) > I changed this function to return a bool as suggested in v2 and pushed. Regards, Jim > +{ > + const libxl_version_info *info; > + regex_t regex; > + int ret; > + > + info = libxl_get_version_info(driver->ctx); > + if (!info) > + return 1; /* default to on */ > + > + ret = regcomp(®ex, > + "(^| )dom0_mem=((|min:|max:)[0-9]+[bBkKmMgG]?,?)+($| )", > + REG_NOSUB | REG_EXTENDED); > + if (ret) > + return 1; > + > + ret = regexec(®ex, info->commandline, 0, NULL, 0); > + regfree(®ex); > + return ret == REG_NOMATCH; > +} > + > + > +static int > libxlStateInitialize(bool privileged, > virStateInhibitCallback callback ATTRIBUTE_UNUSED, > void *opaque ATTRIBUTE_UNUSED) > @@ -1154,6 +1178,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 */ > @@ -1278,6 +1303,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, > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list