# HG changeset patch # User David Scott # Date 1259362816 0 # Node ID a42ee172122fcfb19efe8fd406ba3c84a120708c # Parent 4985d668283114620078ad440b71081a22fa0e6d CA-32810: prevent the memory ballooning daemon capping a domain's memory usage before it has written feature-balloon. Initially the ballooning daemon treated all domains which had not yet started running as using their "initial-reservation". This relied on the assumption that the initial memory target would be reached by running the domain builder. This assumption is false because some memory accounted to the domain in totpages (eg VGA frame buffer) is allocated dynamically after unpause. Instead we now consider all domains which have not yet written "feature-balloon" to be using the max of "initial-reservation" and totpages. This relies on the new, much weaker, assumption that, by the time "feature-balloon" is written, all memory allocations have ceased. Note that we never change a balloon target until "feature-balloon" is written so the domain will still have target=startmem at this point. Signed-off-by: David Scott diff -r 4985d6682831 -r a42ee172122f ocaml/xenops/squeeze_xen.ml --- a/ocaml/xenops/squeeze_xen.ml Fri Nov 27 22:44:53 2009 +0000 +++ b/ocaml/xenops/squeeze_xen.ml Fri Nov 27 23:00:16 2009 +0000 @@ -24,10 +24,6 @@ module M = Debug.Debugger(struct let name = "memory" end) let debug = Squeeze.debug let error = Squeeze.error - -(** We define a domain which is paused, not shutdown and has not clocked up any CPU cycles - as 'never_been_run' *) -let never_been_run di = di.Xc.paused && not di.Xc.shutdown && di.Xc.cpu_time = 0L let initial_reservation_path dom_path = dom_path ^ "/memory/initial-reservation" let target_path dom_path = dom_path ^ "/memory/target" @@ -219,7 +215,9 @@ then we'll need to consider the domain's "initial-reservation". Note that the other fields won't necessarily have been created yet. *) - if never_been_run di then begin + (* If the domain has yet to expose it's feature-balloon flag then we assume it is using at least its + "initial-reservation". *) + if not can_balloon then begin let initial_reservation_kib = Int64.of_string (xs_read xs (initial_reservation_path path)) in (* memory_actual_kib is memory which xen has accounted to this domain. We bump this up to the "initial-reservation" and compute how much memory to subtract from the host's free