|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 17/20] arch/x86: use XSM hooks for get_pg_owner access checks
>>> On 11.09.12 at 16:33, Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> wrote:
> On 09/11/2012 10:16 AM, Jan Beulich wrote:
>>>>> On 11.09.12 at 15:40, Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> wrote:
>>> On 09/11/2012 03:55 AM, Jan Beulich wrote:
>>>>>>> On 10.09.12 at 21:49, Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> wrote:
>>>>> --- a/xen/arch/x86/mm.c
>>>>> +++ b/xen/arch/x86/mm.c
>>>>> @@ -2882,11 +2882,6 @@ static struct domain *get_pg_owner(domid_t domid)
>>>>> pg_owner = rcu_lock_domain(dom_io);
>>>>> break;
>>>>> case DOMID_XEN:
>>>>> - if ( !IS_PRIV(curr) )
>>>>> - {
>>>>> - MEM_LOG("Cannot set foreign dom");
>>>>> - break;
>>>>> - }
>>>>> pg_owner = rcu_lock_domain(dom_xen);
>>>>> break;
>>>>> default:
>>>>> @@ -2895,12 +2890,6 @@ static struct domain *get_pg_owner(domid_t domid)
>>>>> MEM_LOG("Unknown domain '%u'", domid);
>>>>> break;
>>>>> }
>>>>> - if ( !IS_PRIV_FOR(curr, pg_owner) )
>>>>> - {
>>>>> - MEM_LOG("Cannot set foreign dom");
>>>>> - rcu_unlock_domain(pg_owner);
>>>>> - pg_owner = NULL;
>>>>> - }
>>>>> break;
>>>>> }
>>>>>
>>>>> @@ -3008,6 +2997,13 @@ long do_mmuext_op(
>>>>> goto out;
>>>>> }
>>>>>
>>>>> + rc = xsm_mmuext_op(d, pg_owner);
>>>>> + if ( rc )
>>>>> + {
>>>>> + rcu_unlock_domain(pg_owner);
>>>>> + goto out;
>>>>> + }
>>>>> +
>>>>
>>>> While this part is fine, ...
>>>>
>>>>> for ( i = 0; i < count; i++ )
>>>>> {
>>>>> if ( hypercall_preempt_check() )
>>>>> @@ -3483,11 +3479,6 @@ long do_mmu_update(
>>>>> rc = -EINVAL;
>>>>> goto out;
>>>>> }
>>>>> - if ( !IS_PRIV_FOR(d, pt_owner) )
>>>>> - {
>>>>> - rc = -ESRCH;
>>>>> - goto out;
>>>>> - }
>>>>
>>>> ... this one isn't (at least in conjunction with them all becoming
>>>> indirect calls unconditionally) - you replace a single validation per
>>>> set of requests with one validation per request.
>>>
>>> Is it still a problem if the check is inlined? If so, I could add an
>>> additional XSM hook where the old IS_PRIV check was done, and make the
>>> check inside the loop an inlined noop in the XSM-disabled case.
>>
>> It's not a problem for the inlined case I would say, but I do
>> think that performance here matters even if XSM is enabled.
>
> That's a problem that should probably be addressed in a different patch,
> since the current XSM hook is already implemented as one per request.
That's true for the pin-page case in do_mmuext_op(), but not
for any other of its sub-ops (particularly not for the TLB
flushing ones, for which I can't even see how XSM denying the
operation could be useful in any way, the more that presently
foreigndom/pg_owner is being ignored for many of these, i.e.
they act locally even if an otherwise valid foreign domain was
specified).
> This is because it needs access to the page being mapped in order to check
> for MMIO mappings. Since those are not the normal case, I think this could
> be improved using a lazier hook - or by dropping the per-request XSM check,
> because I think it might be re-implementing the existing mmio rangeset
> checks, and should just rely on those.
Indeed - if the per-request check makes no sense, then dropping
that one would be the preferred route over the one you took
here. Same for do_mmu_update().
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |