From: David Vrabel <david.vrabel@citrix.com>
To: Dan Magenheimer <dan.magenheimer@oracle.com>
Cc: Konrad Wilk <konrad.wilk@oracle.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
Jeremy Fitzhardinge <jeremy@goop.org>
Subject: Re: [PATCH v2] xen: Fix selfballooning and ensure it doesn't go too far
Date: Tue, 27 Sep 2011 16:57:44 +0100 [thread overview]
Message-ID: <4E81F278.5040107@citrix.com> (raw)
In-Reply-To: <2de59b55-4ecc-4155-8709-f8b0f5e012bc@default>
On 27/09/11 16:03, Dan Magenheimer wrote:
> Note: This patch is also now in a git tree at:
>
> git://oss.oracle.com/git/djm/tmem.git#selfballoon-fix-v2
>
> The balloon driver's "current_pages" is very different from
> totalram_pages. Self-ballooning needs to be driven by
> the latter.
I don't think this part of the change makes any difference. It looks like it
rearranges the maths without changing the end result (other than
slightly increasing the rate of change).
I think this (partial, untested) patch is equivalent:
diff --git a/drivers/xen/xen-selfballoon.c b/drivers/xen/xen-selfballoon.c
index 1b4afd8..b207e89 100644
--- a/drivers/xen/xen-selfballoon.c
+++ b/drivers/xen/xen-selfballoon.c
@@ -194,14 +194,15 @@ __setup("selfballooning", xen_selfballooning_setup);
*/
static void selfballoon_process(struct work_struct *work)
{
- unsigned long cur_pages, goal_pages, tgt_pages;
+ unsigned long cur_pages, goal_pages, tgt_pages, rsvd_pages, floor_pages;
bool reset_timer = false;
if (xen_selfballooning_enabled) {
cur_pages = balloon_stats.current_pages;
tgt_pages = cur_pages; /* default is no change */
- goal_pages = percpu_counter_read_positive(&vm_committed_as) +
- balloon_stats.current_pages - totalram_pages;
+ rsvd_pages = cur_pages - totalram_pages;
+ goal_pages = percpu_counter_read_positive(&vm_committed_as)
+ + rsvd_pages;
#ifdef CONFIG_FRONTSWAP
/* allow space for frontswap pages to be repatriated */
if (frontswap_selfshrinking && frontswap_enabled)
@@ -216,6 +217,11 @@ static void selfballoon_process(struct work_struct *work)
((goal_pages - cur_pages) /
selfballoon_uphysteresis);
/* else if cur_pages == goal_pages, no change */
+ floor_pages = rsvd_pages + totalreserve_pages +
+ ((roundup_pow_of_two(max_pfn) / 128) *
+ selfballoon_safety_margin);
+ if (tgt_pages < floor_pages)
+ tgt_pages = floor_pages;
balloon_set_new_target(tgt_pages);
reset_timer = true;
}
> Also, Committed_AS doesn't account for pages
> used by the kernel so enforce a floor for when there are little
> or no user-space threads using memory. The floor function
> includes a "safety margin" tuneable in case we discover later
> that the floor function is still too aggressive in some workloads,
> though likely it will not be needed.
The sysfs file isn't documented (but then neither are any of the other
(self-)balloon driver sysfs files).
I don't think "safety_margin" is the right name. Perhaps,
"min_reservation_ratio" or something like that?
David
> Changes since version 1:
> - tuneable safety margin added
>
> [v2: konrad.wilk@oracle.com: make safety margin tuneable]
>
> Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com>
>
> diff --git a/drivers/xen/xen-selfballoon.c b/drivers/xen/xen-selfballoon.c
> index 6ea852e..ceaada6 100644
> --- a/drivers/xen/xen-selfballoon.c
> +++ b/drivers/xen/xen-selfballoon.c
> @@ -93,6 +93,12 @@ static unsigned int selfballoon_uphysteresis __read_mostly = 1;
> /* In HZ, controls frequency of worker invocation. */
> static unsigned int selfballoon_interval __read_mostly = 5;
>
> +/*
> + * Scale factor for safety margin for minimum selfballooning target for balloon.
> + * Default adds about 3% (4/128) of max_pfn.
> + */
> +static unsigned int selfballoon_safety_margin = 4;
> +
> static void selfballoon_process(struct work_struct *work);
> static DECLARE_DELAYED_WORK(selfballoon_worker, selfballoon_process);
>
> @@ -195,14 +201,13 @@ __setup("selfballooning", xen_selfballooning_setup);
> */
> static void selfballoon_process(struct work_struct *work)
> {
> - unsigned long cur_pages, goal_pages, tgt_pages;
> + unsigned long cur_pages, goal_pages, tgt_pages, floor_pages;
> bool reset_timer = false;
>
> if (xen_selfballooning_enabled) {
> - cur_pages = balloon_stats.current_pages;
> + cur_pages = totalram_pages;
> tgt_pages = cur_pages; /* default is no change */
> - goal_pages = percpu_counter_read_positive(&vm_committed_as) +
> - balloon_stats.current_pages - totalram_pages;
> + goal_pages = percpu_counter_read_positive(&vm_committed_as);
> #ifdef CONFIG_FRONTSWAP
> /* allow space for frontswap pages to be repatriated */
> if (frontswap_selfshrinking && frontswap_enabled)
> @@ -217,7 +222,13 @@ static void selfballoon_process(struct work_struct *work)
> ((goal_pages - cur_pages) /
> selfballoon_uphysteresis);
> /* else if cur_pages == goal_pages, no change */
> - balloon_set_new_target(tgt_pages);
> + floor_pages = totalreserve_pages +
> + ((roundup_pow_of_two(max_pfn) / 128) *
> + selfballoon_safety_margin);
> + if (tgt_pages < floor_pages)
> + tgt_pages = floor_pages;
> + balloon_set_new_target(tgt_pages +
> + balloon_stats.current_pages - totalram_pages);
> reset_timer = true;
> }
> #ifdef CONFIG_FRONTSWAP
> @@ -340,6 +351,30 @@ static ssize_t store_selfballoon_uphys(struct sys_device *dev,
> static SYSDEV_ATTR(selfballoon_uphysteresis, S_IRUGO | S_IWUSR,
> show_selfballoon_uphys, store_selfballoon_uphys);
>
> +SELFBALLOON_SHOW(selfballoon_safety_margin, "%d\n", selfballoon_safety_margin);
> +
> +static ssize_t store_selfballoon_safety_margin(struct sys_device *dev,
> + struct sysdev_attribute *attr,
> + const char *buf,
> + size_t count)
> +{
> + unsigned long val;
> + int err;
> +
> + if (!capable(CAP_SYS_ADMIN))
> + return -EPERM;
> + err = strict_strtoul(buf, 10, &val);
> + if (err || val == 0 || val > 128)
> + return -EINVAL;
> + selfballoon_safety_margin = val;
> + return count;
> +}
> +
> +static SYSDEV_ATTR(selfballoon_safety_margin, S_IRUGO | S_IWUSR,
> + show_selfballoon_safety_margin,
> + store_selfballoon_safety_margin);
> +
> +
> #ifdef CONFIG_FRONTSWAP
> SELFBALLOON_SHOW(frontswap_selfshrinking, "%d\n", frontswap_selfshrinking);
>
> @@ -421,6 +456,7 @@ static struct attribute *selfballoon_attrs[] = {
> &attr_selfballoon_interval.attr,
> &attr_selfballoon_downhysteresis.attr,
> &attr_selfballoon_uphysteresis.attr,
> + &attr_selfballoon_safety_margin.attr,
> #ifdef CONFIG_FRONTSWAP
> &attr_frontswap_selfshrinking.attr,
> &attr_frontswap_hysteresis.attr,
next prev parent reply other threads:[~2011-09-27 15:56 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-27 15:03 [PATCH v2] xen: Fix selfballooning and ensure it doesn't go too far Dan Magenheimer
2011-09-27 15:57 ` David Vrabel [this message]
2011-09-27 16:19 ` Dan Magenheimer
2011-09-27 17:08 ` David Vrabel
2011-09-27 20:25 ` Dan Magenheimer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E81F278.5040107@citrix.com \
--to=david.vrabel@citrix.com \
--cc=dan.magenheimer@oracle.com \
--cc=jeremy@goop.org \
--cc=konrad.wilk@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.