All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ed White <edmund.h.white@intel.com>
To: Andrew Cooper <andrew.cooper3@citrix.com>, xen-devel@lists.xen.org
Cc: keir@xen.org, ian.campbell@citrix.com, tim@xen.org,
	ian.jackson@eu.citrix.com, jbeulich@suse.com,
	Tamas K Lengyel <tamas.lengyel@zentific.com>
Subject: Re: [PATCH 00/11] Alternate p2m: support multiple copies of host p2m
Date: Tue, 13 Jan 2015 13:30:56 -0800	[thread overview]
Message-ID: <54B58E90.20309@intel.com> (raw)
In-Reply-To: <54B583FC.4060800@citrix.com>

On 01/13/2015 12:45 PM, Andrew Cooper wrote:
> On 13/01/15 20:02, Ed White wrote:
>> On 01/13/2015 11:01 AM, Andrew Cooper wrote:
>>> On 09/01/15 21:26, Ed White wrote:
>>>> This set of patches adds support to hvm domains for EPTP switching by creating
>>>> multiple copies of the host p2m (currently limited to 10 copies).
>>>>
>>>> The primary use of this capability is expected to be in scenarios where access
>>>> to memory needs to be monitored and/or restricted below the level at which the
>>>> guest OS page tables operate. Two examples that were discussed at the 2014 Xen
>>>> developer summit are:
>>>>
>>>>     VM introspection: 
>>>>         http://www.slideshare.net/xen_com_mgr/
>>>>         zero-footprint-guest-memory-introspection-from-xen
>>>>
>>>>     Secure inter-VM communication:
>>>>         http://www.slideshare.net/xen_com_mgr/nakajima-nvf
>>>>
>>>> Each p2m copy is populated lazily on EPT violations, and only contains entries for
>>>> ram p2m types. Permissions for pages in alternate p2m's can be changed in a similar
>>>> way to the existing memory access interface, and gfn->mfn mappings can be changed.
>>>>
>>>> All this is done through extra HVMOP types.
>>>>
>>>> The cross-domain HVMOP code has been compile-tested only. Also, the cross-domain
>>>> code is hypervisor-only, the toolstack has not been modified.
>>>>
>>>> The intra-domain code has been tested. Violation notifications can only be received
>>>> for pages that have been modified (access permissions and/or gfn->mfn mapping) 
>>>> intra-domain, and only on VCPU's that have enabled notification.
>>>>
>>>> VMFUNC and #VE will both be emulated on hardware without native support.
>>>>
>>>> This code is not compatible with nested hvm functionality and will refuse to work
>>>> with nested hvm active. It is also not compatible with migration. It should be
>>>> considered experimental.
>>> Having reviewed most of the series, I believe I now have a feeling for
>>> what you are trying to achieve, but I would like to discuss some of the
>>> design implications.
>>>
>>> The following is my understanding of the situation.  Please correct me
>>> if I have made a mistake.
>>>
>>>
>> Thanks for investing the time to do this. Maybe this first couple of days
>> would have gone more smoothly if something like this was in the cover letter.
> 
> No problem.  (I tend to find that things like this save time in the long
> run)
> 
>>
>> With the exception of a couple of minor points, you are spot on.
> 
> Cool!
> 
>>
>>> Currently, a domain has a single host p2m.  This contains the guest
>>> physical address mappings, and a combination of p2m types which are used
>>> by existing components to allow certain actions to happen.  All vcpus
>>> run with the same host p2m.
>>>
>>> A domain may have a number of nested p2ms (currently an arbitrary limit
>>> of 10).  These are used for nested-virt and are translated by the host
>>> p2m.  Vcpus in guest mode run under a nested p2m.
>>>
>>> This new altp2m infrastructure adds the ability to use a different set
>>> of tables in the place of the host p2m.  This, in practice, allows for
>>> different translations, different p2m types, different access permissions. 
>>>
>>> One usecase of alternate p2ms is to provide introspection information to
>>> out-of-guest entities (via the mem_event interface) or to in-guest
>>> entities (via #VE).
>>>
>>>
>>> Now for some observations and assumptions.
>>>
>>> It occurs to me that the altp2m mechanism is generic.  From the look of
>>> the series, it is mostly implemented in a generic way, which is great. 
>>> The only Intel specific bits appear to be the ept handling itself,
>>> 'vmfunc' instruction support and #VE injection to in-guest entities. 
>>>
>> That was my intention. I don't know enough about the state of AMD
>> virtualization to know if it can support these patches by emulating
>> vmfunc and #VE, but that was my target.
> 
> As far as I am aware, AMD SVM has no similar concept to vmfunc, nor
> #VE.  However, the same kinds of introspection are certainly possible by
> playing with the read/write bits on the NPT tables and causing a vmexit.
> 
>>
>>> I can't think of any reasonable case where the alternate p2m would want
>>> mappings different to the host p2m.  That is to say, an altp2m will map
>>> the same set of mfns to make a guest physical address space, but may
>>> differ in page permissions and possibly p2m types.
>>>
>> The set of mfn's is the same, but I do allow gfn->mfn mappings to be
>> modified under certain circumstances. One use of this is to point the
>> same VA to different physical pages (with different access permissions)
>> in different p2m's to hide memory changes.
> 
> What is the practical use of being able to play paging tricks like this
> behind a VMs back?
> 

I'm restricted in how much detail I can go into on a public mailing list,
but imagine that you want a data read to see one thing and an instruction
fetch to see something else.

If you need more than that we'll have to go off-list, and even then I'll
have to check what I can say.

Ed

>>
>>> Given the above restriction, I believe a lot of the existing features
>>> can continue to work and coexist.  For generating mem_events, the
>>> permissions can be altered in the altp2m.  For injecting #VE, the altp2m
>>> type can change to the new p2m_ram_rw, so long as the host p2m type is
>>> compatible.  For both, a vmexit can occur.  Xen can do the appropriate
>>> action and also inject a #VE on its way back into the guest.
>>>
>>> One thing I have noticed while looking at the #VE stuff that EPT also
>>> supports A/D tracking, which might be quite a nice optimisation and
>>> forgo the need for p2m_ram_logdirty, but I think this should be treated
>>> as an orthogonal item.
>>>
>> This is far from my area of expertise, but I believe there is code in Xen
>> to use EPT D bits in migration.
> 
> Not that I can spot, although I seem to remember some talk about it. All
> logdirty code still appears to relies on the logdirty bitmap being
> filled, which is done from vmexits for p2m_ram_logdirty regions.
> 
> ~Andrew
> 
>>
>> Ed
>>
>>> When shared ept/iommu is not in use, altp2m can safely be used by vcpus,
>>> as this will not interfere with the IOMMU permissions.
>>>
>>> Furthermore, I can't conceptually think of an issue against the idea of
>>> nestedp2m alternatives, following the same rule that the mapped mfns
>>> match up.  That should allow all existing nestedvirt infrastructure
>>> continue to work.
>>>
>>> Does the above look sensible, or have I overlooked something?
>>>
>>> ~Andrew
>>>
> 
> 

  reply	other threads:[~2015-01-13 21:30 UTC|newest]

Thread overview: 135+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-09 21:26 [PATCH 00/11] Alternate p2m: support multiple copies of host p2m Ed White
2015-01-09 21:26 ` [PATCH 01/11] VMX: VMFUNC and #VE definitions and detection Ed White
2015-01-12 13:06   ` Andrew Cooper
2015-01-13 18:50     ` Ed White
2015-01-14 14:38       ` Andrew Cooper
2015-01-09 21:26 ` [PATCH 02/11] VMX: implement suppress #VE Ed White
2015-01-12 16:43   ` Andrew Cooper
2015-01-12 17:45     ` Ed White
2015-01-13 18:36       ` Ed White
2015-01-15 16:25   ` Tim Deegan
2015-01-15 18:46     ` Ed White
2015-01-16 17:22       ` Tim Deegan
2015-03-25 17:30       ` Ed White
2015-03-26 10:15         ` Tim Deegan
2015-01-09 21:26 ` [PATCH 03/11] x86/HVM: Hardware alternate p2m support detection Ed White
2015-01-12 17:08   ` Andrew Cooper
2015-01-12 17:46     ` Ed White
2015-01-15 16:32   ` Tim Deegan
2015-01-09 21:26 ` [PATCH 04/11] x86/MM: Improve p2m type checks Ed White
2015-01-12 17:48   ` Andrew Cooper
2015-01-13 19:39     ` Ed White
2015-01-15 16:36   ` Tim Deegan
2015-01-09 21:26 ` [PATCH 05/11] x86/altp2m: basic data structures and support routines Ed White
2015-01-13 11:28   ` Andrew Cooper
2015-01-13 19:49     ` Ed White
2015-03-25 20:59       ` Ed White
2015-03-26 10:48         ` Tim Deegan
2015-03-26 18:00           ` Ed White
2015-01-15 16:48   ` Tim Deegan
2015-01-15 16:53     ` Jan Beulich
2015-01-15 18:49       ` Ed White
2015-01-16  7:37         ` Jan Beulich
2015-01-16 17:23         ` Tim Deegan
2015-01-09 21:26 ` [PATCH 06/11] VMX/altp2m: add code to support EPTP switching and #VE Ed White
2015-01-13 11:58   ` Andrew Cooper
2015-01-15 16:56   ` Tim Deegan
2015-01-15 18:55     ` Ed White
2015-01-16 17:50       ` Tim Deegan
2015-01-16 17:57         ` Ed White
2015-01-09 21:26 ` [PATCH 07/11] x86/altp2m: introduce p2m_ram_rw_ve type Ed White
2015-01-15 17:03   ` Tim Deegan
2015-01-15 20:38     ` Ed White
2015-01-16  8:20       ` Jan Beulich
2015-01-16 17:14         ` Ed White
2015-01-19  8:49           ` Jan Beulich
2015-01-19 19:53             ` Ed White
2015-01-16 17:52       ` Tim Deegan
2015-01-16 18:35         ` Ed White
2015-01-17  9:37           ` Tim Deegan
2015-01-09 21:26 ` [PATCH 08/11] x86/altp2m: add remaining support routines Ed White
2015-01-15 17:25   ` Tim Deegan
2015-01-15 20:57     ` Ed White
2015-01-16 18:04       ` Tim Deegan
2015-01-15 17:33   ` Tim Deegan
2015-01-15 21:00     ` Ed White
2015-01-16  8:24       ` Jan Beulich
2015-01-16 17:17         ` Ed White
2015-01-19  8:52           ` Jan Beulich
2015-01-16 18:09       ` Tim Deegan
2015-01-09 21:26 ` [PATCH 09/11] x86/altp2m: define and implement alternate p2m HVMOP types Ed White
2015-01-15 17:09   ` Tim Deegan
2015-01-15 20:43     ` Ed White
2015-01-16 17:57       ` Tim Deegan
2015-01-09 21:26 ` [PATCH 10/11] x86/altp2m: fix log-dirty handling Ed White
2015-01-15 17:20   ` Tim Deegan
2015-01-15 20:49     ` Ed White
2015-01-16 17:59       ` Tim Deegan
2015-01-09 21:26 ` [PATCH 11/11] x86/altp2m: alternate p2m memory events Ed White
2015-01-09 22:06 ` [PATCH 00/11] Alternate p2m: support multiple copies of host p2m Andrew Cooper
2015-01-09 22:21   ` Ed White
2015-01-09 22:41     ` Andrew Cooper
2015-01-09 23:04       ` Ed White
2015-01-12 10:00         ` Jan Beulich
2015-01-12 17:36           ` Ed White
2015-01-13  8:56             ` Jan Beulich
2015-01-13 11:28               ` Ian Jackson
2015-01-13 17:42               ` Ed White
2015-01-12 12:17 ` Ian Jackson
2015-01-12 17:39   ` Ed White
2015-01-12 17:43     ` Ian Jackson
2015-01-12 17:50       ` Ed White
2015-01-12 18:00         ` Ian Jackson
2015-01-12 18:31           ` Ed White
2015-01-13 10:21             ` Tamas K Lengyel
2015-01-13 18:25               ` Ed White
2015-01-13 11:16             ` Ian Jackson
2015-01-12 17:51       ` Andrew Cooper
2015-01-13 19:01 ` Andrew Cooper
2015-01-13 20:02   ` Ed White
2015-01-13 20:45     ` Andrew Cooper
2015-01-13 21:30       ` Ed White [this message]
2015-01-14  7:04         ` Jan Beulich
2015-01-14 10:31           ` Tamas K Lengyel
2015-01-14 11:09             ` Jan Beulich
2015-01-14 11:28               ` Tamas K Lengyel
2015-01-14 17:35                 ` Ed White
2015-01-15  8:16                   ` Jan Beulich
2015-01-15 17:28                     ` Ed White
2015-01-15 17:45                       ` Tim Deegan
2015-01-15 18:44                         ` Ed White
2015-03-04 23:06                           ` Tamas K Lengyel
2015-03-04 23:41                             ` Ed White
2015-03-05 10:51                               ` Tamas K Lengyel
2015-03-13 17:38                                 ` Ed White
2015-03-05 10:36                             ` Tim Deegan
2015-03-05 10:58                               ` Tamas K Lengyel
2015-03-05 11:13                                 ` Tim Deegan
2015-01-16  7:35                       ` Jan Beulich
2015-01-16 16:54                         ` Ed White
2015-01-15 10:39                   ` Tamas K Lengyel
2015-01-15 17:31                     ` Ed White
2015-01-16 10:43                       ` Tamas K Lengyel
2015-01-16 17:21                         ` Ed White
2015-03-05 13:45       ` Egger, Christoph
2015-01-14  7:01     ` Jan Beulich
2015-01-15 16:15 ` Tim Deegan
2015-01-15 18:23   ` Ed White
2015-01-16  8:12     ` Jan Beulich
2015-01-16 17:01       ` Ed White
2015-01-16 18:33     ` Tim Deegan
2015-01-16 20:32       ` Ed White
2015-01-17  9:34         ` Tim Deegan
2015-01-16 21:43       ` Ed White
2015-01-17  9:49         ` Tim Deegan
2015-01-19 19:35           ` Ed White
2015-01-17  9:31       ` Tim Deegan
2015-01-17 15:01         ` Andrew Cooper
2015-01-19 12:17           ` Tim Deegan
2015-01-19 21:54             ` Ed White
2015-01-20  8:47               ` Jan Beulich
2015-01-20 18:43                 ` Ed White
2015-01-22 15:42               ` Tim Deegan
2015-01-22 19:15                 ` Ed White
2015-03-25 17:41     ` Ed White
2015-03-26 10:40       ` Tim Deegan

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=54B58E90.20309@intel.com \
    --to=edmund.h.white@intel.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=keir@xen.org \
    --cc=tamas.lengyel@zentific.com \
    --cc=tim@xen.org \
    --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.