All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Beulich <jbeulich@suse.com>
To: Tamas K Lengyel <tamas@tklengyel.com>
Cc: "Julien Grall" <julien@xen.org>,
	"Stefano Stabellini" <sstabellini@kernel.org>,
	"Tamas K Lengyel" <tamas.lengyel@intel.com>,
	"Wei Liu" <wl@xen.org>,
	"Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>,
	"Andrew Cooper" <andrew.cooper3@citrix.com>,
	"Ian Jackson" <ian.jackson@eu.citrix.com>,
	"George Dunlap" <george.dunlap@citrix.com>,
	Xen-devel <xen-devel@lists.xenproject.org>,
	"Roger Pau Monné" <roger.pau@citrix.com>
Subject: Re: [Xen-devel] [PATCH v9 4/5] x86/mem_sharing: reset a fork
Date: Tue, 25 Feb 2020 14:39:17 +0100	[thread overview]
Message-ID: <c2c48b3c-4bbb-698f-2783-4bc2359cd985@suse.com> (raw)
In-Reply-To: <CABfawhmxwVbNH3o2wpn+SpH=cpVkYS2FsxPccFQt=XqQr=KMwA@mail.gmail.com>

On 24.02.2020 16:35, Tamas K Lengyel wrote:
> On Mon, Feb 24, 2020 at 8:13 AM Roger Pau Monné <roger.pau@citrix.com> wrote:
>> On Fri, Feb 21, 2020 at 10:49:22AM -0800, Tamas K Lengyel wrote:
>>> --- a/xen/arch/x86/mm/mem_sharing.c
>>> +++ b/xen/arch/x86/mm/mem_sharing.c
>>> @@ -1636,6 +1636,59 @@ static int mem_sharing_fork(struct domain *d, struct domain *cd)
>>>      return rc;
>>>  }
>>>
>>> +/*
>>> + * The fork reset operation is intended to be used on short-lived forks only.
>>> + * There is no hypercall continuation operation implemented for this reason.
>>> + * For forks that obtain a larger memory footprint it is likely going to be
>>> + * more performant to create a new fork instead of resetting an existing one.
>>> + *
>>> + * TODO: In case this hypercall would become useful on forks with larger memory
>>> + * footprints the hypercall continuation should be implemented.
>>
>> I'm afraid this is not safe, as users don't have an easy way to know
>> whether a fork will have a large memory footprint or not.
> 
> They do, getdomaininfo tells a user exactly how much memory has been
> allocated for a domain.

This tells the tool stack how much memory a guest has in absolute
numbers, but it doesn't tell it whether Xen would consider this
"large".

>>> +    {
>>> +        p2m_type_t p2mt;
>>> +        p2m_access_t p2ma;
>>> +        gfn_t gfn;
>>> +        mfn_t mfn = page_to_mfn(page);
>>> +
>>> +        if ( !mfn_valid(mfn) )
>>> +            continue;
>>> +
>>> +        gfn = mfn_to_gfn(cd, mfn);
>>> +        mfn = __get_gfn_type_access(p2m, gfn_x(gfn), &p2mt, &p2ma,
>>> +                                    0, NULL, false);
>>> +
>>> +        if ( !p2m_is_ram(p2mt) || p2m_is_shared(p2mt) )
>>> +            continue;
>>> +
>>> +        /* take an extra reference */
>>> +        if ( !get_page(page, cd) )
>>> +            continue;
>>> +
>>> +        rc = p2m->set_entry(p2m, gfn, INVALID_MFN, PAGE_ORDER_4K,
>>> +                            p2m_invalid, p2m_access_rwx, -1);
>>> +        ASSERT(!rc);
>>
>> Can you handle this gracefully?
> 
> Nope. This should never happen, so if it does, something is very wrong
> in some other part of Xen.


In such a case, please put in a comment explaining why failure is
impossible. In the general case e.g. a 2Mb page may need splitting,
which may yield -ENOMEM. Such a comment will then also be useful in
case a new failure mode gets added to ->set_entry(), where it then
will need judging whether the assumption here still holds. (This is
also why in general it'd be better to handle the error. It'll still
be better to crash the guest than the host in case you can't. See
the bottom of ./CODING_STYLE.)

Janan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  parent reply	other threads:[~2020-02-25 13:39 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-21 18:49 [Xen-devel] [PATCH v9 0/5] VM forking Tamas K Lengyel
2020-02-21 18:49 ` [Xen-devel] [PATCH v9 1/5] xen/x86: Make hap_get_allocation accessible Tamas K Lengyel
2020-02-24 15:20   ` Roger Pau Monné
2020-02-25 13:16     ` Jan Beulich
2020-02-25 13:21       ` Tamas K Lengyel
2020-02-21 18:49 ` [Xen-devel] [PATCH v9 2/5] xen: add parent_domid field to createdomain domctl Tamas K Lengyel
2020-02-21 21:02   ` Julien Grall
2020-02-21 21:35     ` Tamas K Lengyel
2020-02-21 22:34       ` Julien Grall
2020-02-21 22:53         ` Tamas K Lengyel
2020-02-21 23:18           ` Julien Grall
2020-02-21 23:31             ` Tamas K Lengyel
2020-02-24 15:44   ` Andrew Cooper
2020-02-24 15:55     ` Tamas K Lengyel
2020-02-21 18:49 ` [Xen-devel] [PATCH v9 3/5] xen/mem_sharing: VM forking Tamas K Lengyel
2020-02-24 12:39   ` Roger Pau Monné
2020-02-24 15:45     ` Tamas K Lengyel
2020-02-24 15:59       ` Roger Pau Monné
2020-02-24 22:14       ` Tamas K Lengyel
2020-02-25  9:40         ` Roger Pau Monné
2020-02-24 22:26       ` Tamas K Lengyel
2020-02-25  9:40         ` Roger Pau Monné
2020-02-25 13:30       ` Jan Beulich
2020-02-25 13:28     ` Jan Beulich
2020-02-25 13:39       ` Tamas K Lengyel
2020-02-25 10:04   ` Roger Pau Monné
2020-02-25 11:43     ` Tamas K Lengyel
2020-02-25 12:06       ` Roger Pau Monné
2020-02-25 12:23         ` Tamas K Lengyel
2020-02-25 14:23           ` Tamas K Lengyel
2020-02-21 18:49 ` [Xen-devel] [PATCH v9 4/5] x86/mem_sharing: reset a fork Tamas K Lengyel
2020-02-24 15:12   ` Roger Pau Monné
2020-02-24 15:35     ` Tamas K Lengyel
2020-02-24 15:42       ` Roger Pau Monné
2020-02-24 15:49         ` Tamas K Lengyel
2020-02-24 16:02           ` Roger Pau Monné
2020-02-25 13:39       ` Jan Beulich [this message]
2020-02-25 13:45         ` Tamas K Lengyel
2020-02-25 14:13           ` Jan Beulich
2020-02-25 14:26             ` Tamas K Lengyel
2020-02-21 18:49 ` [Xen-devel] [PATCH v9 5/5] xen/tools: VM forking toolstack side Tamas K Lengyel
2020-02-24 16:12   ` Julien Grall
2020-02-24 16:19     ` Tamas K Lengyel
2020-02-24 16:30       ` Julien Grall
2020-02-24 16:45         ` Tamas K Lengyel

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=c2c48b3c-4bbb-698f-2783-4bc2359cd985@suse.com \
    --to=jbeulich@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=george.dunlap@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=julien@xen.org \
    --cc=konrad.wilk@oracle.com \
    --cc=roger.pau@citrix.com \
    --cc=sstabellini@kernel.org \
    --cc=tamas.lengyel@intel.com \
    --cc=tamas@tklengyel.com \
    --cc=wl@xen.org \
    --cc=xen-devel@lists.xenproject.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.