diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 0c694f5daf..4d636f98b9 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -854,3 +854,42 @@ cleanup: VIR_FREE(cpumap); return ret; } + +int +libxlDomainFreeMem(libxlDomainObjPrivatePtr priv, libxl_domain_config *d_config) +{ + uint32_t needed_mem; + uint32_t free_mem; + size_t i; + int ret = -1; + int tries = 3; + int wait_secs = 10; + + if ((ret = libxl_domain_need_memory(priv->ctx, &d_config->b_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; +} diff --git a/src/libxl/libxl_domain.h b/src/libxl/libxl_domain.h index 775a91c718..7dacb36986 100644 --- a/src/libxl/libxl_domain.h +++ b/src/libxl/libxl_domain.h @@ -127,4 +127,8 @@ int libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver, virDomainObjPtr vm); +int +libxlDomainFreeMem(libxlDomainObjPrivatePtr priv, + libxl_domain_config *d_config); + #endif /* LIBXL_DOMAIN_H */ diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 4e83644b8c..cd2c4c6754 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -311,45 +311,6 @@ const struct libxl_event_hooks ev_hooks = { .disaster = NULL, }; -static int -libxlFreeMem(libxlDomainObjPrivatePtr priv, libxl_domain_config *d_config) -{ - uint32_t needed_mem; - uint32_t free_mem; - size_t i; - int ret = -1; - int tries = 3; - int wait_secs = 10; - - if ((ret = libxl_domain_need_memory(priv->ctx, &d_config->b_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. * @@ -429,7 +390,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, if (libxlBuildDomainConfig(driver, vm, &d_config) < 0) goto endjob; - if (cfg->autoballoon && libxlFreeMem(priv, &d_config) < 0) { + if (cfg->autoballoon && libxlDomainFreeMem(priv, &d_config) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("libxenlight failed to get free memory for domain '%s'"), d_config.c_info.name);