]> xenbits.xensource.com Git - xen.git/commitdiff
common: Use get_page_from_gfn() instead of get_gfn()/put_gfn.
authorTim Deegan <tim@xen.org>
Thu, 17 May 2012 09:24:54 +0000 (10:24 +0100)
committerTim Deegan <tim@xen.org>
Thu, 17 May 2012 09:24:54 +0000 (10:24 +0100)
Signed-off-by: Tim Deegan <tim@xen.org>
Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
xen/common/memory.c
xen/common/tmem_xen.c
xen/xsm/flask/hooks.c

index f0d396109b452c8f47b40d98a0e629c9b9415f35..5d64cb6db5e6a7346ce4101133480ea00d37c59c 100644 (file)
@@ -676,7 +676,7 @@ long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE(void) arg)
     case XENMEM_remove_from_physmap:
     {
         struct xen_remove_from_physmap xrfp;
-        unsigned long mfn;
+        struct page_info *page;
         struct domain *d;
 
         if ( copy_from_guest(&xrfp, arg, 1) )
@@ -694,15 +694,15 @@ long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE(void) arg)
 
         domain_lock(d);
 
-        mfn = get_gfn_untyped(d, xrfp.gpfn);
-
-        if ( mfn_valid(mfn) )
-            guest_physmap_remove_page(d, xrfp.gpfn, mfn, 0);
+        page = get_page_from_gfn(d, xrfp.gpfn, NULL, P2M_ALLOC);
+        if ( page )
+        {
+            guest_physmap_remove_page(d, xrfp.gpfn, page_to_mfn(page), 0);
+            put_page(page);
+        }
         else
             rc = -ENOENT;
 
-        put_gfn(d, xrfp.gpfn);
-
         domain_unlock(d);
 
         rcu_unlock_domain(d);
index 84b5bb27d686290b904f2fc8393177b16eedb151..4469d1e7a9c6da7b7ca8caf504cd276b8d473320 100644 (file)
@@ -107,30 +107,25 @@ static inline void cli_put_page(tmem_cli_mfn_t cmfn, void *cli_va, pfp_t *cli_pf
 static inline void *cli_get_page(tmem_cli_mfn_t cmfn, unsigned long *pcli_mfn,
                                  pfp_t **pcli_pfp, bool_t cli_write)
 {
-    unsigned long cli_mfn;
     p2m_type_t t;
     struct page_info *page;
-    int ret;
 
-    cli_mfn = mfn_x(get_gfn(current->domain, cmfn, &t));
-    if ( t != p2m_ram_rw || !mfn_valid(cli_mfn) )
+    page = get_page_from_gfn(current->domain, cmfn, &t, P2M_ALLOC);
+    if ( !page || t != p2m_ram_rw )
     {
-            put_gfn(current->domain, (unsigned long) cmfn);
-            return NULL;
+        if ( page )
+            put_page(page);
     }
-    page = mfn_to_page(cli_mfn);
-    if ( cli_write )
-        ret = get_page_and_type(page, current->domain, PGT_writable_page);
-    else
-        ret = get_page(page, current->domain);
-    if ( !ret )
+
+    if ( cli_write && !get_page_type(page, PGT_writable_page) )
     {
-        put_gfn(current->domain, (unsigned long) cmfn);
+        put_page(page);
         return NULL;
     }
-    *pcli_mfn = cli_mfn;
+
+    *pcli_mfn = page_to_mfn(page);
     *pcli_pfp = (pfp_t *)page;
-    return map_domain_page(cli_mfn);
+    return map_domain_page(*pcli_mfn);
 }
 
 static inline void cli_put_page(tmem_cli_mfn_t cmfn, void *cli_va, pfp_t *cli_pfp,
@@ -144,7 +139,6 @@ static inline void cli_put_page(tmem_cli_mfn_t cmfn, void *cli_va, pfp_t *cli_pf
     else
         put_page((struct page_info *)cli_pfp);
     unmap_domain_page(cli_va);
-    put_gfn(current->domain, (unsigned long) cmfn);
 }
 #endif
 
index c93b8d09b34b52bb5737aad514fcd5450142f690..16904ffa085334296597a60196bb3c0ae8f4d152 100644 (file)
@@ -1318,6 +1318,7 @@ static int flask_mmu_normal_update(struct domain *d, struct domain *t,
     struct domain_security_struct *dsec;
     u32 fsid;
     struct avc_audit_data ad;
+    struct page_info *page = NULL;
 
     if (d != t)
         rc = domain_has_perm(d, t, SECCLASS_MMU, MMU__REMOTE_REMAP);
@@ -1333,8 +1334,9 @@ static int flask_mmu_normal_update(struct domain *d, struct domain *t,
         map_perms |= MMU__MAP_WRITE;
 
     AVC_AUDIT_DATA_INIT(&ad, MEMORY);
-    fmfn = get_gfn_untyped(f, l1e_get_pfn(l1e_from_intpte(fpte)));
-
+    page = get_page_from_gfn(f, l1e_get_pfn(l1e_from_intpte(fpte)),
+                             NULL, P2M_ALLOC);
+    fmfn = page ? page_to_mfn(page) : INVALID_MFN;
     ad.sdom = d;
     ad.tdom = f;
     ad.memory.pte = fpte;
@@ -1342,7 +1344,8 @@ static int flask_mmu_normal_update(struct domain *d, struct domain *t,
 
     rc = get_mfn_sid(fmfn, &fsid);
 
-    put_gfn(f, fmfn);
+    if ( page )
+        put_page(page);
 
     if ( rc )
         return rc;
@@ -1370,7 +1373,7 @@ static int flask_update_va_mapping(struct domain *d, struct domain *f,
     int rc = 0;
     u32 psid;
     u32 map_perms = MMU__MAP_READ;
-    unsigned long mfn;
+    struct page_info *page = NULL;
     struct domain_security_struct *dsec;
 
     if ( !(l1e_get_flags(pte) & _PAGE_PRESENT) )
@@ -1381,8 +1384,10 @@ static int flask_update_va_mapping(struct domain *d, struct domain *f,
 
     dsec = d->ssid;
 
-    mfn = get_gfn_untyped(f, l1e_get_pfn(pte));
-    rc = get_mfn_sid(mfn, &psid);
+    page = get_page_from_gfn(f, l1e_get_pfn(pte), NULL, P2M_ALLOC);
+    rc = get_mfn_sid(page ? page_to_mfn(page) : INVALID_MFN, &psid);
+    if ( page )
+        put_page(page);
     if ( rc )
         return rc;