libvirt/src/libxl/libxl_api_wrapper.h
Jim Fehlig 417197a38f libxl: Fix Domain-0 ballooning logic
When Domain-0 autoballooning is enabled, it's possible that memory may
need to be ballooned down in Domain-0 to accommodate the needs of another
virtual machine. libxlDomainFreeMemory handles this task, but due to a
logic bug is underflowing the variable containing Domain-0 new
target memory. The resulting huge numbers are filtered by
libxlSetMemoryTargetWrapper and memory is not changed.

Under the covers, libxlDomainFreeMemory uses Xen's libxl_set_memory_target
API, which includes a 'relative' parameter for specifying how to set the
target. If true, the target is an increment/decrement value over the
current memory, otherwise target is taken as an absolute value.
libxlDomainFreeMemory sets 'relative' to true, but never allows for
negative values by declaring the target memory variable as an unsigned.
Fix by declaring the variable as signed, which also requried adjusting
libxlSetMemoryTargetWrapper.

Signed-off-by: Jim Fehlig <jfehlig@suse.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2023-09-19 09:56:29 -06:00

214 lines
5.0 KiB
C

/*
* libxl_api_wrapper.h: handle various libxl API variants
*
* Copyright (C) 2021 SUSE LLC
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <limits.h>
#include <libxl.h>
static inline int
libxlDomainCreateRestoreWrapper(libxl_ctx *ctx,
libxl_domain_config *d_config,
uint32_t *domid,
int restore_fd,
const libxl_domain_restore_params *params,
const libxl_asyncprogress_how *aop_console_how)
{
int ret;
#if LIBXL_API_VERSION < 0x040700
ret = libxl_domain_create_restore(ctx, d_config, domid, restore_fd, params,
NULL, aop_console_how);
#else
ret = libxl_domain_create_restore(ctx, d_config, domid, restore_fd, -1,
params, NULL, aop_console_how);
#endif
return ret;
}
static inline int
libxlRetrieveDomainConfigurationWrapper(libxl_ctx *ctx,
uint32_t domid,
libxl_domain_config *d_config)
{
int ret;
#if LIBXL_API_VERSION < 0x041300
ret = libxl_retrieve_domain_configuration(ctx, domid, d_config);
#else
ret = libxl_retrieve_domain_configuration(ctx, domid, d_config, NULL);
#endif
return ret;
}
static inline int
libxlDomainShutdownWrapper(libxl_ctx *ctx, uint32_t domid)
{
int ret;
#if LIBXL_API_VERSION < 0x041300
ret = libxl_domain_shutdown(ctx, domid);
#else
ret = libxl_domain_shutdown(ctx, domid, NULL);
#endif
return ret;
}
static inline int
libxlDomainRebootWrapper(libxl_ctx *ctx, uint32_t domid)
{
int ret;
#if LIBXL_API_VERSION < 0x041300
ret = libxl_domain_reboot(ctx, domid);
#else
ret = libxl_domain_reboot(ctx, domid, NULL);
#endif
return ret;
}
static inline int
libxlDomainPauseWrapper(libxl_ctx *ctx, uint32_t domid)
{
int ret;
#if LIBXL_API_VERSION < 0x041300
ret = libxl_domain_pause(ctx, domid);
#else
ret = libxl_domain_pause(ctx, domid, NULL);
#endif
return ret;
}
static inline int
libxlDomainUnpauseWrapper(libxl_ctx *ctx, uint32_t domid)
{
int ret;
#if LIBXL_API_VERSION < 0x041300
ret = libxl_domain_unpause(ctx, domid);
#else
ret = libxl_domain_unpause(ctx, domid, NULL);
#endif
return ret;
}
#define INVALID_DOMID ~0
static inline int
libxlDomainNeedMemoryWrapper(libxl_ctx *ctx,
libxl_domain_config *d_config,
uint64_t *need_memkb)
{
int ret;
#if LIBXL_API_VERSION < 0x040800
{
uint32_t val32 = 0;
ret = libxl_domain_need_memory(ctx, &d_config->b_info, &val32);
*need_memkb = val32;
}
#elif LIBXL_API_VERSION < 0x041300
ret = libxl_domain_need_memory(ctx, &d_config->b_info, need_memkb);
#else
ret = libxl_domain_need_memory(ctx, d_config, INVALID_DOMID, need_memkb);
#endif
return ret;
}
static inline int
libxlGetFreeMemoryWrapper(libxl_ctx *ctx, uint64_t *memkb)
{
int ret;
#if LIBXL_API_VERSION < 0x040800
{
uint32_t val32 = 0;
ret = libxl_get_free_memory(ctx, &val32);
*memkb = val32;
}
#else
ret = libxl_get_free_memory(ctx, memkb);
#endif
return ret;
}
static inline int
libxlSetVcpuonlineWrapper(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap)
{
int ret;
#if LIBXL_API_VERSION < 0x041300
ret = libxl_set_vcpuonline(ctx, domid, cpumap);
#else
ret = libxl_set_vcpuonline(ctx, domid, cpumap, NULL);
#endif
return ret;
}
static inline int
libxlSendTriggerWrapper(libxl_ctx *ctx,
uint32_t domid,
libxl_trigger trigger,
uint32_t vcpuid)
{
int ret;
#if LIBXL_API_VERSION < 0x041300
ret = libxl_send_trigger(ctx, domid, trigger, vcpuid);
#else
ret = libxl_send_trigger(ctx, domid, trigger, vcpuid, NULL);
#endif
return ret;
}
static inline int
libxlSetMemoryTargetWrapper(libxl_ctx *ctx,
uint32_t domid,
int64_t target_memkb,
int relative,
int enforce)
{
int ret = -1;
#ifdef LIBXL_HAVE_MEMKB_64BITS
ret = libxl_set_memory_target(ctx, domid, target_memkb, relative, enforce);
#else
if (target_memkb < INT_MAX) {
int32_t val32 = target_memkb;
ret = libxl_set_memory_target(ctx, domid, val32, relative, enforce);
}
#endif
return ret;
}