|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 7/8] x86/mm: handle foreign mappings in p2m_entry_modify
On 2/18/19 11:05 AM, Roger Pau Monné wrote:
> On Fri, Feb 15, 2019 at 07:15:53PM +0100, George Dunlap wrote:
>>
>>
>>> On Feb 15, 2019, at 2:18 PM, Roger Pau Monne <roger.pau@xxxxxxxxxx> wrote:
>>>
>>> So that the specific handling can be removed from
>>> atomic_write_ept_entry and be shared with npt and shadow code.
>>>
>>> This commit also removes the check that prevent non-ept PVH dom0 from
>>> mapping foreign pages.
>>>
>>> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
>>
>> Mostly looks good; just a few comments...
>>>
>>> diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
>>> index f4ec2becbd..1687b31571 100644
>>> --- a/xen/include/asm-x86/p2m.h
>>> +++ b/xen/include/asm-x86/p2m.h
>>> @@ -932,11 +932,14 @@ int p2m_set_ioreq_server(struct domain *d, unsigned
>>> int flags,
>>> struct hvm_ioreq_server *p2m_get_ioreq_server(struct domain *d,
>>> unsigned int *flags);
>>>
>>> -static inline void p2m_entry_modify(struct p2m_domain *p2m, p2m_type_t nt,
>>> - p2m_type_t ot, unsigned int level)
>>> +static inline int p2m_entry_modify(struct p2m_domain *p2m, p2m_type_t nt,
>>> + p2m_type_t ot, mfn_t nfn, mfn_t ofn,
>>> + unsigned int level)
>>> {
>>> - if ( level != 1 || nt == ot )
>>> - return;
>>> + BUG_ON(level > 1 && (nt == p2m_ioreq_server || nt == p2m_map_foreign));
>>> +
>>> + if ( level != 1 || (nt == ot && mfn_eq(nfn, ofn)) )
>>> + return 0;
>>>
>>> switch ( nt )
>>> {
>>> @@ -948,6 +951,14 @@ static inline void p2m_entry_modify(struct p2m_domain
>>> *p2m, p2m_type_t nt,
>>> p2m->ioreq.entry_count++;
>>> break;
>>>
>>> + case p2m_map_foreign:
>>> + BUG_ON(!mfn_valid(nfn));
>>
>> Since we’re going to be returning errors anyway, why not retain the original
>> functionality of returning -EINVAL in this case, rather than BUG_ON?
>
> Ack. I added the BUG_ON because trying to add a foreign entry with an
> invalid mfn means something else went wrong in the caller, since it
> should not be possible to perform such action. As you pointed out
> however there's no reason to panic, since an error can be returned to
> the caller.
>
> Would you be fine with also adding an ASSERT_UNREACHABLE before
> returning the error?
>
>>> +
>>> + if ( !page_get_owner_and_reference(mfn_to_page(nfn)) )
>>> + return -EBUSY;
>>> +
>>> + break;
>>> +
>>> default:
>>> break;
>>> }
>>> @@ -959,9 +970,16 @@ static inline void p2m_entry_modify(struct p2m_domain
>>> *p2m, p2m_type_t nt,
>>> p2m->ioreq.entry_count--;
>>> break;
>>>
>>> + case p2m_map_foreign:
>>> + BUG_ON(!mfn_valid(ofn));
>>
>> If somehow this happened, then the bug isn’t here but somewhere else;
>> continuing on won’t make things any worse than they would be if this page
>> weren’t removed. I think this should probably be an ASSERT() (to help
>> narrow down where a bug may have come from), followed by a simple return.
>> Likely the worst that would happen here is an un-killable domain; no need to
>> crash production servers in this case.
>
> Ack, I think what I suggested above should also be used here:
>
> if ( !mfn_valid(ofn) )
> {
> ASSERT_UNREACHABLE();
> return -EINVAL;
> }
Yes to both ASSERTs. If something has broken one of our assumptions,
the sooner we find it out (during development) the better.
Thanks,
-George
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |