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

Re: [Xen-devel] [PATCH v3 1/3] x86/mm: Introduce altp2m_get_gfn_type_access



On 09.04.2019 18:26, Tamas K Lengyel wrote:
> On Tue, Apr 9, 2019 at 8:48 AM Alexandru Stefan ISAILA
> <aisaila@xxxxxxxxxxxxxxx> wrote:
>>
>>
>>
>> On 09.04.2019 17:37, Tamas K Lengyel wrote:
>>> On Tue, Apr 9, 2019 at 8:03 AM Alexandru Stefan ISAILA
>>> <aisaila@xxxxxxxxxxxxxxx> wrote:
>>>>
>>>>
>>>>
>>>> On 09.04.2019 16:48, Tamas K Lengyel wrote:
>>>>> On Tue, Apr 9, 2019 at 6:04 AM Alexandru Stefan ISAILA
>>>>> <aisaila@xxxxxxxxxxxxxxx> wrote:
>>>>>>
>>>>>> This patch moves common code from p2m_set_altp2m_mem_access() and
>>>>>> p2m_change_altp2m_gfn() into one function
>>>>>>
>>>>>> Signed-off-by: Alexandru Isaila <aisaila@xxxxxxxxxxxxxxx>
>>>>>>
>>>>>> ---
>>>>>> Changes since V2:
>>>>>>            - Change var name from found_in_hostp2m to copied_from_hostp2m
>>>>>>            - Move the type check from altp2m_get_gfn_type_access() to the
>>>>>>            callers.
>>>>>> ---
>>>>>>     xen/arch/x86/mm/mem_access.c | 32 ++++++++++++----------------
>>>>>>     xen/arch/x86/mm/p2m.c        | 41 
>>>>>> ++++++++++++++----------------------
>>>>>>     xen/include/asm-x86/p2m.h    | 19 +++++++++++++++++
>>>>>>     3 files changed, 49 insertions(+), 43 deletions(-)
>>>>>>
>>>>>> diff --git a/xen/arch/x86/mm/mem_access.c b/xen/arch/x86/mm/mem_access.c
>>>>>> index 56c06a4fc6..bf67ddb15a 100644
>>>>>> --- a/xen/arch/x86/mm/mem_access.c
>>>>>> +++ b/xen/arch/x86/mm/mem_access.c
>>>>>> @@ -265,31 +265,27 @@ int p2m_set_altp2m_mem_access(struct domain *d, 
>>>>>> struct p2m_domain *hp2m,
>>>>>>         unsigned int page_order;
>>>>>>         unsigned long gfn_l = gfn_x(gfn);
>>>>>>         int rc;
>>>>>> +    bool copied_from_hostp2m;
>>>>>>
>>>>>> -    mfn = ap2m->get_entry(ap2m, gfn, &t, &old_a, 0, NULL, NULL);
>>>>>> +    mfn = altp2m_get_gfn_type_access(ap2m, gfn, &t, &old_a, 
>>>>>> &page_order, &copied_from_hostp2m);
>>>>>>
>>>>>> -    /* Check host p2m if no valid entry in alternate */
>>>>>>         if ( !mfn_valid(mfn) )
>>>>>> +        return -ESRCH;
>>>>>> +
>>>>>> +    /* If this is a superpage, copy that first */
>>>>>> +    if ( page_order != PAGE_ORDER_4K && copied_from_hostp2m )

Regarding the drop of copied_from_hostp2m should this be dropped here as 
well and by that drop it all together?

>>>>>>         {
>>>>>> +        unsigned long mask = ~((1UL << page_order) - 1);
>>>>>> +        gfn_t gfn2 = _gfn(gfn_l & mask);
>>>>>> +        mfn_t mfn2 = _mfn(mfn_x(mfn) & mask);
>>>>>>
>>>>>> -        mfn = __get_gfn_type_access(hp2m, gfn_l, &t, &old_a,
>>>>>> -                                    P2M_ALLOC | P2M_UNSHARE, 
>>>>>> &page_order, 0);
>>>>>> +        /* Note: currently it is not safe to remap to a shared entry */
>>>>>> +        if ( t != p2m_ram_rw )
>>>>>> +            return -ESRCH;

And if so and regarding the comments from p2m_change_altp2m_gfn should I 
move the ( t != p2m_ram_rw ) check up with the ( !mfn_valid(mfn) ) check?

Alex

>>>>>>
>>>>>> -        rc = -ESRCH;
>>>>>> -        if ( !mfn_valid(mfn) || t != p2m_ram_rw )
>>>>>> +        rc = ap2m->set_entry(ap2m, gfn2, mfn2, page_order, t, old_a, 1);
>>>>>> +        if ( rc )
>>>>>>                 return rc;
>>>>>> -
>>>>>> -        /* If this is a superpage, copy that first */
>>>>>> -        if ( page_order != PAGE_ORDER_4K )
>>>>>> -        {
>>>>>> -            unsigned long mask = ~((1UL << page_order) - 1);
>>>>>> -            gfn_t gfn2 = _gfn(gfn_l & mask);
>>>>>> -            mfn_t mfn2 = _mfn(mfn_x(mfn) & mask);
>>>>>> -
>>>>>> -            rc = ap2m->set_entry(ap2m, gfn2, mfn2, page_order, t, 
>>>>>> old_a, 1);
>>>>>> -            if ( rc )
>>>>>> -                return rc;
>>>>>> -        }
>>>>>>         }
>>>>>>
>>>>>>         /*
>>>>>> diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
>>>>>> index b9bbb8f485..d38d7c29ca 100644
>>>>>> --- a/xen/arch/x86/mm/p2m.c
>>>>>> +++ b/xen/arch/x86/mm/p2m.c
>>>>>> @@ -2626,6 +2626,7 @@ int p2m_change_altp2m_gfn(struct domain *d, 
>>>>>> unsigned int idx,
>>>>>>         mfn_t mfn;
>>>>>>         unsigned int page_order;
>>>>>>         int rc = -EINVAL;
>>>>>> +    bool copied_from_hostp2m;
>>>>>>
>>>>>>         if ( idx >= MAX_ALTP2M || d->arch.altp2m_eptp[idx] == 
>>>>>> mfn_x(INVALID_MFN) )
>>>>>>             return rc;
>>>>>> @@ -2636,7 +2637,7 @@ int p2m_change_altp2m_gfn(struct domain *d, 
>>>>>> unsigned int idx,
>>>>>>         p2m_lock(hp2m);
>>>>>>         p2m_lock(ap2m);
>>>>>>
>>>>>> -    mfn = ap2m->get_entry(ap2m, old_gfn, &t, &a, 0, NULL, NULL);
>>>>>> +    mfn = altp2m_get_gfn_type_access(ap2m, old_gfn, &t, &a, 
>>>>>> &page_order, &copied_from_hostp2m);
>>>>>>
>>>>>>         if ( gfn_eq(new_gfn, INVALID_GFN) )
>>>>>>         {
>>>>>> @@ -2646,37 +2647,27 @@ int p2m_change_altp2m_gfn(struct domain *d, 
>>>>>> unsigned int idx,
>>>>>>             goto out;
>>>>>>         }
>>>>>>
>>>>>> -    /* Check host p2m if no valid entry in alternate */
>>>>>> -    if ( !mfn_valid(mfn) )
>>>>>> -    {
>>>>>> -        mfn = __get_gfn_type_access(hp2m, gfn_x(old_gfn), &t, &a,
>>>>>> -                                    P2M_ALLOC, &page_order, 0);
>>>>>> +    if ( !mfn_valid(mfn) || (t != p2m_ram_rw && copied_from_hostp2m) )
>>>>>
>>>>> Is this check correct? Why do you want to get out only when type is
>>>>> non-rw *and* it's copied from the hostp2m? You could have non-rw
>>>>> entries like mmio in the altp2m that were lazily copied and I don't
>>>>> think we want to allow remapping to those either.
>>>>
>>>> I just copied the functionality. If this is needed I will add a || t !=
>>>> p2m_mmio_dm and p2m_mmio_direct.
>>>
>>> My problem is with the && copied_form_hostp2m part. Why is that a criteria?
>>
>> The (t != p2m_ram_rw) check was done only for the get from hostp2m.
>>
>> If you think that I should do the check for all mfns (hostp2 and altp2m)
>> then I can drop the copied_from_hostp2m bool and add mmio check.
> 
> I think you should just drop the && copied_from_hostp2m part of it.
> Remappings should only be allowed for p2m_ram_rw type, no matter which
> p2m its coming from.
> 

_______________________________________________
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®.