Drivers: hv: Notify the host of permanent hot-add failures
authorK. Y. Srinivasan <kys@microsoft.com>
Mon, 18 Mar 2013 20:51:38 +0000 (13:51 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 29 Mar 2013 16:03:21 +0000 (09:03 -0700)
If memory hot-add fails with the error -EEXIST, then this is a permanent
failure. Notify the host of this information, so the host will not attempt
hot-add again. If the failure were a transient failure, host will attempt
a hot-add after some delay.

In this version of the patch, I have added some additional comments
to clarify how the host treats different failure conditions.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/hv_balloon.c

index d1b4a4624d81fafbae6c68e5e64423ad5b33fc13..4c605c70ebf9ed858d014d94383ebfab86851b1f 100644 (file)
@@ -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;