Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de5a77d8 authored by David Vrabel's avatar David Vrabel
Browse files

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
Loading
Loading
Loading
Loading
+12 −63
Original line number Original line Diff line number Diff line
@@ -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,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)
		.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
+1 −4
Original line number Original line Diff line number Diff line
@@ -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;