[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 2/4] libxl_wait_for_memory_target: wait as long as dom0 is making progress
Decrement wait_secs only if dom0 is making no progress toward reaching the balloon target, otherwise loop again for free. Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> Reviewed-by: Mike Latimer <mlatimer@xxxxxxxx> Tested-by: Mike Latimer <mlatimer@xxxxxxxx> --- tools/libxl/libxl.c | 29 ++++++++++++++++++++++------- tools/libxl/libxl.h | 14 +++++++++++++- tools/libxl/xl_cmdimpl.c | 4 ++-- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 088786e..648a227 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4959,26 +4959,41 @@ int libxl_wait_for_memory_target(libxl_ctx *ctx, uint32_t domid, int wait_secs) { int rc = 0; uint32_t target_memkb = 0; + uint64_t current_memkb, prev_memkb; libxl_dominfo info; + rc = libxl_get_memory_target(ctx, domid, &target_memkb); + if (rc < 0) + return rc; + libxl_dominfo_init(&info); + prev_memkb = UINT64_MAX; do { - wait_secs--; sleep(1); - rc = libxl_get_memory_target(ctx, domid, &target_memkb); - if (rc < 0) - goto out; - libxl_dominfo_dispose(&info); libxl_dominfo_init(&info); rc = libxl_domain_info(ctx, &info, domid); if (rc < 0) goto out; - } while (wait_secs > 0 && (info.current_memkb + info.outstanding_memkb) > target_memkb); - if ((info.current_memkb + info.outstanding_memkb) <= target_memkb) + current_memkb = info.current_memkb + info.outstanding_memkb; + + if (current_memkb > prev_memkb) + { + rc = ERROR_FAIL; + goto out; + } + else if (current_memkb == prev_memkb) + wait_secs--; + /* if current_memkb < prev_memkb loop for free as progress has + * been made */ + + prev_memkb = current_memkb; + } while (wait_secs > 0 && current_memkb > target_memkb); + + if (current_memkb <= target_memkb) rc = 0; else rc = ERROR_FAIL; diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index e3d2ae8..3e63e42 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -1043,7 +1043,19 @@ int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info, int libxl_get_free_memory(libxl_ctx *ctx, uint32_t *memkb); /* wait for a given amount of memory to be free in the system */ int libxl_wait_for_free_memory(libxl_ctx *ctx, uint32_t domid, uint32_t memory_kb, int wait_secs); -/* wait for the memory target of a domain to be reached */ +/* + * Wait for the memory target of a domain to be reached. Does not + * decrement wait_secs if the domain is making progress toward reaching + * the target. If the domain is not making progress, wait_secs is + * decremented. If the timeout expires before the target is reached, the + * function returns ERROR_FAIL. + * + * Older versions of this function (Xen 4.5 and older), decremented + * wait_secs even if the domain was making progress, resulting in far + * lower overall wait times. To make sure that your calling routine + * works with new and old implementations of the function, pass enough + * time for the guest to reach its target as an argument. + */ int libxl_wait_for_memory_target(libxl_ctx *ctx, uint32_t domid, int wait_secs); int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index f4c4122..2dc7574 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -2226,8 +2226,8 @@ static int freemem(uint32_t domid, libxl_domain_build_info *b_info) else if (rc != ERROR_NOMEM) return rc; - /* the memory target has been reached but the free memory is still - * not enough: loop over again */ + /* wait until dom0 reaches its target, as long as we are making + * progress */ rc = libxl_wait_for_memory_target(ctx, 0, 1); if (rc < 0) return rc; -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |