int rc;
struct domain *fdom;
- ASSERT(tdom);
- if ( foreigndom == DOMID_SELF )
- return -EINVAL;
/*
* hvm fixme: until support is added to p2m teardown code to cleanup any
* foreign entries, limit this to hardware domain only.
if ( foreigndom == DOMID_XEN )
fdom = rcu_lock_domain(dom_xen);
else
- fdom = rcu_lock_domain_by_id(foreigndom);
- if ( fdom == NULL )
- return -ESRCH;
+ {
+ rc = rcu_lock_remote_domain_by_id(foreigndom, &fdom);
+ if ( rc )
+ return rc;
- rc = -EINVAL;
- if ( tdom == fdom )
- goto out;
+ rc = -EINVAL;
+ if ( tdom == fdom )
+ goto out;
+ }
rc = xsm_map_gmfn_foreign(XSM_TARGET, tdom, fdom);
if ( rc )
if ( !page ||
!p2m_is_ram(p2mt) || p2m_is_shared(p2mt) || p2m_is_hole(p2mt) )
{
- if ( page )
- put_page(page);
rc = -EINVAL;
- goto out;
+ goto put_one;
}
mfn = page_to_mfn(page);
gpfn, mfn_x(mfn), fgfn, tdom->domain_id, fdom->domain_id);
put_both:
- put_page(page);
-
/*
* This put_gfn for the above get_gfn for prev_mfn. We must do this
* after set_foreign_p2m_entry so another cpu doesn't populate the gpfn
*/
put_gfn(tdom, gpfn);
-out:
+ put_one:
+ put_page(page);
+
+ out:
if ( fdom )
rcu_unlock_domain(fdom);
+
return rc;
}