xen/balloon: rationalize memory hotplug stats
authorDavid Vrabel <david.vrabel@citrix.com>
Thu, 25 Jun 2015 11:08:20 +0000 (12:08 +0100)
committerDavid Vrabel <david.vrabel@citrix.com>
Fri, 23 Oct 2015 13:20:04 +0000 (14:20 +0100)
The stats used for memory hotplug make no sense and are fiddled with
in odd ways.  Remove them and introduce total_pages to track the total
number of pages (both populated and unpopulated) including those within
hotplugged regions (note that this includes not yet onlined pages).

This will be used in a subsequent commit (xen/balloon: only hotplug
additional memory if required) when deciding whether additional memory
needs to be hotplugged.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
drivers/xen/balloon.c
include/xen/balloon.h

index 095bb67..ac80547 100644 (file)
@@ -194,21 +194,6 @@ static enum bp_state update_schedule(enum bp_state state)
 }
 
 #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
-static long current_credit(void)
-{
-       return balloon_stats.target_pages - balloon_stats.current_pages -
-               balloon_stats.hotplug_pages;
-}
-
-static bool balloon_is_inflated(void)
-{
-       if (balloon_stats.balloon_low || balloon_stats.balloon_high ||
-                       balloon_stats.balloon_hotplug)
-               return true;
-       else
-               return false;
-}
-
 static struct resource *additional_memory_resource(phys_addr_t size)
 {
        struct resource *res;
@@ -289,10 +274,7 @@ static enum bp_state reserve_additional_memory(long credit)
                goto err;
        }
 
-       balloon_hotplug -= credit;
-
-       balloon_stats.hotplug_pages += credit;
-       balloon_stats.balloon_hotplug = balloon_hotplug;
+       balloon_stats.total_pages += balloon_hotplug;
 
        return BP_DONE;
   err:
@@ -308,11 +290,6 @@ static void xen_online_page(struct page *page)
 
        __balloon_append(page);
 
-       if (balloon_stats.hotplug_pages)
-               --balloon_stats.hotplug_pages;
-       else
-               --balloon_stats.balloon_hotplug;
-
        mutex_unlock(&balloon_mutex);
 }
 
@@ -329,32 +306,22 @@ static struct notifier_block xen_memory_nb = {
        .priority = 0
 };
 #else
-static long current_credit(void)
+static enum bp_state reserve_additional_memory(long credit)
 {
-       unsigned long target = balloon_stats.target_pages;
-
-       target = min(target,
-                    balloon_stats.current_pages +
-                    balloon_stats.balloon_low +
-                    balloon_stats.balloon_high);
-
-       return target - balloon_stats.current_pages;
+       balloon_stats.target_pages = balloon_stats.current_pages;
+       return BP_DONE;
 }
+#endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */
 
-static bool balloon_is_inflated(void)
+static long current_credit(void)
 {
-       if (balloon_stats.balloon_low || balloon_stats.balloon_high)
-               return true;
-       else
-               return false;
+       return balloon_stats.target_pages - balloon_stats.current_pages;
 }
 
-static enum bp_state reserve_additional_memory(long credit)
+static bool balloon_is_inflated(void)
 {
-       balloon_stats.target_pages = balloon_stats.current_pages;
-       return BP_DONE;
+       return balloon_stats.balloon_low || balloon_stats.balloon_high;
 }
-#endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */
 
 static enum bp_state increase_reservation(unsigned long nr_pages)
 {
@@ -367,15 +334,6 @@ static enum bp_state increase_reservation(unsigned long nr_pages)
                .domid        = DOMID_SELF
        };
 
-#ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
-       if (!balloon_stats.balloon_low && !balloon_stats.balloon_high) {
-               nr_pages = min(nr_pages, balloon_stats.balloon_hotplug);
-               balloon_stats.hotplug_pages += nr_pages;
-               balloon_stats.balloon_hotplug -= nr_pages;
-               return BP_DONE;
-       }
-#endif
-
        if (nr_pages > ARRAY_SIZE(frame_list))
                nr_pages = ARRAY_SIZE(frame_list);
 
@@ -438,15 +396,6 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
                .domid        = DOMID_SELF
        };
 
-#ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
-       if (balloon_stats.hotplug_pages) {
-               nr_pages = min(nr_pages, balloon_stats.hotplug_pages);
-               balloon_stats.hotplug_pages -= nr_pages;
-               balloon_stats.balloon_hotplug += nr_pages;
-               return BP_DONE;
-       }
-#endif
-
        if (nr_pages > ARRAY_SIZE(frame_list))
                nr_pages = ARRAY_SIZE(frame_list);
 
@@ -635,6 +584,8 @@ static void __init balloon_add_region(unsigned long start_pfn,
                   don't subtract from it. */
                __balloon_append(page);
        }
+
+       balloon_stats.total_pages += extra_pfn_end - start_pfn;
 }
 
 static int __init balloon_init(void)
@@ -652,6 +603,7 @@ static int __init balloon_init(void)
        balloon_stats.target_pages  = balloon_stats.current_pages;
        balloon_stats.balloon_low   = 0;
        balloon_stats.balloon_high  = 0;
+       balloon_stats.total_pages   = balloon_stats.current_pages;
 
        balloon_stats.schedule_delay = 1;
        balloon_stats.max_schedule_delay = 32;
@@ -659,9 +611,6 @@ static int __init balloon_init(void)
        balloon_stats.max_retry_count = RETRY_UNLIMITED;
 
 #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
-       balloon_stats.hotplug_pages = 0;
-       balloon_stats.balloon_hotplug = 0;
-
        set_online_page_callback(&xen_online_page);
        register_memory_notifier(&xen_memory_nb);
 #endif
index cc2e1a7..c8aee7a 100644 (file)
@@ -11,14 +11,11 @@ struct balloon_stats {
        /* Number of pages in high- and low-memory balloons. */
        unsigned long balloon_low;
        unsigned long balloon_high;
+       unsigned long total_pages;
        unsigned long schedule_delay;
        unsigned long max_schedule_delay;
        unsigned long retry_count;
        unsigned long max_retry_count;
-#ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
-       unsigned long hotplug_pages;
-       unsigned long balloon_hotplug;
-#endif
 };
 
 extern struct balloon_stats balloon_stats;