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

Re: [Xen-devel] [V12 PATCH 3/4] pvh dom0: Add and remove foreign pages



On Wed, 14 May 2014 07:59:08 +0100
"Jan Beulich" <JBeulich@xxxxxxxx> wrote:

> >>> On 14.05.14 at 02:55, <mukesh.rathor@xxxxxxxxxx> wrote:
> > On Tue, 13 May 2014 08:09:42 +0100
...
> >> >> And a more general question: How is the insertion of p2m_foreign
> >> >> entries working together with the controlled domain (i.e. the
> >> >> one owning the page) being subject to paging/sharing? I only
> >> >> recall fixme-s having got added for the two features presently
> >> >> not being supported for PVH domains...
> >> > 
> >> > Right, the two features are not supported presently, the caller
> >> > will get -EINVAL if attempted. No further progress. 
> >> 
> >> Will it? Where is that being enforced? I just went down (as an
> > 
> > In p2m_add_foreign() we return -EINVAL if the foreign gfn is not
> > one of: ram_rw | ram_logdirty | ram_ro | paging_out.
> > 
> > Also, patch 8ff5c1d added checks in set_typed_p2m_entry() and
> > p2m_change_type_one().
> 
> But that's way too late, isn't it? You ought to disallow
> paging/sharing (and whatever else you can't support right now) from
> the beginning, i.e. it shouldn't even get enabled on a DomU if the
> controlling domain is PVH.

Ah, I see. The concern here is an HVM gfn say p2m_ram_rw, being mapped 
foreign into dom0, then going into sharing/paging. Yes, we should just
disable/disallow from the beginning for now. Long term, we would need to 
keep track somehow of guest gfns that are mapped foreign so we could
just disallow operations on those...  I frankly see no reason to support 
these features for foreign types.

Code wise several options, but seems mem_event.c would be the best 
place to put checks (would ENOSYS be more appropriate?):

+++ b/xen/arch/x86/mm/mem_event.c
@@ -538,6 +538,13 @@ int mem_event_domctl(struct domain *d, xen_domctl_mem_event
         case XEN_DOMCTL_MEM_EVENT_OP_PAGING_ENABLE:
         {
             struct p2m_domain *p2m = p2m_get_hostp2m(d);
+            struct domain *hwdom = rcu_lock_domain_by_id(hardware_domid);
+
+            rcu_unlock_domain(hwdom);
+            rc = -EOPNOTSUPP;
+            /* pvh fixme: support paging */
+            if ( is_pvh_domain(hwdom) )
+                break;
+
             rc = -ENODEV;
             /* Only HAP is supported */
             if ( !hap_enabled(d) )
@@ -620,6 +627,13 @@ int mem_event_domctl(struct domain *d, xen_domctl_mem_event
         {
         case XEN_DOMCTL_MEM_EVENT_OP_SHARING_ENABLE:
         {
+            struct domain *hwdom = rcu_lock_domain_by_id(hardware_domid);
+
+            rcu_unlock_domain(hwdom);
+            rc = -EOPNOTSUPP;
+            /* pvh fixme: support sharing */
+            if ( is_pvh_domain(hwdom) )
+                break;
+
             rc = -ENODEV;
             /* Only HAP is supported */
             if ( !hap_enabled(d) )


BTW, how come you let these get away without "fixme" tags :).. :

            /* Only HAP is supported */
            if ( !hap_enabled(d) )
                break;

            /* Currently only EPT is supported */
            if ( !cpu_has_vmx )

thanks
Mukesh


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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