[libvirt] [PATCH v3] libxl: populate xenstore memory entries at startup, handle dom0_mem
Jim Fehlig
jfehlig at suse.com
Wed Jun 19 22:26:15 UTC 2013
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 at invisiblethingslab.com>
> ---
> 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,
>
More information about the libvir-list
mailing list