53 lines
2.2 KiB
Diff
53 lines
2.2 KiB
Diff
|
commit f7143d2f0d918cf96010f1d7610b3c3bf7005c1d
|
||
|
Author: Jim Fehlig <jfehlig@suse.com>
|
||
|
Date: Tue Jan 17 15:11:32 2017 -0700
|
||
|
|
||
|
libxl: fix dom0 autoballooning with Xen 4.8
|
||
|
|
||
|
xen.git commit 57f8b13c changed several of the libxl memory
|
||
|
get/set functions to take 64 bit parameters. The libvirt
|
||
|
libxl driver still uses uint32_t variables for these various
|
||
|
parameters, which is particularly problematic for the
|
||
|
libxl_set_memory_target() function.
|
||
|
|
||
|
When dom0 autoballooning is enabled, libvirt (like xl) determines
|
||
|
the memory needed to start a domain and the memory available. If
|
||
|
memory available is less than memory needed, dom0 is ballooned
|
||
|
down by passing a negative value to libxl_set_memory_target()
|
||
|
'target_memkb' parameter. Prior to xen.git commit 57f8b13c,
|
||
|
'target_memkb' was an int32_t. Subtracting a larger uint32 from
|
||
|
a smaller uint32 and assigning it to int32 resulted in a negative
|
||
|
number. After commit 57f8b13c, the same subtraction is widened
|
||
|
to a int64, resulting in a large positive number. The simple
|
||
|
fix taken by this patch is to assign the difference of the
|
||
|
uint32 values to a temporary int32 variable, which is then
|
||
|
passed to 'target_memkb' parameter of libxl_set_memory_target().
|
||
|
|
||
|
Note that it is undesirable to change libvirt to use 64 bit
|
||
|
variables since it requires setting LIBXL_API_VERSION to 0x040800.
|
||
|
Currently libvirt supports LIBXL_API_VERSION >= 0x040400,
|
||
|
essentially Xen >= 4.4.
|
||
|
|
||
|
Index: libvirt-3.0.0/src/libxl/libxl_domain.c
|
||
|
===================================================================
|
||
|
--- libvirt-3.0.0.orig/src/libxl/libxl_domain.c
|
||
|
+++ libvirt-3.0.0/src/libxl/libxl_domain.c
|
||
|
@@ -909,6 +909,7 @@ libxlDomainFreeMem(libxl_ctx *ctx, libxl
|
||
|
{
|
||
|
uint32_t needed_mem;
|
||
|
uint32_t free_mem;
|
||
|
+ int32_t target_mem;
|
||
|
int tries = 3;
|
||
|
int wait_secs = 10;
|
||
|
|
||
|
@@ -922,7 +923,8 @@ libxlDomainFreeMem(libxl_ctx *ctx, libxl
|
||
|
if (free_mem >= needed_mem)
|
||
|
return 0;
|
||
|
|
||
|
- if (libxl_set_memory_target(ctx, 0, free_mem - needed_mem,
|
||
|
+ target_mem = free_mem - needed_mem;
|
||
|
+ if (libxl_set_memory_target(ctx, 0, target_mem,
|
||
|
/* relative */ 1, 0) < 0)
|
||
|
goto error;
|
||
|
|