[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] x86/altp2m: Add a subop for obtaining the mem access of a page



On Fri, Jun 29, 2018 at 09:38:58AM -0600, Jan Beulich wrote:
> >>> On 28.06.18 at 15:00, <apop@xxxxxxxxxxxxxxx> wrote:
> > @@ -4666,6 +4667,23 @@ static int do_altp2m_op(
> >          }
> >          break;
> >  
> > +    case HVMOP_altp2m_get_mem_access:
> > +        if ( a.u.mem_access.pad )
> > +            rc = -EINVAL;
> > +        else
> > +        {
> > +            xenmem_access_t access;
> > +
> > +            rc = p2m_get_mem_access(d, _gfn(a.u.mem_access.gfn), &access,
> > +                                    a.u.mem_access.view);
> > +            if ( !rc )
> > +            {
> > +                a.u.mem_access.hvmmem_access = access;
> > +                rc = __copy_to_guest(arg, &a, 1) ? -EFAULT : 0;
> 
> __copy_field_to_guest()? Or wait, no, the function argument is still a
> handle of void.

I'll then leave the __copy_to_guest() in place as it is for now.

> And then - here we are again: Is it reasonable to permit a domain inquiring
> for itself?

Yes, this is a questionable aspect of altp2m that warrants further
discussion.  I'll resend a version with the other problems addressed to
have them out of the way.

> > --- a/xen/arch/x86/mm/mem_access.c
> > +++ b/xen/arch/x86/mm/mem_access.c
> > @@ -32,17 +32,10 @@
> >  
> >  #include "mm-locks.h"
> >  
> > -/*
> > - * Get access type for a gfn.
> > - * If gfn == INVALID_GFN, gets the default access type.
> > - */
> > -static int _p2m_get_mem_access(struct p2m_domain *p2m, gfn_t gfn,
> > -                               xenmem_access_t *access)
> > +static int p2m_access_to_xenmem_access(struct p2m_domain *p2m,
> 
> This is not even p2m code - why the p2m_ prefix?

There's indeed no reason for this to have the p2m_ prefix.  Will remove
it.

> > @@ -458,11 +462,41 @@ long p2m_set_mem_access_multi(struct domain *d,
> >      return rc;
> >  }
> >  
> > -int p2m_get_mem_access(struct domain *d, gfn_t gfn, xenmem_access_t 
> > *access)
> > +int p2m_get_mem_access(struct domain *d, gfn_t gfn, xenmem_access_t 
> > *access,
> > +                       unsigned int altp2m_idx)
> >  {
> > -    struct p2m_domain *p2m = p2m_get_hostp2m(d);
> > +    struct p2m_domain *host_p2m = p2m_get_hostp2m(d);
> > +    struct p2m_domain *ap2m = NULL;
> > +    struct p2m_domain *p2m;
> > +    p2m_access_t a;
> > +    p2m_type_t t;
> > +    mfn_t mfn;
> > +
> > +    if ( altp2m_idx )
> > +    {
> > +        if ( altp2m_idx >= MAX_ALTP2M ||
> > +             d->arch.altp2m_eptp[altp2m_idx] == mfn_x(INVALID_MFN) )
> > +            return -EINVAL;
> > +
> > +        p2m = ap2m = d->arch.altp2m_p2m[altp2m_idx];
> > +    }
> > +    else
> > +        p2m = host_p2m;
> > +
> > +    p2m_read_lock(host_p2m);
> > +    if (ap2m)
> 
> Missing blanks (also below).

All right.

> > +        p2m_read_lock(ap2m);
> > +
> > +    mfn = p2m->get_entry(p2m, gfn, &t, &a, 0, NULL, NULL);
> > +
> > +    if (ap2m)
> > +        p2m_read_unlock(ap2m);
> > +    p2m_read_unlock(host_p2m);
> > +
> > +    if ( mfn_eq(mfn, INVALID_MFN) )
> > +        return -ESRCH;
> >  
> > -    return _p2m_get_mem_access(p2m, gfn, access);
> > +    return p2m_access_to_xenmem_access(p2m, a, access);
> 
> I'm confused: Why does p2m_get_mem_access() not use its helper
> function p2m_get_mem_access() (which you retain) anymore? I
> guess the description is a little too terse. It might also have helped
> if some of the mechanical preparation steps were broken out.

Ok, I'll fix this and attempt to provide more information with the
commit message.

Thank you!

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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.