xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: "Jan Beulich" <JBeulich@suse.com>
To: Ravi Sahita <ravi.sahita@intel.com>
Cc: Tim Deegan <tim@xen.org>, Wei Liu <wei.liu2@citrix.com>,
	George Dunlap <george.dunlap@eu.citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	Edmund H White <edmund.h.white@intel.com>,
	"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>,
	"tlengyel@novetta.com" <tlengyel@novetta.com>,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [PATCH v5 10/15] x86/altp2m: add remaining support routines.
Date: Thu, 16 Jul 2015 10:34:10 +0100	[thread overview]
Message-ID: <55A796B20200007800091C61@mail.emea.novell.com> (raw)
In-Reply-To: <DBC12B0F5509554280826E40BCDEE8BE54FD7766@ORSMSX104.amr.corp.intel.com>

>>> On 16.07.15 at 11:16, <ravi.sahita@intel.com> wrote:
>> From: Jan Beulich [mailto:JBeulich@suse.com]
>>Sent: Tuesday, July 14, 2015 7:32 AM
>>>>> On 14.07.15 at 02:14, <edmund.h.white@intel.com> wrote:
>>> @@ -2965,9 +3003,15 @@ int hvm_hap_nested_page_fault(paddr_t gpa,
>>unsigned long gla,
>>>          if ( npfec.write_access )
>>>          {
>>>              paging_mark_dirty(currd, mfn_x(mfn));
>>> +            /* If p2m is really an altp2m, unlock here to avoid lock 
> ordering
>>> +             * violation when the change below is propagated from host p2m 
> */
>>> +            if ( ap2m_active )
>>> +                __put_gfn(p2m, gfn);
>>>              p2m_change_type_one(currd, gfn, p2m_ram_logdirty,
>>> p2m_ram_rw);
>>
>>And this won't result in any races?
> 
> No

To be honest I expected a little more than just "no" here. Now
I have to ask - why?

>>> --- a/xen/arch/x86/mm/p2m.c
>>> +++ b/xen/arch/x86/mm/p2m.c
>>> @@ -2037,6 +2037,391 @@ bool_t p2m_switch_vcpu_altp2m_by_id(struct
>>vcpu *v, uint16_t idx)
>>>      return rc;
>>>  }
>>>
>>> +void p2m_flush_altp2m(struct domain *d) {
>>> +    uint16_t i;
>>> +
>>> +    altp2m_list_lock(d);
>>> +
>>> +    for ( i = 0; i < MAX_ALTP2M; i++ )
>>> +    {
>>> +        p2m_flush_table(d->arch.altp2m_p2m[i]);
>>> +        /* Uninit and reinit ept to force TLB shootdown */
>>> +        ept_p2m_uninit(d->arch.altp2m_p2m[i]);
>>> +        ept_p2m_init(d->arch.altp2m_p2m[i]);
>>
>>ept_... in non-EPT code again.
>>
> 
> There is no non-EPT altp2m implementation, and this file already includes 
> ept.. callouts for p2m's implemented using EPT's.

The only two calls currently there are ept_p2m_{,un}init(), which
need to be there with the current code structuring. Everything
else that's EPT-specific should be abstracted through hooks set
by ept_p2m_init().

>>> +long p2m_init_altp2m_by_id(struct domain *d, uint16_t idx) {
>>> +    long rc = -EINVAL;
>>
>>Why long (for both variable and function return type)? (More of these in
>>functions below.)
> 
> Because the error variable in the code that calls these (in hvm.c) is a 
> long, and you had given feedback earlier to propagate the returns from these 
> functions through that calling code.

I don't see the connection. The function only returns zero or -E...
values, so why would its return type be "long"?

>>> +long p2m_init_next_altp2m(struct domain *d, uint16_t *idx) {
>>> +    long rc = -EINVAL;
>>> +    uint16_t i;
>>
>>As in the earlier patch(es) - unsigned int.
> 
> Ok, but why does it matter? uint16_t will always suffice.

And will always produce worse code.

>>> +void p2m_altp2m_propagate_change(struct domain *d, gfn_t gfn,
>>> +                                 mfn_t mfn, unsigned int page_order,
>>> +                                 p2m_type_t p2mt, p2m_access_t p2ma)
>>> +{
>>> +    struct p2m_domain *p2m;
>>> +    p2m_access_t a;
>>> +    p2m_type_t t;
>>> +    mfn_t m;
>>> +    uint16_t i;
>>> +    bool_t reset_p2m;
>>> +    unsigned int reset_count = 0;
>>> +    uint16_t last_reset_idx = ~0;
>>> +
>>> +    if ( !altp2m_active(d) )
>>> +        return;
>>> +
>>> +    altp2m_list_lock(d);
>>> +
>>> +    for ( i = 0; i < MAX_ALTP2M; i++ )
>>> +    {
>>> +        if ( d->arch.altp2m_eptp[i] == INVALID_MFN )
>>> +            continue;
>>> +
>>> +        p2m = d->arch.altp2m_p2m[i];
>>> +        m = get_gfn_type_access(p2m, gfn_x(gfn), &t, &a, 0, NULL);
>>> +
>>> +        reset_p2m = 0;
>>> +
>>> +        /* Check for a dropped page that may impact this altp2m */
>>> +        if ( mfn_x(mfn) == INVALID_MFN &&
>>> +             gfn_x(gfn) >= p2m->min_remapped_gfn &&
>>> +             gfn_x(gfn) <= p2m->max_remapped_gfn )
>>> +            reset_p2m = 1;
>>
>>Considering that this looks like an optimization, what's the downside of
>>possibly having min=0 and max=<end-of-address-space>? I.e.
>>can there a long latency operation result that's this way a guest can effect?
>>
> 
> ... A p2m is a gfn->mfn map, amongst other things. There is a reverse mfn->gfn 
> map, but that is only valid for the host p2m. Unless the remap altp2m 
> hypercall is used, the gfn->mfn map in every altp2m mirrors the gfn->mfn map in 
> the host p2m (or a subset thereof, due to lazy-copy), so handling removal of 
> an mfn from a guest is simple: do a reverse look up for the host p2m and mark 
> the relevant gfn as invalid, then do the same for every altp2m where that gfn 
> is currently valid.
> 
> Remap changes things: it says take gfn1 and replace ->mfn with the ->mfn of 
> gfn2. Here is where the optimization is used and the  invalidate logic is: 
> record the lowest and highest gfn2's that have been used in remap ops; if an 
> mfn is dropped from the hostp2m, for the purposes of altp2m invalidation, see 
> if the gfn derived from the host p2m reverse lookup falls within the range of 
> used gfn2's. If it does, an invalidation is required. Which is why min and 
> max are inited the way they are - hope the explanation clarifies this 
> optimization.

Sadly it doesn't, it just re-states what I already understood and doesn't
answer the question: What happens if min=0 and
max=<end-of-address-space>? I.e. can the guest nullify the
optimization by careful fiddling issuing some of the new hypercalls, and if
so will this have any negative impact on the hypervisor? I'm asking this
from a security standpoint ...

Nor do I find my question answered why max can't be initialized to zero:
You don't care whether max is a valid GFN when a certain GFN doesn't
fall in the (then empty) [min, max] range. What am I missing?

Jan

  reply	other threads:[~2015-07-16  9:34 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-14  0:14 [PATCH v5 00/15] Alternate p2m: support multiple copies of host p2m Ed White
2015-07-14  0:14 ` [PATCH v5 01/15] common/domain: Helpers to pause a domain while in context Ed White
2015-07-14  0:14 ` [PATCH v5 02/15] VMX: VMFUNC and #VE definitions and detection Ed White
2015-07-14  0:14 ` [PATCH v5 03/15] VMX: implement suppress #VE Ed White
2015-07-14 12:46   ` Jan Beulich
2015-07-14 13:47   ` George Dunlap
2015-07-14  0:14 ` [PATCH v5 04/15] x86/HVM: Hardware alternate p2m support detection Ed White
2015-07-14  0:14 ` [PATCH v5 05/15] x86/altp2m: basic data structures and support routines Ed White
2015-07-14 13:13   ` Jan Beulich
2015-07-14 14:45     ` George Dunlap
2015-07-14 14:58       ` Jan Beulich
2015-07-16  8:57     ` Sahita, Ravi
2015-07-16  9:07       ` Jan Beulich
2015-07-17 22:36         ` Sahita, Ravi
2015-07-20  6:20           ` Jan Beulich
2015-07-21  5:18             ` Sahita, Ravi
2015-07-14 15:57   ` George Dunlap
2015-07-21 17:44     ` Sahita, Ravi
2015-07-14  0:14 ` [PATCH v5 06/15] VMX/altp2m: add code to support EPTP switching and #VE Ed White
2015-07-14 13:57   ` Jan Beulich
2015-07-16  9:20     ` Sahita, Ravi
2015-07-16  9:38       ` Jan Beulich
2015-07-17 21:08         ` Sahita, Ravi
2015-07-20  6:21           ` Jan Beulich
2015-07-21  5:49             ` Sahita, Ravi
2015-07-14  0:14 ` [PATCH v5 07/15] VMX: add VMFUNC leaf 0 (EPTP switching) to emulator Ed White
2015-07-14 14:04   ` Jan Beulich
2015-07-14 17:56     ` Sahita, Ravi
2015-07-17 22:41     ` Sahita, Ravi
2015-07-14  0:14 ` [PATCH v5 08/15] x86/altp2m: add control of suppress_ve Ed White
2015-07-14 17:03   ` George Dunlap
2015-07-14  0:14 ` [PATCH v5 09/15] x86/altp2m: alternate p2m memory events Ed White
2015-07-14 14:08   ` Jan Beulich
2015-07-16  9:22     ` Sahita, Ravi
2015-07-14  0:14 ` [PATCH v5 10/15] x86/altp2m: add remaining support routines Ed White
2015-07-14 14:31   ` Jan Beulich
2015-07-16  9:16     ` Sahita, Ravi
2015-07-16  9:34       ` Jan Beulich [this message]
2015-07-17 22:32         ` Sahita, Ravi
2015-07-20  6:53           ` Jan Beulich
2015-07-21  5:46             ` Sahita, Ravi
2015-07-21  6:38               ` Jan Beulich
2015-07-21 18:33                 ` Sahita, Ravi
2015-07-22  7:33                   ` Jan Beulich
2015-07-16 14:44   ` George Dunlap
2015-07-17 21:01     ` Sahita, Ravi
2015-07-14  0:14 ` [PATCH v5 11/15] x86/altp2m: define and implement alternate p2m HVMOP types Ed White
2015-07-14 14:36   ` Jan Beulich
2015-07-16  9:02     ` Sahita, Ravi
2015-07-16  9:09       ` Jan Beulich
2015-07-14  0:15 ` [PATCH v5 12/15] x86/altp2m: Add altp2mhvm HVM domain parameter Ed White
2015-07-14  0:15 ` [PATCH v5 13/15] x86/altp2m: XSM hooks for altp2m HVM ops Ed White
2015-07-14  0:15 ` [PATCH v5 14/15] tools/libxc: add support to altp2m hvmops Ed White
2015-07-14  0:15 ` [PATCH v5 15/15] tools/xen-access: altp2m testcases Ed White
2015-07-14  9:56   ` Wei Liu
2015-07-14 11:52     ` Lengyel, Tamas

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=55A796B20200007800091C61@mail.emea.novell.com \
    --to=jbeulich@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=dgdegra@tycho.nsa.gov \
    --cc=edmund.h.white@intel.com \
    --cc=george.dunlap@eu.citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=ravi.sahita@intel.com \
    --cc=tim@xen.org \
    --cc=tlengyel@novetta.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).