|
@@ -66,8 +66,6 @@ struct balloon_stats {
|
|
|
/* We aim for 'current allocation' == 'target allocation'. */
|
|
|
unsigned long current_pages;
|
|
|
unsigned long target_pages;
|
|
|
- /* We may hit the hard limit in Xen. If we do then we remember it. */
|
|
|
- unsigned long hard_limit;
|
|
|
/*
|
|
|
* Drivers may alter the memory reservation independently, but they
|
|
|
* must inform the balloon driver so we avoid hitting the hard limit.
|
|
@@ -185,7 +183,7 @@ static void balloon_alarm(unsigned long unused)
|
|
|
|
|
|
static unsigned long current_target(void)
|
|
|
{
|
|
|
- unsigned long target = min(balloon_stats.target_pages, balloon_stats.hard_limit);
|
|
|
+ unsigned long target = balloon_stats.target_pages;
|
|
|
|
|
|
target = min(target,
|
|
|
balloon_stats.current_pages +
|
|
@@ -221,23 +219,10 @@ static int increase_reservation(unsigned long nr_pages)
|
|
|
set_xen_guest_handle(reservation.extent_start, frame_list);
|
|
|
reservation.nr_extents = nr_pages;
|
|
|
rc = HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation);
|
|
|
- if (rc < nr_pages) {
|
|
|
- if (rc > 0) {
|
|
|
- int ret;
|
|
|
-
|
|
|
- /* We hit the Xen hard limit: reprobe. */
|
|
|
- reservation.nr_extents = rc;
|
|
|
- ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
|
|
|
- &reservation);
|
|
|
- BUG_ON(ret != rc);
|
|
|
- }
|
|
|
- if (rc >= 0)
|
|
|
- balloon_stats.hard_limit = (balloon_stats.current_pages + rc -
|
|
|
- balloon_stats.driver_pages);
|
|
|
+ if (rc < 0)
|
|
|
goto out;
|
|
|
- }
|
|
|
|
|
|
- for (i = 0; i < nr_pages; i++) {
|
|
|
+ for (i = 0; i < rc; i++) {
|
|
|
page = balloon_retrieve();
|
|
|
BUG_ON(page == NULL);
|
|
|
|
|
@@ -263,12 +248,12 @@ static int increase_reservation(unsigned long nr_pages)
|
|
|
__free_page(page);
|
|
|
}
|
|
|
|
|
|
- balloon_stats.current_pages += nr_pages;
|
|
|
+ balloon_stats.current_pages += rc;
|
|
|
|
|
|
out:
|
|
|
spin_unlock_irqrestore(&balloon_lock, flags);
|
|
|
|
|
|
- return 0;
|
|
|
+ return rc < 0 ? rc : rc != nr_pages;
|
|
|
}
|
|
|
|
|
|
static int decrease_reservation(unsigned long nr_pages)
|
|
@@ -369,7 +354,6 @@ static void balloon_process(struct work_struct *work)
|
|
|
static void balloon_set_new_target(unsigned long target)
|
|
|
{
|
|
|
/* No need for lock. Not read-modify-write updates. */
|
|
|
- balloon_stats.hard_limit = ~0UL;
|
|
|
balloon_stats.target_pages = target;
|
|
|
schedule_work(&balloon_worker);
|
|
|
}
|
|
@@ -428,7 +412,6 @@ static int __init balloon_init(void)
|
|
|
balloon_stats.balloon_low = 0;
|
|
|
balloon_stats.balloon_high = 0;
|
|
|
balloon_stats.driver_pages = 0UL;
|
|
|
- balloon_stats.hard_limit = ~0UL;
|
|
|
|
|
|
init_timer(&balloon_timer);
|
|
|
balloon_timer.data = 0;
|
|
@@ -473,9 +456,6 @@ module_exit(balloon_exit);
|
|
|
BALLOON_SHOW(current_kb, "%lu\n", PAGES2KB(balloon_stats.current_pages));
|
|
|
BALLOON_SHOW(low_kb, "%lu\n", PAGES2KB(balloon_stats.balloon_low));
|
|
|
BALLOON_SHOW(high_kb, "%lu\n", PAGES2KB(balloon_stats.balloon_high));
|
|
|
-BALLOON_SHOW(hard_limit_kb,
|
|
|
- (balloon_stats.hard_limit!=~0UL) ? "%lu\n" : "???\n",
|
|
|
- (balloon_stats.hard_limit!=~0UL) ? PAGES2KB(balloon_stats.hard_limit) : 0);
|
|
|
BALLOON_SHOW(driver_kb, "%lu\n", PAGES2KB(balloon_stats.driver_pages));
|
|
|
|
|
|
static ssize_t show_target_kb(struct sys_device *dev, struct sysdev_attribute *attr,
|
|
@@ -545,7 +525,6 @@ static struct attribute *balloon_info_attrs[] = {
|
|
|
&attr_current_kb.attr,
|
|
|
&attr_low_kb.attr,
|
|
|
&attr_high_kb.attr,
|
|
|
- &attr_hard_limit_kb.attr,
|
|
|
&attr_driver_kb.attr,
|
|
|
NULL
|
|
|
};
|