• J
    libxl: fix dom0 balloon logic · d685c0f9
    Jim Fehlig 提交于
    Recent testing on large memory systems revealed a bug in the Xen xl
    tool's freemem() function.  When autoballooning is enabled, freemem()
    is used to ensure enough memory is available to start a domain,
    ballooning dom0 if necessary.  When ballooning large amounts of memory
    from dom0, freemem() would exceed its self-imposed wait time and
    return an error.  Meanwhile, dom0 continued to balloon.  Starting the
    domain later, after sufficient memory was ballooned from dom0, would
    succeed.  The libvirt implementation in libxlDomainFreeMem() suffers
    the same bug since it is modeled after freemem().
    
    In the end, the best place to fix the bug on the Xen side was to
    slightly change the behavior of libxl_wait_for_memory_target().
    Instead of failing after caller-provided wait_sec, the function now
    blocks as long as dom0 memory ballooning is progressing.  It will return
    failure only when more memory is needed to reach the target and wait_sec
    have expired with no progress being made.  See xen.git commit fd3aa246.
    There was a dicussion on how this would affect other libxl apps like
    libvirt
    
    http://lists.xen.org/archives/html/xen-devel/2015-03/msg00739.html
    
    If libvirt containing this patch was build against a Xen containing
    the old libxl_wait_for_memory_target() behavior, libxlDomainFreeMem()
    will fail after 30 sec and domain creation will be terminated.
    Without this patch and with old libxl_wait_for_memory_target() behavior,
    libxlDomainFreeMem() does not succeed after 30 sec, but returns success
    anyway.  Domain creation continues resulting in all sorts of fun stuff
    like cpu soft lockups in the guest OS.  It was decided to properly fix
    libxl_wait_for_memory_target(), and if anything improve the default
    behavior of apps using the freemem reference impl in xl.
    
    xl was patched to accommodate the change in libxl_wait_for_memory_target()
    with xen.git commit 883b30a0.  This patch does the same in the libxl
    driver.  While at it, I changed the logic to essentially match
    freemem() in $xensrc/tools/libxl/xl_cmdimpl.c.  It was a bit cleaner
    IMO and will make it easier to spot future, potentially interesting
    divergences.
    d685c0f9
libxl_domain.c 32.7 KB