From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Wei Liu <wei.liu2@citrix.com>
Cc: Ian Campbell <Ian.Campbell@citrix.com>, xen-devel@lists.xen.org
Subject: Re: Claim mode and HVM PoD interact badly
Date: Tue, 21 Jan 2014 16:57:55 -0500 [thread overview]
Message-ID: <20140121215755.GB6363@phenom.dumpdata.com> (raw)
In-Reply-To: <20140120162943.GD11681@zion.uk.xensource.com>
On Mon, Jan 20, 2014 at 04:29:43PM +0000, Wei Liu wrote:
> On Fri, Jan 10, 2014 at 09:58:07AM -0500, Konrad Rzeszutek Wilk wrote:
> > On Fri, Jan 10, 2014 at 11:59:42AM +0000, Ian Campbell wrote:
> > > create ^
> > > owner Wei Liu <wei.liu2@citrix.com>
> > > thanks
> > >
> > > On Fri, 2014-01-10 at 11:56 +0000, Wei Liu wrote:
> > > > When I have following configuration in HVM config file:
> > > > memory=128
> > > > maxmem=256
> > > > and have claim_mode=1 in /etc/xen/xl.conf, xl create fails with
> > > >
> > > > xc: error: Could not allocate memory for HVM guest as we cannot claim memory! (22 = Invalid argument): Internal error
> > > > libxl: error: libxl_dom.c:647:libxl__build_hvm: hvm building failed
> > > > libxl: error: libxl_create.c:1000:domcreate_rebuild_done: cannot (re-)build domain: -3
> > > > libxl: error: libxl_dm.c:1467:kill_device_model: unable to find device model pid in /local/domain/82/image/device-model-pid
> > > > libxl: error: libxl.c:1425:libxl__destroy_domid: libxl__destroy_device_model failed for 82
> > > >
> > > > With claim_mode=0, I can sucessfuly create HVM guest.
> > >
> > > Is it trying to claim 256M instead of 128M? (although the likelyhood
> >
> > No. 128MB actually.
> >
> > > that you only have 128-255M free is quite low, or are you
> > > autoballooning?)
> >
> > This patch fixes it for me. It basically sets the amount of pages
> > claimed to be 'maxmem' instead of 'memory' for PoD.
> >
> > I don't know PoD very well, and this claim is only valid during the
> > allocation of the guests memory - so the 'target_pages' value might be
> > the wrong one. However looking at the hypervisor's
> > 'p2m_pod_set_mem_target' I see this comment:
> >
> > 316 * B <T': Set the PoD cache size equal to the number of outstanding PoD
> > 317 * entries. The balloon driver will deflate the balloon to give back
> > 318 * the remainder of the ram to the guest OS.
> >
> > Which implies to me that we _need_ the 'maxmem' amount of memory at boot time.
> > And then it is the responsibility of the balloon driver to give the memory
> > back (and this is where the 'static-max' et al come in play to tell the
> > balloon driver to balloon out).
> >
> >
> > diff --git a/tools/libxc/xc_hvm_build_x86.c b/tools/libxc/xc_hvm_build_x86.c
> > index 77bd365..65e9577 100644
> > --- a/tools/libxc/xc_hvm_build_x86.c
> > +++ b/tools/libxc/xc_hvm_build_x86.c
> > @@ -335,7 +335,12 @@ static int setup_guest(xc_interface *xch,
> >
> > /* try to claim pages for early warning of insufficient memory available */
> > if ( claim_enabled ) {
> > - rc = xc_domain_claim_pages(xch, dom, nr_pages - cur_pages);
> > + unsigned long nr = nr_pages - cur_pages;
> > +
> > + if ( pod_mode )
> > + nr = target_pages - 0x20;
> > +
>
> I'm a bit confused, did this work for you? At this point d->tot_pages
> should be (target_pages - 0x20). However in the hypervisor logic if you
> try to claim the exact amount of pages as d->tot_pages it should return
> EINVAL.
>
> Furthur more, the original logic doesn't look right. In PV guest
> creation, xc tries to claim "memory=" pages, while in HVM guest creation
> it tries to claim "maxmem=" pages. I think HVM code is wrong.
>
> And George shed me some light on PoD this morning, "cache" in PoD should
> be the pool of pages that used to populate into guest physical memory.
> In that sense it should be the size of mem_target ("memory=").
>
> So I come up with a fix like this. Any idea?
The patch I came up didn't work. It did work the first time but I think
that is because I had 'claim=0' in the xl.conf and forgot about it (sigh).
After a bit of rebooting I realized that the patch didn't do the right
job. The one way it _did_ work was to claim the amount of pages
that the guest had allocated at this moment. That is for the PoD
path the 'xc_domain_set_pod_target' (which is called before the
claim call) ends up allocating memory.
So the claim 'clamp' was done past that moment (which is not good).
I will try out your patch later this week and report. Thanks!
>
> Wei.
>
> ---8<---
> diff --git a/tools/libxc/xc_hvm_build_x86.c b/tools/libxc/xc_hvm_build_x86.c
> index 77bd365..472f1df 100644
> --- a/tools/libxc/xc_hvm_build_x86.c
> +++ b/tools/libxc/xc_hvm_build_x86.c
> @@ -49,6 +49,8 @@
> #define NR_SPECIAL_PAGES 8
> #define special_pfn(x) (0xff000u - NR_SPECIAL_PAGES + (x))
>
> +#define POD_VGA_HOLE_SIZE (0x20)
> +
> static int modules_init(struct xc_hvm_build_args *args,
> uint64_t vend, struct elf_binary *elf,
> uint64_t *mstart_out, uint64_t *mend_out)
> @@ -305,11 +307,13 @@ static int setup_guest(xc_interface *xch,
> if ( pod_mode )
> {
> /*
> - * Subtract 0x20 from target_pages for the VGA "hole". Xen will
> - * adjust the PoD cache size so that domain tot_pages will be
> - * target_pages - 0x20 after this call.
> + * Subtract POD_VGA_HOLE_SIZE from target_pages for the VGA
> + * "hole". Xen will adjust the PoD cache size so that domain
> + * tot_pages will be target_pages - POD_VGA_HOLE_SIZE after
> + * this call.
> */
> - rc = xc_domain_set_pod_target(xch, dom, target_pages - 0x20,
> + rc = xc_domain_set_pod_target(xch, dom,
> + target_pages - POD_VGA_HOLE_SIZE,
> NULL, NULL, NULL);
> if ( rc != 0 )
> {
> @@ -335,7 +339,12 @@ static int setup_guest(xc_interface *xch,
>
> /* try to claim pages for early warning of insufficient memory available */
> if ( claim_enabled ) {
> - rc = xc_domain_claim_pages(xch, dom, nr_pages - cur_pages);
> + unsigned long nr = target_pages;
> +
> + if ( pod_mode )
> + nr -= POD_VGA_HOLE_SIZE;
> +
> + rc = xc_domain_claim_pages(xch, dom, nr);
> if ( rc != 0 )
> {
> PERROR("Could not allocate memory for HVM guest as we cannot claim memory!");
> diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
> index 5f484a2..1e44ba3 100644
> --- a/xen/common/page_alloc.c
> +++ b/xen/common/page_alloc.c
> @@ -339,8 +339,8 @@ int domain_set_outstanding_pages(struct domain *d, unsigned long pages)
> goto out;
> }
>
> - /* disallow a claim not exceeding current tot_pages or above max_pages */
> - if ( (pages <= d->tot_pages) || (pages > d->max_pages) )
> + /* disallow a claim below current tot_pages or above max_pages */
> + if ( (pages < d->tot_pages) || (pages > d->max_pages) )
> {
> ret = -EINVAL;
> goto out;
>
>
>
> > + rc = xc_domain_claim_pages(xch, dom, nr);
> > if ( rc != 0 )
> > {
> > PERROR("Could not allocate memory for HVM guest as we cannot claim memory!");
next prev parent reply other threads:[~2014-01-21 21:57 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-10 11:56 Claim mode and HVM PoD interact badly Wei Liu
2014-01-10 11:59 ` Ian Campbell
2014-01-10 12:15 ` Processed: " xen
2014-01-10 14:58 ` Konrad Rzeszutek Wilk
2014-01-10 15:10 ` Wei Liu
2014-01-10 15:41 ` Konrad Rzeszutek Wilk
2014-01-10 15:48 ` Wei Liu
2014-01-10 16:08 ` Konrad Rzeszutek Wilk
2014-01-10 15:52 ` Jan Beulich
2014-01-10 16:07 ` Konrad Rzeszutek Wilk
2014-01-10 16:23 ` Jan Beulich
2014-01-10 16:03 ` Wei Liu
2014-01-10 16:50 ` Konrad Rzeszutek Wilk
2014-01-10 15:16 ` Ian Campbell
2014-01-10 15:19 ` Wei Liu
2014-01-10 15:28 ` Konrad Rzeszutek Wilk
2014-01-10 15:56 ` Ian Campbell
2014-01-10 16:05 ` Konrad Rzeszutek Wilk
2014-01-10 16:11 ` Ian Campbell
2014-01-10 16:39 ` Konrad Rzeszutek Wilk
2014-01-27 12:44 ` George Dunlap
2014-01-10 19:07 ` Tim Deegan
2014-01-20 16:29 ` Wei Liu
2014-01-21 21:57 ` Konrad Rzeszutek Wilk [this message]
2014-01-27 14:54 ` George Dunlap
2014-01-27 16:14 ` Wei Liu
2014-01-27 17:33 ` George Dunlap
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=20140121215755.GB6363@phenom.dumpdata.com \
--to=konrad.wilk@oracle.com \
--cc=Ian.Campbell@citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/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.