diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 65aea71c43..751f2f42fb 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -191,20 +191,25 @@ int xenmem_add_to_physmap_one( struct domain *od; p2m_type_t p2mt; - od = get_pg_owner(extra.foreign_domid); - if ( od == NULL ) - return -ESRCH; - - if ( od == d ) + if ( extra.foreign_domid == DOMID_XEN ) + od = rcu_lock_domain(dom_xen); + else { - put_pg_owner(od); - return -EINVAL; + rc = rcu_lock_remote_domain_by_id(extra.foreign_domid, &od); + if ( rc ) + return rc; + + if ( od == d ) + { + rcu_unlock_domain(od); + return -EINVAL; + } } rc = xsm_map_gmfn_foreign(XSM_TARGET, d, od); if ( rc ) { - put_pg_owner(od); + rcu_unlock_domain(od); return rc; } @@ -213,7 +218,7 @@ int xenmem_add_to_physmap_one( page = get_page_from_gfn(od, idx, &p2mt, P2M_ALLOC); if ( !page ) { - put_pg_owner(od); + rcu_unlock_domain(od); return -EINVAL; } @@ -222,13 +227,13 @@ int xenmem_add_to_physmap_one( else { put_page(page); - put_pg_owner(od); + rcu_unlock_domain(od); return -EINVAL; } mfn = page_to_mfn(page); - put_pg_owner(od); + rcu_unlock_domain(od); break; } case XENMAPSPACE_dev_mmio: