On Thu, Jan 28, 2016 at 9:32 AM, Razvan Cojocaru <rcojoc...@bitdefender.com>
wrote:

> On 01/28/2016 05:58 PM, Lengyel, Tamas wrote:
> >
> >
> > On Thu, Jan 28, 2016 at 8:20 AM, Razvan Cojocaru
> > <rcojoc...@bitdefender.com <mailto:rcojoc...@bitdefender.com>> wrote:
> >
> >     On 01/28/2016 05:12 PM, Lengyel, Tamas wrote:
> >     >
> >     > On Jan 28, 2016 8:02 AM, "Razvan Cojocaru" <
> rcojoc...@bitdefender.com <mailto:rcojoc...@bitdefender.com>
> >     > <mailto:rcojoc...@bitdefender.com <mailto:
> rcojoc...@bitdefender.com>>> wrote:
> >     >>
> >     >> On 01/28/2016 04:42 PM, Lengyel, Tamas wrote:
> >     >> >
> >     >> > On Jan 28, 2016 6:38 AM, "Jan Beulich" <jbeul...@suse.com
> <mailto:jbeul...@suse.com>
> >     > <mailto:jbeul...@suse.com <mailto:jbeul...@suse.com>>
> >     >> > <mailto:jbeul...@suse.com <mailto:jbeul...@suse.com>
> >     <mailto:jbeul...@suse.com <mailto:jbeul...@suse.com>>>> wrote:
> >     >> >>
> >     >> >> >>> On 27.01.16 at 21:06, <tleng...@novetta.com <mailto:
> tleng...@novetta.com>
> >     > <mailto:tleng...@novetta.com <mailto:tleng...@novetta.com>>
> >     >> > <mailto:tleng...@novetta.com <mailto:tleng...@novetta.com>
> >     <mailto:tleng...@novetta.com <mailto:tleng...@novetta.com>>>> wrote:
> >     >> >> > --- a/xen/arch/x86/mm/p2m.c
> >     >> >> > +++ b/xen/arch/x86/mm/p2m.c
> >     >> >> > @@ -1572,7 +1572,9 @@ void
> p2m_mem_access_emulate_check(struct
> >     > vcpu *v,
> >     >> >> >          bool_t violation = 1;
> >     >> >> >          const struct vm_event_mem_access *data =
> >     &rsp->u.mem_access;
> >     >> >> >
> >     >> >> > -        if ( p2m_get_mem_access(v->domain, _gfn(data->gfn),
> >     >> > &access) == 0 )
> >     >> >> > +        if ( p2m_get_mem_access(v->domain, _gfn(data->gfn),
> >     >> >> > +                                altp2m_active(v->domain) ?
> >     >> > vcpu_altp2m(v).p2midx : 0,
> >     >> >> > +                                &access) == 0 )
> >     >> >>
> >     >> >> This looks to be a behavioral change beyond what title and
> >     >> >> description say, and it's not clear whether that's actually the
> >     >> >> behavior everyone wants.
> >     >> >
> >     >> > I'm fairly comfident its exactly the expected behavior when one
> >     uses
> >     >> > mem_access in altp2m tables and emulation. Right now because
> >     the lack of
> >     >> > this AFAIK emulation would not work correctly with altp2m. But
> >     Razvan
> >     >> > probably can chime in as he uses this path actively.
> >     >>
> >     >> I've done an experiment to see how much slower using altp2m would
> >     be as
> >     >> compared to emulation - so I'm not a big user of the feature, but
> >     I did
> >     >> find it cumbersome to have to work with two sets of APIs (one for
> >     what
> >     >> could arguably be called the default altp2m view, i.e. the regular
> >     >> xc_set_mem_access(), and one for altp2m, i.e.
> >     >> xc_altp2m_set_mem_access()). Furthermore, the APIs do not
> currently
> >     >> offer the same features (most notably, xc_altp2m_get_mem_access()
> is
> >     >> completely missing). I've mentioned this to Tamas while initially
> >     trying
> >     >> to get it to work.
> >     >>
> >     >> Now, whether the behaviour I expect is what everyone expects is,
> of
> >     >> course, wide open to debate. But I think we can all agree that the
> >     >> altp2m interface can, and probably should, be improved.
> >     >>
> >     >
> >     > There is that, but also, what is the exact logic behind doing this
> >     check
> >     > before emulation? AFAIU emulation happens in response to a
> vm_event so
> >     > we should be fairly certain that this check succeeds as it just
> >     verifies
> >     > that indeed the permissions are restricted by mem_access in the
> >     p2m (and
> >     > with altp2m this should be the active one). But when is this check
> >     > normally expected to fail?
> >
> >     That check is important, please do not remove it. A vm_event is sent
> >     into userspace to our monitoring application, but the monitoring
> >     application can actually remove the page restrictions before
> replying,
> >     so in that case emulation is pointless - there will be no more page
> >     faults for that instruction.
> >
> >
> > I see, but then why would you reply with VM_EVENT_FLAG_EMULATE? You know
> > you removed the permission before sending the reply, so this sounds like
> > something specific to your application.
>
> It's cheap insurance that things go right. If there's some issue with
> page rights, or some external tool somehow does an xc_set_mem_access(),
> things won't go wrong.


I can see this working for your application if you don't cache the
mem_access permissions locally and you don't want to query for it before
deciding to send the emulate flag in the response or not. Although, I think
that would be the best way to go here.


> And they will go wrong if Xen thinks it should
> emulate the next instruction and the next instruction is not the one
> that has caused the original fault.


How could that happen? When the vCPU is resumed after the fault, isn't the
same instruction guaranteed to be retried?


> I would think that benefits any
> application.
>

It's just a bit of an obscure exception. From an API perspective I would
rather have Xen do what I tell it to do - in this case emulate - rather
then it doing something else silently behind the scenes that you really
only find out about if you read the code.

Tamas
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

Reply via email to