From 194e17400a6fceb6779756887e0c1b13522415e9 Mon Sep 17 00:00:00 2001 From: "K. Y. Srinivasan" Date: Mon, 18 Mar 2013 13:51:38 -0700 Subject: [PATCH] --- yaml --- r: 363172 b: refs/heads/master c: 7f4f2302a11173d0ef84bbab4b887b9b50c31dc6 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/hv/hv_balloon.c | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 1edd796bfa19..395cb29decad 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f766dc1ea576fcdfbf2bc5638757ddbdacfb5a69 +refs/heads/master: 7f4f2302a11173d0ef84bbab4b887b9b50c31dc6 diff --git a/trunk/drivers/hv/hv_balloon.c b/trunk/drivers/hv/hv_balloon.c index d1b4a4624d81..4c605c70ebf9 100644 --- a/trunk/drivers/hv/hv_balloon.c +++ b/trunk/drivers/hv/hv_balloon.c @@ -590,6 +590,16 @@ static void hv_mem_hot_add(unsigned long start, unsigned long size, if (ret) { pr_info("hot_add memory failed error is %d\n", ret); + if (ret == -EEXIST) { + /* + * This error indicates that the error + * is not a transient failure. This is the + * case where the guest's physical address map + * precludes hot adding memory. Stop all further + * memory hot-add. + */ + do_hot_add = false; + } has->ha_end_pfn -= HA_CHUNK; has->covered_end_pfn -= processed_pfn; break; @@ -849,11 +859,30 @@ static void hot_add_req(struct work_struct *dummy) rg_sz = region_size; } - resp.page_count = process_hot_add(pg_start, pfn_cnt, - rg_start, rg_sz); + if (do_hot_add) + resp.page_count = process_hot_add(pg_start, pfn_cnt, + rg_start, rg_sz); #endif + /* + * The result field of the response structure has the + * following semantics: + * + * 1. If all or some pages hot-added: Guest should return success. + * + * 2. If no pages could be hot-added: + * + * If the guest returns success, then the host + * will not attempt any further hot-add operations. This + * signifies a permanent failure. + * + * If the guest returns failure, then this failure will be + * treated as a transient failure and the host may retry the + * hot-add operation after some delay. + */ if (resp.page_count > 0) resp.result = 1; + else if (!do_hot_add) + resp.result = 1; else resp.result = 0;