x86/mm: Fix balooning+sharing
authorAndres Lagar-Cavilla <andres@lagarcavilla.org>
Thu, 2 Feb 2012 12:27:31 +0000 (12:27 +0000)
committerAndres Lagar-Cavilla <andres@lagarcavilla.org>
Thu, 2 Feb 2012 12:27:31 +0000 (12:27 +0000)
Never mind that ballooning a shared page makes no sense. We still fix it
because it may be exercised.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Signed-off-by: Tim Deegan <tim@xen.org>
Committed-by: Tim Deegan <tim@xen.org>
xen/common/memory.c

index 8793894b3fab71e336350bde52ca28a2845b5693..b47e2447c75a58aa1ecc6c376063c6f17fadf407 100644 (file)
@@ -183,14 +183,14 @@ int guest_remove_page(struct domain *d, unsigned long gmfn)
             
     page = mfn_to_page(mfn);
 #ifdef CONFIG_X86
-    /* If gmfn is shared, just drop the guest reference (which may or may not
-     * free the page) */
-    if(p2m_is_shared(p2mt))
+    if ( p2m_is_shared(p2mt) )
     {
-        put_page_and_type(page);
-        guest_physmap_remove_page(d, gmfn, mfn, 0);
-        put_gfn(d, gmfn);
-        return 1;
+        /* Unshare the page, bail out on error. We unshare because 
+         * we might be the only one using this shared page, and we
+         * need to trigger proper cleanup. Once done, this is 
+         * like any other page. */
+        if ( mem_sharing_unshare_page(d, gmfn, 0) )
+            return 0;
     }
 
 #endif /* CONFIG_X86 */