# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1188313592 -3600
# Node ID 505021d029eb486449ba5c61403237b49cdfd90a
# Parent 2aee2e4eacc83fc6baa192cdf41ea301d970d90d
xend: Fix memory ballooning logic during save/restore. Should be same
as during domain creation.
Signed-off-by: Chris Lalancette <clalance@xxxxxxxxxx>
---
tools/python/xen/xend/XendCheckpoint.py | 33 +++++++++++++++++++++-----------
1 files changed, 22 insertions(+), 11 deletions(-)
diff -r 2aee2e4eacc8 -r 505021d029eb tools/python/xen/xend/XendCheckpoint.py
--- a/tools/python/xen/xend/XendCheckpoint.py Tue Aug 28 15:58:46 2007 +0100
+++ b/tools/python/xen/xend/XendCheckpoint.py Tue Aug 28 16:06:32 2007 +0100
@@ -16,7 +16,7 @@ import xen.util.auxbin
import xen.util.auxbin
import xen.lowlevel.xc
-from xen.xend import balloon, sxp
+from xen.xend import balloon, sxp, image
from xen.xend.XendError import XendError, VmError
from xen.xend.XendLogging import log
from xen.xend.XendConfig import XendConfig
@@ -181,9 +181,6 @@ def restore(xd, fd, dominfo = None, paus
assert store_port
assert console_port
- page_size_kib = xc.pages_to_kib(1)
- nr_pfns = (dominfo.getMemoryTarget() + page_size_kib - 1) / page_size_kib
-
# if hvm, pass mem size to calculate the store_mfn
image_cfg = dominfo.info.get('image', {})
is_hvm = dominfo.info.is_hvm()
@@ -197,18 +194,32 @@ def restore(xd, fd, dominfo = None, paus
pae = 0
try:
- shadow = dominfo.info['shadow_memory']
+ restore_image = image.create(dominfo, dominfo.info['image'],
+ dominfo.info['device'])
+ memory = restore_image.getRequiredAvailableMemory(
+ dominfo.info['memory'] * 1024)
+ maxmem = restore_image.getRequiredAvailableMemory(
+ dominfo.info['maxmem'] * 1024)
+ shadow = restore_image.getRequiredShadowMemory(
+ dominfo.info['shadow_memory'] * 1024,
+ dominfo.info['maxmem'] * 1024)
+
log.debug("restore:shadow=0x%x, _static_max=0x%x, _static_min=0x%x, ",
dominfo.info['shadow_memory'],
dominfo.info['memory_static_max'],
dominfo.info['memory_static_min'])
- balloon.free(xc.pages_to_kib(nr_pfns) + shadow * 1024)
-
- shadow_cur = xc.shadow_mem_control(dominfo.getDomid(), shadow)
+ # Round shadow up to a multiple of a MiB, as shadow_mem_control
+ # takes MiB and we must not round down and end up under-providing.
+ shadow = ((shadow + 1023) / 1024) * 1024
+
+ # set memory limit
+ xc.domain_setmaxmem(dominfo.getDomid(), maxmem)
+
+ balloon.free(memory + shadow)
+
+ shadow_cur = xc.shadow_mem_control(dominfo.getDomid(), shadow / 1024)
dominfo.info['shadow_memory'] = shadow_cur
-
- xc.domain_setmaxmem(dominfo.getDomid(), dominfo.getMemoryMaximum())
cmd = map(str, [xen.util.auxbin.pathTo(XC_RESTORE),
fd, dominfo.getDomid(),
@@ -220,7 +231,7 @@ def restore(xd, fd, dominfo = None, paus
forkHelper(cmd, fd, handler.handler, True)
# We don't want to pass this fd to any other children -- we
- # might need to recover ths disk space that backs it.
+ # might need to recover the disk space that backs it.
try:
flags = fcntl.fcntl(fd, fcntl.F_GETFD)
flags |= fcntl.FD_CLOEXEC
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|