[PATCH v2 00/12] libxl: bump LIBXL_API_VERSION

Various changes to handle libxl API variants. Olaf v2: - adjust names of wrapper functions adjust indent adjust style of braces rename new header Olaf Hering (12): libxl: add API wrapper for libxl_domain_create_restore libxl: add API wrapper for libxl_retrieve_domain_configuration libxl: add API wrapper for libxl_domain_shutdown libxl: add API wrapper for libxl_domain_reboot libxl: add API wrapper for libxl_domain_pause libxl: add API wrapper for libxl_domain_unpause libxl: add API wrapper for libxl_domain_need_memory libxl: add API wrapper for libxl_get_free_memory libxl: add API wrapper for libxl_set_vcpuonline libxl: add API wrapper for libxl_send_trigger libxl: add API wrapper for libxl_set_memory_target libxl: use API 4.13 to support domUs with more than 4TB meson.build | 7 +- src/libxl/libxl_api_wrapper.h | 217 ++++++++++++++++++++++++++++++++++ src/libxl/libxl_conf.c | 5 +- src/libxl/libxl_domain.c | 27 +++-- src/libxl/libxl_driver.c | 25 ++-- src/libxl/libxl_migration.c | 3 +- tests/libxlmock.c | 7 +- 7 files changed, 261 insertions(+), 30 deletions(-) create mode 100644 src/libxl/libxl_api_wrapper.h

Upcoming changes will use different LIBXL_API_VERSION variants. Prepare libxl_domain_create_restore, which got a new parameter "send_back_fd" in Xen 4.7. libvirt does not use this parameter. No functional change intended. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 44 +++++++++++++++++++++++++++++++++++ src/libxl/libxl_domain.c | 5 ++-- 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 src/libxl/libxl_api_wrapper.h diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h new file mode 100644 index 0000000000..3b988db5b9 --- /dev/null +++ b/src/libxl/libxl_api_wrapper.h @@ -0,0 +1,44 @@ +/* + * 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 <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; +} diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 014f6aceca..9adba9f2bf 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -22,6 +22,7 @@ #include <fcntl.h> +#include "libxl_api_wrapper.h" #include "libxl_domain.h" #include "libxl_capabilities.h" @@ -1396,8 +1397,8 @@ libxlDomainStart(libxlDriverPrivatePtr driver, #ifdef LIBXL_HAVE_SRM_V2 params.stream_version = restore_ver; #endif - ret = libxl_domain_create_restore(cfg->ctx, &d_config, &domid, - restore_fd, ¶ms, NULL, + ret = libxlDomainCreateRestoreWrapper(cfg->ctx, &d_config, &domid, + restore_fd, ¶ms, &aop_console_how); libxl_domain_restore_params_dispose(¶ms); }

Upcoming changes will use different LIBXL_API_VERSION variants. Prepare libxl_retrieve_domain_configuration, which got a new parameter "libxl_asyncop_how" in Xen 4.12. libvirt does not use this parameter. No functional change intended. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 16 ++++++++++++++++ src/libxl/libxl_domain.c | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h index 3b988db5b9..4763947b50 100644 --- a/src/libxl/libxl_api_wrapper.h +++ b/src/libxl/libxl_api_wrapper.h @@ -42,3 +42,19 @@ libxlDomainCreateRestoreWrapper(libxl_ctx *ctx, 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; +} diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 9adba9f2bf..809108fd7d 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -572,8 +572,8 @@ libxlDomainShutdownThread(void *opaque) } else if (xl_reason == LIBXL_SHUTDOWN_REASON_SOFT_RESET) { libxlDomainObjPrivatePtr priv = vm->privateData; - if (libxl_retrieve_domain_configuration(cfg->ctx, vm->def->id, - &d_config) != 0) { + if (libxlRetrieveDomainConfigurationWrapper(cfg->ctx, vm->def->id, + &d_config) != 0) { VIR_ERROR(_("Failed to retrieve config for VM '%s'. " "Unable to perform soft reset. Destroying VM"), vm->def->name);

Upcoming changes will use different LIBXL_API_VERSION variants. Prepare libxl_domain_shutdown, which got a new parameter "ao_how" in Xen 4.12. libvirt does not use this parameter. No functional change intended. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 14 ++++++++++++++ src/libxl/libxl_driver.c | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h index 4763947b50..8b25c3fc9e 100644 --- a/src/libxl/libxl_api_wrapper.h +++ b/src/libxl/libxl_api_wrapper.h @@ -58,3 +58,17 @@ libxlRetrieveDomainConfigurationWrapper(libxl_ctx *ctx, 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; +} diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index e3d769b5d9..d5e53154de 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -37,6 +37,7 @@ #include "viruuid.h" #include "virhook.h" #include "vircommand.h" +#include "libxl_api_wrapper.h" #include "libxl_domain.h" #include "libxl_driver.h" #include "libxl_conf.h" @@ -1292,7 +1293,7 @@ libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags) goto cleanup; if (flags & VIR_DOMAIN_SHUTDOWN_PARAVIRT) { - ret = libxl_domain_shutdown(cfg->ctx, vm->def->id); + ret = libxlDomainShutdownWrapper(cfg->ctx, vm->def->id); if (ret == 0) goto cleanup;

Upcoming changes will use different LIBXL_API_VERSION variants. Prepare libxl_domain_reboot, which got a new parameter "ao_how" in Xen 4.12. libvirt does not use this parameter. No functional change intended. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 14 ++++++++++++++ src/libxl/libxl_driver.c | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h index 8b25c3fc9e..6744ba7db3 100644 --- a/src/libxl/libxl_api_wrapper.h +++ b/src/libxl/libxl_api_wrapper.h @@ -72,3 +72,17 @@ libxlDomainShutdownWrapper(libxl_ctx *ctx, uint32_t domid) 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; +} diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index d5e53154de..cad008c1f5 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1356,7 +1356,7 @@ libxlDomainReboot(virDomainPtr dom, unsigned int flags) goto cleanup; if (flags & VIR_DOMAIN_REBOOT_PARAVIRT) { - ret = libxl_domain_reboot(cfg->ctx, vm->def->id); + ret = libxlDomainRebootWrapper(cfg->ctx, vm->def->id); if (ret == 0) goto cleanup;

Upcoming changes will use different LIBXL_API_VERSION variants. Prepare libxl_domain_pause, which got a new parameter "ao_how" in Xen 4.12. libvirt does not use this parameter. No functional change intended. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 14 ++++++++++++++ src/libxl/libxl_driver.c | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h index 6744ba7db3..c912aabadb 100644 --- a/src/libxl/libxl_api_wrapper.h +++ b/src/libxl/libxl_api_wrapper.h @@ -86,3 +86,17 @@ libxlDomainRebootWrapper(libxl_ctx *ctx, uint32_t domid) 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; +} diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index cad008c1f5..afde679269 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1185,7 +1185,7 @@ libxlDomainSuspend(virDomainPtr dom) goto endjob; if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) { - if (libxl_domain_pause(cfg->ctx, vm->def->id) != 0) { + if (libxlDomainPauseWrapper(cfg->ctx, vm->def->id) != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to suspend domain '%d' with libxenlight"), vm->def->id); @@ -2048,7 +2048,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags) if (!(flags & VIR_DUMP_LIVE) && virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) { - if (libxl_domain_pause(cfg->ctx, vm->def->id) != 0) { + if (libxlDomainPauseWrapper(cfg->ctx, vm->def->id) != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Before dumping core, failed to suspend domain '%d'" " with libxenlight"),

Upcoming changes will use different LIBXL_API_VERSION variants. Prepare libxl_domain_unpause, which got a new parameter "ao_how" in Xen 4.12. libvirt does not use this parameter. No functional change intended. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 14 ++++++++++++++ src/libxl/libxl_domain.c | 4 ++-- src/libxl/libxl_driver.c | 4 ++-- src/libxl/libxl_migration.c | 3 ++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h index c912aabadb..13200cfec6 100644 --- a/src/libxl/libxl_api_wrapper.h +++ b/src/libxl/libxl_api_wrapper.h @@ -100,3 +100,17 @@ libxlDomainPauseWrapper(libxl_ctx *ctx, uint32_t domid) 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; +} diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 809108fd7d..a034fe2219 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -594,7 +594,7 @@ libxlDomainShutdownThread(void *opaque) goto endjob; } libxl_evenable_domain_death(cfg->ctx, vm->def->id, 0, &priv->deathW); - libxl_domain_unpause(cfg->ctx, vm->def->id); + libxlDomainUnpauseWrapper(cfg->ctx, vm->def->id); #endif } else { VIR_INFO("Unhandled shutdown_reason %d", xl_reason); @@ -1459,7 +1459,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver, goto destroy_dom; if (!start_paused) { - libxl_domain_unpause(cfg->ctx, domid); + libxlDomainUnpauseWrapper(cfg->ctx, domid); virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_BOOTED); } else { virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_USER); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index afde679269..a2642e9d94 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1238,7 +1238,7 @@ libxlDomainResume(virDomainPtr dom) goto endjob; if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) { - if (libxl_domain_unpause(cfg->ctx, vm->def->id) != 0) { + if (libxlDomainUnpauseWrapper(cfg->ctx, vm->def->id) != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to resume domain '%d' with libxenlight"), vm->def->id); @@ -2091,7 +2091,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags) unpause: if (virDomainObjIsActive(vm) && paused) { - if (libxl_domain_unpause(cfg->ctx, vm->def->id) != 0) { + if (libxlDomainUnpauseWrapper(cfg->ctx, vm->def->id) != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("After dumping core, failed to resume domain '%d' with" " libxenlight"), vm->def->id); diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index a5a9df98ad..a99021031d 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -34,6 +34,7 @@ #include "virthread.h" #include "virhook.h" #include "rpc/virnetsocket.h" +#include "libxl_api_wrapper.h" #include "libxl_domain.h" #include "libxl_driver.h" #include "libxl_conf.h" @@ -1298,7 +1299,7 @@ libxlDomainMigrationDstFinish(virConnectPtr dconn, /* Unpause if requested */ if (!(flags & VIR_MIGRATE_PAUSED)) { - if (libxl_domain_unpause(cfg->ctx, vm->def->id) != 0) { + if (libxlDomainUnpauseWrapper(cfg->ctx, vm->def->id) != 0) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Failed to unpause domain")); goto cleanup;

Upcoming changes will use different LIBXL_API_VERSION variants. Prepare libxl_domain_need_memory, which changed the storage size of "need_memkb" in Xen 4.8. With Xen 4.12 the libxl_domain_config parameter was changed No functional change intended. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 24 ++++++++++++++++++++++++ src/libxl/libxl_domain.c | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h index 13200cfec6..193f971919 100644 --- a/src/libxl/libxl_api_wrapper.h +++ b/src/libxl/libxl_api_wrapper.h @@ -114,3 +114,27 @@ libxlDomainUnpauseWrapper(libxl_ctx *ctx, uint32_t domid) 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; +} diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index a034fe2219..d6554bc230 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1008,13 +1008,13 @@ libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver, virDomainObjPtr vm) static int libxlDomainFreeMem(libxl_ctx *ctx, libxl_domain_config *d_config) { - uint32_t needed_mem; + uint64_t needed_mem; uint32_t free_mem; int32_t target_mem; int tries = 3; int wait_secs = 10; - if (libxl_domain_need_memory(ctx, &d_config->b_info, &needed_mem) < 0) + if (libxlDomainNeedMemoryWrapper(ctx, d_config, &needed_mem) < 0) goto error; do {

On 3/25/21 10:26 AM, Olaf Hering wrote:
Upcoming changes will use different LIBXL_API_VERSION variants.
Prepare libxl_domain_need_memory, which changed the storage size of "need_memkb" in Xen 4.8. With Xen 4.12 the libxl_domain_config parameter was changed
Let's hope third time is a charm :-). Jim
No functional change intended.
Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 24 ++++++++++++++++++++++++ src/libxl/libxl_domain.c | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h index 13200cfec6..193f971919 100644 --- a/src/libxl/libxl_api_wrapper.h +++ b/src/libxl/libxl_api_wrapper.h @@ -114,3 +114,27 @@ libxlDomainUnpauseWrapper(libxl_ctx *ctx, uint32_t domid)
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; +} diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index a034fe2219..d6554bc230 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1008,13 +1008,13 @@ libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver, virDomainObjPtr vm) static int libxlDomainFreeMem(libxl_ctx *ctx, libxl_domain_config *d_config) { - uint32_t needed_mem; + uint64_t needed_mem; uint32_t free_mem; int32_t target_mem; int tries = 3; int wait_secs = 10;
- if (libxl_domain_need_memory(ctx, &d_config->b_info, &needed_mem) < 0) + if (libxlDomainNeedMemoryWrapper(ctx, d_config, &needed_mem) < 0) goto error;
do {

Upcoming changes will use different LIBXL_API_VERSION variants. Prepare libxl_get_free_memory, which changed storage size of parameter "memkb" in Xen 4.8. No functional change intended. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 19 +++++++++++++++++++ src/libxl/libxl_conf.c | 5 +++-- src/libxl/libxl_domain.c | 4 ++-- tests/libxlmock.c | 7 ++++++- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h index 193f971919..a400bbd5a3 100644 --- a/src/libxl/libxl_api_wrapper.h +++ b/src/libxl/libxl_api_wrapper.h @@ -138,3 +138,22 @@ libxlDomainNeedMemoryWrapper(libxl_ctx *ctx, 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; +} diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 4b6a7e6096..8fe04fd8e0 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -36,6 +36,7 @@ #include "viruuid.h" #include "vircommand.h" #include "virsocketaddr.h" +#include "libxl_api_wrapper.h" #include "libxl_domain.h" #include "libxl_conf.h" #include "libxl_utils.h" @@ -1785,7 +1786,7 @@ libxlDriverConfigNew(void) int libxlDriverConfigInit(libxlDriverConfigPtr cfg) { - unsigned int free_mem; + uint64_t free_mem; if (g_mkdir_with_parents(cfg->logDir, 0777) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1817,7 +1818,7 @@ libxlDriverConfigInit(libxlDriverConfigPtr cfg) /* This will fill xenstore info about free and dom0 memory if missing, * should be called before starting first domain */ - if (libxl_get_free_memory(cfg->ctx, &free_mem)) { + if (libxlGetFreeMemoryWrapper(cfg->ctx, &free_mem)) { VIR_ERROR(_("Unable to configure libxl's memory management parameters")); return -1; } diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index d6554bc230..ac613b96b9 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1009,7 +1009,7 @@ static int libxlDomainFreeMem(libxl_ctx *ctx, libxl_domain_config *d_config) { uint64_t needed_mem; - uint32_t free_mem; + uint64_t free_mem; int32_t target_mem; int tries = 3; int wait_secs = 10; @@ -1018,7 +1018,7 @@ libxlDomainFreeMem(libxl_ctx *ctx, libxl_domain_config *d_config) goto error; do { - if (libxl_get_free_memory(ctx, &free_mem) < 0) + if (libxlGetFreeMemoryWrapper(ctx, &free_mem) < 0) goto error; if (free_mem >= needed_mem) diff --git a/tests/libxlmock.c b/tests/libxlmock.c index a36ca135f6..604dc4bfbe 100644 --- a/tests/libxlmock.c +++ b/tests/libxlmock.c @@ -67,7 +67,12 @@ VIR_MOCK_IMPL_RET_ARGS(libxl_get_version_info, VIR_MOCK_STUB_RET_ARGS(libxl_get_free_memory, int, 0, libxl_ctx *, ctx, - uint32_t *, memkb); +# if LIBXL_API_VERSION < 0x040800 + uint32_t *, +# else + uint64_t *, +# endif + memkb); VIR_MOCK_STUB_RET_ARGS(xc_interface_close, int, 0,

Upcoming changes will use different LIBXL_API_VERSION variants. Prepare libxl_set_vcpuonline, which got a new parameter "ao_how" in Xen 4.12. libvirt does not use this parameter. No functional change intended. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 14 ++++++++++++++ src/libxl/libxl_driver.c | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h index a400bbd5a3..047089ed25 100644 --- a/src/libxl/libxl_api_wrapper.h +++ b/src/libxl/libxl_api_wrapper.h @@ -157,3 +157,17 @@ libxlGetFreeMemoryWrapper(libxl_ctx *ctx, uint64_t *memkb) 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; +} diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index a2642e9d94..7c93a9a4db 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -2331,7 +2331,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, break; case VIR_DOMAIN_VCPU_LIVE: - if (libxl_set_vcpuonline(cfg->ctx, vm->def->id, &map) != 0) { + if (libxlSetVcpuonlineWrapper(cfg->ctx, vm->def->id, &map) != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to set vcpus for domain '%d'" " with libxenlight"), vm->def->id); @@ -2342,7 +2342,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, break; case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG: - if (libxl_set_vcpuonline(cfg->ctx, vm->def->id, &map) != 0) { + if (libxlSetVcpuonlineWrapper(cfg->ctx, vm->def->id, &map) != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to set vcpus for domain '%d'" " with libxenlight"), vm->def->id);

Upcoming changes will use different LIBXL_API_VERSION variants. Prepare libxl_send_trigger, which got a new parameter "ao_how" in Xen 4.12. libvirt does not use this parameter. No functional change intended. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 17 +++++++++++++++++ src/libxl/libxl_driver.c | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h index 047089ed25..26c2215cb7 100644 --- a/src/libxl/libxl_api_wrapper.h +++ b/src/libxl/libxl_api_wrapper.h @@ -171,3 +171,20 @@ libxlSetVcpuonlineWrapper(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap) 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; +} diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 7c93a9a4db..18098734fc 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1308,8 +1308,8 @@ libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags) } if (flags & VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN) { - ret = libxl_send_trigger(cfg->ctx, vm->def->id, - LIBXL_TRIGGER_POWER, 0); + ret = libxlSendTriggerWrapper(cfg->ctx, vm->def->id, + LIBXL_TRIGGER_POWER, 0); if (ret == 0) goto cleanup;

Upcoming changes will use different LIBXL_API_VERSION variants. Prepare libxl_set_memory_target, which changed the storage size of parameter "target_memkb" in Xen 4.8. No functional change intended. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- src/libxl/libxl_api_wrapper.h | 27 +++++++++++++++++++++++++++ src/libxl/libxl_domain.c | 6 +++--- src/libxl/libxl_driver.c | 4 ++-- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/libxl/libxl_api_wrapper.h b/src/libxl/libxl_api_wrapper.h index 26c2215cb7..a9627f7983 100644 --- a/src/libxl/libxl_api_wrapper.h +++ b/src/libxl/libxl_api_wrapper.h @@ -20,6 +20,7 @@ #pragma once +#include <limits.h> #include <libxl.h> static inline int @@ -188,3 +189,29 @@ libxlSendTriggerWrapper(libxl_ctx *ctx, return ret; } + +static inline int +libxlSetMemoryTargetWrapper(libxl_ctx *ctx, + uint32_t domid, + uint64_t target_memkb, + int relative, + int enforce) +{ + int ret = -1; + + /* Technically this guard could be LIBXL_HAVE_MEMKB_64BITS */ +#if LIBXL_API_VERSION < 0x040800 + if (target_memkb < UINT_MAX) { + uint32_t val32 = target_memkb; + + ret = libxl_set_memory_target(ctx, domid, val32, relative, enforce); + } +#else + if (target_memkb < LLONG_MAX) { + int64_t val64 = target_memkb; + ret = libxl_set_memory_target(ctx, domid, val64, relative, enforce); + } +#endif + + return ret; +} diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index ac613b96b9..7ffafb9023 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1010,7 +1010,7 @@ libxlDomainFreeMem(libxl_ctx *ctx, libxl_domain_config *d_config) { uint64_t needed_mem; uint64_t free_mem; - int32_t target_mem; + uint64_t target_mem; int tries = 3; int wait_secs = 10; @@ -1025,8 +1025,8 @@ libxlDomainFreeMem(libxl_ctx *ctx, libxl_domain_config *d_config) return 0; target_mem = free_mem - needed_mem; - if (libxl_set_memory_target(ctx, 0, target_mem, - /* relative */ 1, 0) < 0) + if (libxlSetMemoryTargetWrapper(ctx, 0, target_mem, + /* relative */ 1, 0) < 0) goto error; if (libxl_wait_for_memory_target(ctx, 0, wait_secs) < 0) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 18098734fc..f130790484 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1695,8 +1695,8 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, /* Unlock virDomainObj while ballooning memory */ virObjectUnlock(vm); - res = libxl_set_memory_target(cfg->ctx, vm->def->id, newmem, 0, - /* force */ 1); + res = libxlSetMemoryTargetWrapper(cfg->ctx, vm->def->id, newmem, 0, + /* force */ 1); virObjectLock(vm); if (res < 0) { virReportError(VIR_ERR_INTERNAL_ERROR,

To support domUs with more than 4TB memory it is required to use LIBXL_API_VERSION >= 0x040800, which uses uint64_t for certained guest memory related quantities. Unfortunately this change is not straight forward. While most of the code in libxl.h handles the various LIBXL_API_VERSION variants correctly, the check for valid a LIBXL_API_VERSION at the beginning of the file was broken between Xen 4.7 and 4.13 - it did not cover for API changes introduced in Xen 4.7 and 4.8. This was fixed with xen-project/xen@c3999835df, which for libvirt means in practice either the libxl API from Xen 4.5 or 4.13+ can be used. This change uses pkgconfig to decide which API can be safely selected. Xen provides a pkgconfig file since Xen 4.6, which is also the lowest version expected by libvirt. Signed-off-by: Olaf Hering <olaf@aepfle.de> --- meson.build | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index ea93a2a8ec..d246886cbf 100644 --- a/meson.build +++ b/meson.build @@ -1592,8 +1592,13 @@ if not get_option('driver_libxl').disabled() and conf.has('WITH_LIBVIRTD') xtl_link_dep = cc.find_library('xenctrl') endif + if libxl_dep.version().version_compare('>=4.13.0') + LIBXL_API_VERSION='0x041300' + else + LIBXL_API_VERSION='0x040500' + endif libxl_dep = declare_dependency( - compile_args: '-DLIBXL_API_VERSION=0x040500', + compile_args: '-DLIBXL_API_VERSION=' + LIBXL_API_VERSION, dependencies: [ libxl_dep, xtl_link_dep,

On 3/25/21 10:26 AM, Olaf Hering wrote:
Various changes to handle libxl API variants.
Olaf
v2: - adjust names of wrapper functions adjust indent adjust style of braces rename new header
Olaf Hering (12): libxl: add API wrapper for libxl_domain_create_restore libxl: add API wrapper for libxl_retrieve_domain_configuration libxl: add API wrapper for libxl_domain_shutdown libxl: add API wrapper for libxl_domain_reboot libxl: add API wrapper for libxl_domain_pause libxl: add API wrapper for libxl_domain_unpause libxl: add API wrapper for libxl_domain_need_memory libxl: add API wrapper for libxl_get_free_memory libxl: add API wrapper for libxl_set_vcpuonline libxl: add API wrapper for libxl_send_trigger libxl: add API wrapper for libxl_set_memory_target libxl: use API 4.13 to support domUs with more than 4TB
meson.build | 7 +- src/libxl/libxl_api_wrapper.h | 217 ++++++++++++++++++++++++++++++++++ src/libxl/libxl_conf.c | 5 +- src/libxl/libxl_domain.c | 27 +++-- src/libxl/libxl_driver.c | 25 ++-- src/libxl/libxl_migration.c | 3 +- tests/libxlmock.c | 7 +- 7 files changed, 261 insertions(+), 30 deletions(-) create mode 100644 src/libxl/libxl_api_wrapper.h
Reviewed-by: Jim Fehlig <jfehlig@suse.com> Thanks again for taking this on. I'll push the series after the release. Regards, Jim
participants (2)
-
Jim Fehlig
-
Olaf Hering