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: David Vrabel <david.vrabel@citrix.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
@@ -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)
|
|||||||
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)
|
|||||||
|
|
||||||
__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,26 +306,6 @@ static struct notifier_block xen_memory_nb = {
|
|||||||
.priority = 0
|
.priority = 0
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
static long current_credit(void)
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool balloon_is_inflated(void)
|
|
||||||
{
|
|
||||||
if (balloon_stats.balloon_low || balloon_stats.balloon_high)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum bp_state reserve_additional_memory(long credit)
|
static enum bp_state reserve_additional_memory(long credit)
|
||||||
{
|
{
|
||||||
balloon_stats.target_pages = balloon_stats.current_pages;
|
balloon_stats.target_pages = balloon_stats.current_pages;
|
||||||
@@ -356,6 +313,16 @@ static enum bp_state reserve_additional_memory(long credit)
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */
|
#endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */
|
||||||
|
|
||||||
|
static long current_credit(void)
|
||||||
|
{
|
||||||
|
return balloon_stats.target_pages - balloon_stats.current_pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool balloon_is_inflated(void)
|
||||||
|
{
|
||||||
|
return balloon_stats.balloon_low || balloon_stats.balloon_high;
|
||||||
|
}
|
||||||
|
|
||||||
static enum bp_state increase_reservation(unsigned long nr_pages)
|
static enum bp_state increase_reservation(unsigned long nr_pages)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
@@ -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)
|
|||||||
.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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 {
|
|||||||
/* 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;
|
||||||
|
|||||||
Reference in New Issue
Block a user