Commit de5a77d8 authored by David Vrabel's avatar David Vrabel

xen/balloon: rationalize memory hotplug stats

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: default avatarDavid Vrabel <david.vrabel@citrix.com>
Reviewed-by: default avatarDaniel Kiper <daniel.kiper@oracle.com>
parent 55b3da98
...@@ -194,21 +194,6 @@ static enum bp_state update_schedule(enum bp_state state) ...@@ -194,21 +194,6 @@ static enum bp_state update_schedule(enum bp_state state)
} }
#ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG #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) static struct resource *additional_memory_resource(phys_addr_t size)
{ {
struct resource *res; struct resource *res;
...@@ -289,10 +274,7 @@ static enum bp_state reserve_additional_memory(long credit) ...@@ -289,10 +274,7 @@ static enum bp_state reserve_additional_memory(long credit)
goto err; goto err;
} }
balloon_hotplug -= credit; balloon_stats.total_pages += balloon_hotplug;
balloon_stats.hotplug_pages += credit;
balloon_stats.balloon_hotplug = balloon_hotplug;
return BP_DONE; return BP_DONE;
err: err:
...@@ -308,11 +290,6 @@ static void xen_online_page(struct page *page) ...@@ -308,11 +290,6 @@ static void xen_online_page(struct page *page)
__balloon_append(page); __balloon_append(page);
if (balloon_stats.hotplug_pages)
--balloon_stats.hotplug_pages;
else
--balloon_stats.balloon_hotplug;
mutex_unlock(&balloon_mutex); mutex_unlock(&balloon_mutex);
} }
...@@ -329,32 +306,22 @@ static struct notifier_block xen_memory_nb = { ...@@ -329,32 +306,22 @@ static struct notifier_block xen_memory_nb = {
.priority = 0 .priority = 0
}; };
#else #else
static long current_credit(void) static enum bp_state reserve_additional_memory(long credit)
{ {
unsigned long target = balloon_stats.target_pages; balloon_stats.target_pages = balloon_stats.current_pages;
return BP_DONE;
target = min(target,
balloon_stats.current_pages +
balloon_stats.balloon_low +
balloon_stats.balloon_high);
return target - balloon_stats.current_pages;
} }
#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 balloon_stats.target_pages - balloon_stats.current_pages;
return true;
else
return false;
} }
static enum bp_state reserve_additional_memory(long credit) static bool balloon_is_inflated(void)
{ {
balloon_stats.target_pages = balloon_stats.current_pages; return balloon_stats.balloon_low || balloon_stats.balloon_high;
return BP_DONE;
} }
#endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */
static enum bp_state increase_reservation(unsigned long nr_pages) static enum bp_state increase_reservation(unsigned long nr_pages)
{ {
...@@ -367,15 +334,6 @@ 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 .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)) if (nr_pages > ARRAY_SIZE(frame_list))
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) ...@@ -438,15 +396,6 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
.domid = DOMID_SELF .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)) if (nr_pages > ARRAY_SIZE(frame_list))
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, ...@@ -635,6 +584,8 @@ static void __init balloon_add_region(unsigned long start_pfn,
don't subtract from it. */ don't subtract from it. */
__balloon_append(page); __balloon_append(page);
} }
balloon_stats.total_pages += extra_pfn_end - start_pfn;
} }
static int __init balloon_init(void) static int __init balloon_init(void)
...@@ -652,6 +603,7 @@ 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.target_pages = balloon_stats.current_pages;
balloon_stats.balloon_low = 0; balloon_stats.balloon_low = 0;
balloon_stats.balloon_high = 0; balloon_stats.balloon_high = 0;
balloon_stats.total_pages = balloon_stats.current_pages;
balloon_stats.schedule_delay = 1; balloon_stats.schedule_delay = 1;
balloon_stats.max_schedule_delay = 32; balloon_stats.max_schedule_delay = 32;
...@@ -659,9 +611,6 @@ static int __init balloon_init(void) ...@@ -659,9 +611,6 @@ static int __init balloon_init(void)
balloon_stats.max_retry_count = RETRY_UNLIMITED; balloon_stats.max_retry_count = RETRY_UNLIMITED;
#ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
balloon_stats.hotplug_pages = 0;
balloon_stats.balloon_hotplug = 0;
set_online_page_callback(&xen_online_page); set_online_page_callback(&xen_online_page);
register_memory_notifier(&xen_memory_nb); register_memory_notifier(&xen_memory_nb);
#endif #endif
......
...@@ -11,14 +11,11 @@ struct balloon_stats { ...@@ -11,14 +11,11 @@ struct balloon_stats {
/* Number of pages in high- and low-memory balloons. */ /* Number of pages in high- and low-memory balloons. */
unsigned long balloon_low; unsigned long balloon_low;
unsigned long balloon_high; unsigned long balloon_high;
unsigned long total_pages;
unsigned long schedule_delay; unsigned long schedule_delay;
unsigned long max_schedule_delay; unsigned long max_schedule_delay;
unsigned long retry_count; unsigned long retry_count;
unsigned long max_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; extern struct balloon_stats balloon_stats;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment