static unsigned long current_target(void)
{
- unsigned long target = min(bs.target_pages, bs.hard_limit);
+ unsigned long target = bs.target_pages;
if (target > (bs.current_pages + bs.balloon_low + bs.balloon_high))
target = bs.current_pages + bs.balloon_low + bs.balloon_high;
return target;
}
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)
- bs.hard_limit = (bs.current_pages + rc -
- bs.driver_pages);
+ reservation.nr_extents = nr_pages;
+ rc = HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation);
+ 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);
balloon_free_page(page);
}
- bs.current_pages += nr_pages;
+ bs.current_pages += rc;
totalram_pages = bs.current_pages;
out:
balloon_unlock(flags);
- return 0;
+ return rc < 0 ? rc : rc != nr_pages;
}
static int decrease_reservation(unsigned long nr_pages)
void balloon_set_new_target(unsigned long target)
{
/* No need for lock. Not read-modify-write updates. */
- bs.hard_limit = ~0UL;
bs.target_pages = max(target, minimum_target());
schedule_work(&balloon_worker);
}
"Requested target: %8lu kB\n"
"Low-mem balloon: %8lu kB\n"
"High-mem balloon: %8lu kB\n"
- "Driver pages: %8lu kB\n"
- "Xen hard limit: ",
+ "Driver pages: %8lu kB\n",
PAGES2KB(bs.current_pages), PAGES2KB(bs.target_pages),
PAGES2KB(bs.balloon_low), PAGES2KB(bs.balloon_high),
PAGES2KB(bs.driver_pages));
- if (bs.hard_limit != ~0UL)
- len += sprintf(page + len, "%8lu kB\n",
- PAGES2KB(bs.hard_limit));
- else
- len += sprintf(page + len, " ??? kB\n");
*eof = 1;
return len;
bs.balloon_low = 0;
bs.balloon_high = 0;
bs.driver_pages = 0UL;
- bs.hard_limit = ~0UL;
init_timer(&balloon_timer);
balloon_timer.data = 0;
BALLOON_SHOW(current_kb, "%lu\n", PAGES2KB(bs.current_pages));
BALLOON_SHOW(low_kb, "%lu\n", PAGES2KB(bs.balloon_low));
BALLOON_SHOW(high_kb, "%lu\n", PAGES2KB(bs.balloon_high));
-BALLOON_SHOW(hard_limit_kb,
- (bs.hard_limit!=~0UL) ? "%lu\n" : "???\n",
- (bs.hard_limit!=~0UL) ? PAGES2KB(bs.hard_limit) : 0);
BALLOON_SHOW(driver_kb, "%lu\n", PAGES2KB(bs.driver_pages));
static ssize_t show_target_kb(struct sys_device *dev, char *buf)
&attr_current_kb.attr,
&attr_low_kb.attr,
&attr_high_kb.attr,
- &attr_hard_limit_kb.attr,
&attr_driver_kb.attr,
NULL
};