Excellent! I think this explains a weirdness I saw a year
ago when working on self-ballooning, and also a problem
I saw under certain conditions for tmem, that I had
communicated offline to Jeremy last month (because I was
looking at the pvops driver at the time) but never got
around to understanding in detail.
Suggestion: Perhaps the balloon_timer interval should
be configurable via sysfs?
> -----Original Message-----
> From: Ian Campbell [mailto:Ian.Campbell@xxxxxxxxxxxxx]
> Sent: Friday, June 05, 2009 4:57 AM
> To: xen-devel
> Cc: Keir Fraser
> Subject: [Xen-devel] linux: try harder to balloon up under memory
> pressure.
>
>
> Currently if the balloon driver is unable to increase the guest's
> reservation it assumes the failure was due to reaching its full
> allocation, gives up on the ballooning operation and records the limit
> it reached as the "hard limit". The driver will not try again until
> the target is set again (even to the same value).
>
> However it is possible that ballooning has in fact failed due to
> memory pressure in the host and therefore it is desirable to keep
> attempting to reach the target in case memory becomes available. The
> most likely scenario is that some guests are ballooning down while
> others are ballooning up and therefore there is temporary memory
> pressure while things stabilise. You would not expect a well behaved
> toolstack to ask a domain to balloon to more than its allocation nor
> would you expect it to deliberately over-commit memory by setting
> balloon targets which exceed the total host memory.
>
> This patch drops the concept of a hard limit and causes the balloon
> driver to retry increasing the reservation on a timer in the same
> manner as when decreasing the reservation.
>
> Also if we partially succeed in increasing the reservation
> (i.e. receive less pages than we asked for) then we may as well keep
> those pages rather than returning them to Xen.
>
> This patch is for the 2.6.18-xen tree.
>
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
>
> diff -r fd9c565657b8 drivers/xen/balloon/balloon.c
> --- a/drivers/xen/balloon/balloon.c Thu Jun 04 16:26:49 2009 +0100
> +++ b/drivers/xen/balloon/balloon.c Fri Jun 05 11:56:22 2009 +0100
> @@ -188,7 +188,7 @@
>
> 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;
> @@ -255,26 +255,12 @@
> }
>
> 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;
> + reservation.nr_extents = nr_pages;
> + rc = HYPERVISOR_memory_op(XENMEM_populate_physmap,
> &reservation);
> + if (rc < 0)
> + goto out;
>
> - /* 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);
> - goto out;
> - }
> -
> - for (i = 0; i < nr_pages; i++) {
> + for (i = 0; i < rc; i++) {
> page = balloon_retrieve();
> BUG_ON(page == NULL);
>
> @@ -302,13 +288,13 @@
> 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)
> @@ -420,7 +406,6 @@
> 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);
> }
> @@ -498,17 +483,11 @@
> "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;
> @@ -539,7 +518,6 @@
> bs.balloon_low = 0;
> bs.balloon_high = 0;
> bs.driver_pages = 0UL;
> - bs.hard_limit = ~0UL;
>
> init_timer(&balloon_timer);
> balloon_timer.data = 0;
> diff -r fd9c565657b8 drivers/xen/balloon/common.h
> --- a/drivers/xen/balloon/common.h Thu Jun 04 16:26:49 2009 +0100
> +++ b/drivers/xen/balloon/common.h Fri Jun 05 11:56:22 2009 +0100
> @@ -35,8 +35,6 @@
> /* 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.
> diff -r fd9c565657b8 drivers/xen/balloon/sysfs.c
> --- a/drivers/xen/balloon/sysfs.c Thu Jun 04 16:26:49 2009 +0100
> +++ b/drivers/xen/balloon/sysfs.c Fri Jun 05 11:56:22 2009 +0100
> @@ -53,9 +53,6 @@
> 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)
> @@ -96,7 +93,6 @@
> &attr_current_kb.attr,
> &attr_low_kb.attr,
> &attr_high_kb.attr,
> - &attr_hard_limit_kb.attr,
> &attr_driver_kb.attr,
> NULL
> };
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|