# HG changeset patch # User Jonathan Knowles # Date 1270028768 -3600 # Node ID 50f10d45f8a0c607061d172631d4059bf48e4c70 # Parent 73d8b966e6eb5a1f654f75e25387fd1afb184073 [CA-39743] Wait for Xen to scrub host memory (only if necessary) before building a domain. Signed-off-by: Jonathan Knowles Acked-by: Vincent Hanquez diff -r 73d8b966e6eb -r 50f10d45f8a0 ocaml/xenops/domain.ml --- a/ocaml/xenops/domain.ml Wed Mar 31 10:34:48 2010 +0100 +++ b/ocaml/xenops/domain.ml Wed Mar 31 10:46:08 2010 +0100 @@ -387,9 +387,13 @@ let console = Xc.evtchn_alloc_unbound xc domid 0 in store, console -let build_pre ~xc ~xs ~vcpus ~xen_max_mib ~shadow_mib domid = - debug "build_pre domid=%d; max=%Ld MiB; shadow=%Ld MiB" - domid xen_max_mib shadow_mib; +let build_pre ~xc ~xs ~vcpus ~xen_max_mib ~shadow_mib ~required_host_free_mib domid = + debug "build_pre domid=%d; max=%Ld MiB; shadow=%Ld MiB; required=%Ld MiB" + domid xen_max_mib shadow_mib required_host_free_mib; + + (* CA-39743: Wait, if necessary, for the Xen scrubber to catch up. *) + Memory.wait_xen_free_mem ~xc (Memory.kib_of_mib required_host_free_mib); + let shadow_mib = Int64.to_int shadow_mib in let dom_path = xs.Xs.getdomainpath domid in @@ -467,9 +471,11 @@ Memory.Linux.xen_max_mib static_max_mib in let shadow_mib = Memory.Linux.shadow_mib in + let required_host_free_mib = + Memory.Linux.footprint_mib target_mib in - let store_port, console_port = - build_pre ~xc ~xs ~xen_max_mib ~shadow_mib ~vcpus domid in + let store_port, console_port = build_pre ~xc ~xs + ~xen_max_mib ~shadow_mib ~required_host_free_mib ~vcpus domid in let cnx = XenguestHelper.connect [ @@ -531,9 +537,11 @@ Memory.HVM.xen_max_mib static_max_mib in let shadow_mib = Memory.HVM.shadow_mib static_max_mib vcpus shadow_multiplier in + let required_host_free_mib = + Memory.HVM.footprint_mib target_mib static_max_mib vcpus shadow_multiplier in - let store_port, console_port = - build_pre ~xc ~xs ~xen_max_mib ~shadow_mib ~vcpus domid in + let store_port, console_port = build_pre ~xc ~xs + ~xen_max_mib ~shadow_mib ~required_host_free_mib ~vcpus domid in let cnx = XenguestHelper.connect [ @@ -656,9 +664,11 @@ Memory.Linux.xen_max_mib static_max_mib in let shadow_mib = Memory.Linux.shadow_mib in + let required_host_free_mib = + Memory.Linux.footprint_mib target_mib in - let store_port, console_port = - build_pre ~xc ~xs ~xen_max_mib ~shadow_mib ~vcpus domid in + let store_port, console_port = build_pre ~xc ~xs + ~xen_max_mib ~shadow_mib ~required_host_free_mib ~vcpus domid in let store_mfn, console_mfn = restore_common ~xc ~xs ~hvm:false ~store_port ~console_port @@ -685,9 +695,11 @@ Memory.HVM.xen_max_mib static_max_mib in let shadow_mib = Memory.HVM.shadow_mib static_max_mib vcpus shadow_multiplier in + let required_host_free_mib = + Memory.HVM.footprint_mib target_mib static_max_mib vcpus shadow_multiplier in - let store_port, console_port = - build_pre ~xc ~xs ~xen_max_mib ~shadow_mib ~vcpus domid in + let store_port, console_port = build_pre ~xc ~xs + ~xen_max_mib ~shadow_mib ~required_host_free_mib ~vcpus domid in let store_mfn, console_mfn = restore_common ~xc ~xs ~hvm:true ~store_port ~console_port