[libvirt] [PATCH 4/8] Add memory functions to libxl driver
Jim Fehlig
jfehlig at novell.com
Thu Mar 24 10:21:48 UTC 2011
Markus Groß wrote:
> ---
> src/libxl/libxl_driver.c | 131 ++++++++++++++++++++++++++++++++++++++++++++--
> 1 files changed, 127 insertions(+), 4 deletions(-)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 49fc90f..32bf12e 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -1166,6 +1166,109 @@ cleanup:
> return ret;
> }
>
ACK.
Regards,
Jim
>
> +static unsigned long
> +libxlDomainGetMaxMemory(virDomainPtr dom)
> +{
> + libxlDriverPrivatePtr driver = dom->conn->privateData;
> + virDomainObjPtr vm;
> + unsigned long ret = 0;
> +
> + libxlDriverLock(driver);
> + vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> + libxlDriverUnlock(driver);
> +
> + if (!vm) {
> + libxlError(VIR_ERR_NO_DOMAIN, "%s", _("no domain with matching uuid"));
> + goto cleanup;
> + }
> + ret = vm->def->mem.max_balloon;
> +
> +cleanup:
> + if (vm)
> + virDomainObjUnlock(vm);
> + return ret;
> +}
> +
> +static int
> +libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long memory,
> + unsigned int flags)
> +{
> + libxlDriverPrivatePtr driver = dom->conn->privateData;
> + libxlDomainObjPrivatePtr priv;
> + virDomainObjPtr vm;
> + virDomainDefPtr def = NULL;
> + int ret = -1;
> +
> + virCheckFlags(VIR_DOMAIN_MEM_LIVE |
> + VIR_DOMAIN_MEM_CONFIG, -1);
> +
> + if ((flags & (VIR_DOMAIN_MEM_LIVE | VIR_DOMAIN_MEM_CONFIG)) == 0) {
> + libxlError(VIR_ERR_INVALID_ARG,
> + _("invalid flag combination: (0x%x)"), flags);
> + }
> +
> + libxlDriverLock(driver);
> + vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> + libxlDriverUnlock(driver);
> +
> + if (!vm) {
> + libxlError(VIR_ERR_NO_DOMAIN, "%s", _("no domain with matching uuid"));
> + goto cleanup;
> + }
> +
> + if (memory > vm->def->mem.max_balloon) {
> + libxlError(VIR_ERR_INVALID_ARG, "%s",
> + _("cannot set memory higher than max memory"));
> + goto cleanup;
> + }
> +
> + if (!virDomainObjIsActive(vm) && (flags & VIR_DOMAIN_MEM_LIVE)) {
> + libxlError(VIR_ERR_OPERATION_INVALID, "%s",
> + _("cannot set memory on an inactive domain"));
> + goto cleanup;
> + }
> +
> + if (flags & VIR_DOMAIN_MEM_CONFIG) {
> + if (!vm->persistent) {
> + libxlError(VIR_ERR_OPERATION_INVALID, "%s",
> + _("cannot change persistent config of a transient domain"));
> + goto cleanup;
> + }
> + if (!(def = virDomainObjGetPersistentDef(driver->caps, vm)))
> + goto cleanup;
> + }
> +
> + if (flags & VIR_DOMAIN_MEM_LIVE) {
> + priv = vm->privateData;
> +
> + if (libxl_set_memory_target(&priv->ctx, dom->id, memory, 0,
> + /* force */ 1) < 0) {
> + libxlError(VIR_ERR_INTERNAL_ERROR,
> + _("Failed to set memory for domain '%d'"
> + " with libxenlight"), dom->id);
> + goto cleanup;
> + }
> + }
> +
> + ret = 0;
> +
> + if (flags & VIR_DOMAIN_MEM_CONFIG) {
> + def->mem.cur_balloon = memory;
> + ret = virDomainSaveConfig(driver->configDir, def);
> + }
> +
> +cleanup:
> + if (vm)
> + virDomainObjUnlock(vm);
> + return ret;
> +}
> +
> +static int
> +libxlDomainSetMemory(virDomainPtr dom, unsigned long memory)
> +{
> + return libxlDomainSetMemoryFlags(dom, memory, VIR_DOMAIN_MEM_LIVE);
> +}
> +
> static int
> libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
> {
> @@ -1725,6 +1828,26 @@ libxlDomainEventDeregister(virConnectPtr conn,
> return ret;
> }
>
> +static unsigned long long
> +libxlNodeGetFreeMemory(virConnectPtr conn)
> +{
> + libxl_physinfo phy_info;
> + const libxl_version_info* ver_info;
> + libxlDriverPrivatePtr driver = conn->privateData;
> +
> + if (libxl_get_physinfo(&driver->ctx, &phy_info)) {
> + libxlError(VIR_ERR_INTERNAL_ERROR, _("libxl_get_physinfo_info failed"));
> + return 0;
> + }
> +
> + if ((ver_info = libxl_get_version_info(&driver->ctx)) == NULL) {
> + libxlError(VIR_ERR_INTERNAL_ERROR, _("libxl_get_version_info failed"));
> + return 0;
> + }
> +
> + return phy_info.free_pages * ver_info->pagesize;
> +}
> +
> static int
> libxlDomainIsActive(virDomainPtr dom)
> {
> @@ -1834,10 +1957,10 @@ static virDriver libxlDriver = {
> libxlDomainReboot, /* domainReboot */
> libxlDomainDestroy, /* domainDestroy */
> NULL, /* domainGetOSType */
> - NULL, /* domainGetMaxMemory */
> + libxlDomainGetMaxMemory, /* domainGetMaxMemory */
> NULL, /* domainSetMaxMemory */
> - NULL, /* domainSetMemory */
> - NULL, /* domainSetMemoryFlags */
> + libxlDomainSetMemory, /* domainSetMemory */
> + libxlDomainSetMemoryFlags, /* domainSetMemoryFlags */
> NULL, /* domainSetMemoryParameters */
> NULL, /* domainGetMemoryParameters */
> NULL, /* domainSetBlkioParameters */
> @@ -1883,7 +2006,7 @@ static virDriver libxlDriver = {
> NULL, /* domainMemoryPeek */
> NULL, /* domainGetBlockInfo */
> NULL, /* nodeGetCellsFreeMemory */
> - NULL, /* getFreeMemory */
> + libxlNodeGetFreeMemory, /* getFreeMemory */
> libxlDomainEventRegister, /* domainEventRegister */
> libxlDomainEventDeregister, /* domainEventDeregister */
> NULL, /* domainMigratePrepare2 */
>
More information about the libvir-list
mailing list