On 09/28/2018 05:19 PM, Razvan Cojocaru wrote:
> On 9/28/18 6:55 PM, Jan Beulich wrote:
>>>>> On 28.09.18 at 17:25, <rcojoc...@bitdefender.com> wrote:
>>> On 9/28/18 5:52 PM, Jan Beulich wrote:
>>>>>>> On 28.09.18 at 13:55, <rcojoc...@bitdefender.com> wrote:
>>>>> @@ -1218,34 +1219,67 @@ static void ept_tlb_flush(struct p2m_domain *p2m)
>>>>>      ept_sync_domain_mask(p2m, p2m->domain->dirty_cpumask);
>>>>>  }
>>>>>  
>>>>> +static void ept_set_ad_sync(struct p2m_domain *p2m, int value)
>>>>> +{
>>>>> +    struct domain *d = p2m->domain;
>>>>> +    unsigned int i;
>>>>> +
>>>>> +    if ( likely(!altp2m_active(d)) )
>>>>> +    {
>>>>> +        p2m_lock(p2m);
>>>>> +        p2m->ept.ad = value;
>>>>> +        p2m_unlock(p2m);
>>>>> +
>>>>> +        return;
>>>>> +    }
>>>>
>>>> Why would you want to skip updating the host p2m's flag when
>>>> altp2m is active?
>>>
>>> It's not really skipped if I understand the altp2m code correctly: in
>>> that case the hostp2m is d->arch.altp2m_p2m[0], which is take care of in
>>> the loop below the code you've quoted.
>>
>> p2m_init_altp2m() (and other code in p2m.c) suggests otherwise to me.
> 
> That's interesting, p2m_set_mem_access() is treating altp2m index 0 as
> the hostp2m:
> 
> 360 /*
> 361  * Set access type for a region of gfns.
> 362  * If gfn == INVALID_GFN, sets the default access type.
> 363  */
> 364 long p2m_set_mem_access(struct domain *d, gfn_t gfn, uint32_t nr,
> 365                         uint32_t start, uint32_t mask,
> xenmem_access_t access,
> 366                         unsigned int altp2m_idx)
> 367 {
> 368     struct p2m_domain *p2m = p2m_get_hostp2m(d), *ap2m = NULL;
> 369     p2m_access_t a;
> 370     unsigned long gfn_l;
> 371     long rc = 0;
> 372
> 373     /* altp2m view 0 is treated as the hostp2m */
> 374 #ifdef CONFIG_HVM
> 375     if ( altp2m_idx )
> 376     {
> 377         if ( altp2m_idx >= MAX_ALTP2M ||
> 378              d->arch.altp2m_eptp[altp2m_idx] == mfn_x(INVALID_MFN) )
> 379             return -EINVAL;
> 380
> 381         ap2m = d->arch.altp2m_p2m[altp2m_idx];
> 382     }
> 383 #else
> 384     ASSERT(!altp2m_idx);
> 385 #endif
> 
> which would seem to imply that either we should be able to treat
> d->arch.altp2m_p2m[0] and hostp2m interchangeably, or we are currently
> wasting an altp2m array slot.

Yes, ISTR that altp2m_idx 0 was specifically meant to be the host p2m
(unmodified).  But there seems to be some confusion over that -- this
seems to say it needs to be "manually" interpreted; some of the
mem_access code seems to think that it can just grab
d->arch.altp2m_p2m[0] and that will affect the hostp2m.  And as you say,
if we do the "manual interpretation", then we're allocating an extra p2m
in slot 0 that we're not using.

 -George

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

Reply via email to