]> xenbits.xensource.com Git - people/aperard/xen-arm.git/commitdiff
xen: centralize accounting for domain tot_pages
authorDan Magenheimer <dan.magenheimer@oracle.com>
Mon, 10 Dec 2012 11:15:53 +0000 (11:15 +0000)
committerDan Magenheimer <dan.magenheimer@oracle.com>
Mon, 10 Dec 2012 11:15:53 +0000 (11:15 +0000)
Provide and use a common function for all adjustments to a
domain's tot_pages counter in anticipation of future and/or
out-of-tree patches that must adjust related counters
atomically.

Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com>
Committed-by: Keir Fraser <keir@xen.org>
xen/arch/x86/mm.c
xen/arch/x86/mm/mem_sharing.c
xen/common/grant_table.c
xen/common/memory.c
xen/common/page_alloc.c
xen/include/xen/mm.h

index 3657b258cd29a26a3389831a166097f48fe4b2a0..c474e587ecb9f9456cf90dc6ca340203bef0bc68 100644 (file)
@@ -3843,7 +3843,7 @@ int donate_page(
     {
         if ( d->tot_pages >= d->max_pages )
             goto fail;
-        d->tot_pages++;
+        domain_adjust_tot_pages(d, 1);
     }
 
     page->count_info = PGC_allocated | 1;
@@ -3893,7 +3893,7 @@ int steal_page(
     } while ( (y = cmpxchg(&page->count_info, x, x | 1)) != x );
 
     /* Unlink from original owner. */
-    if ( !(memflags & MEMF_no_refcount) && !--d->tot_pages )
+    if ( !(memflags & MEMF_no_refcount) && !domain_adjust_tot_pages(d, -1) )
         drop_dom_ref = 1;
     page_list_del(page, &d->page_list);
 
index 510328554e99f2117d1a8a1a9c3b14ef36666be0..e91aac5cfd1eb9fc56a47d80c5d835099dfac4bd 100644 (file)
@@ -639,7 +639,7 @@ static int page_make_sharable(struct domain *d,
     }
 
     page_set_owner(page, dom_cow);
-    d->tot_pages--;
+    domain_adjust_tot_pages(d, -1);
     drop_dom_ref = (d->tot_pages == 0);
     page_list_del(page, &d->page_list);
     spin_unlock(&d->page_alloc_lock);
@@ -680,7 +680,7 @@ static int page_make_private(struct domain *d, struct page_info *page)
     ASSERT(page_get_owner(page) == dom_cow);
     page_set_owner(page, d);
 
-    if ( d->tot_pages++ == 0 )
+    if ( domain_adjust_tot_pages(d, 1) == 1 )
         get_domain(d);
     page_list_add_tail(page, &d->page_list);
     spin_unlock(&d->page_alloc_lock);
index e5064f40df6c7fc27fcd5432ac1b260f1e593e76..ce66d7598f736e81335fb7b5b75d775554d7743a 100644 (file)
@@ -1667,7 +1667,7 @@ gnttab_transfer(
         }
 
         /* Okay, add the page to 'e'. */
-        if ( unlikely(e->tot_pages++ == 0) )
+        if ( unlikely(domain_adjust_tot_pages(e, 1) == 1) )
             get_knownalive_domain(e);
         page_list_add_tail(page, &e->page_list);
         page_set_owner(page, e);
index c8541c4f9e5616572f16c5d7206118e561c9804d..c8c1ef2896c895fd773b298355da8ca0b2ac95b2 100644 (file)
@@ -465,7 +465,7 @@ static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg)
                              (j * (1UL << exch.out.extent_order)));
 
                 spin_lock(&d->page_alloc_lock);
-                d->tot_pages -= dec_count;
+                domain_adjust_tot_pages(d, -dec_count);
                 drop_dom_ref = (dec_count && !d->tot_pages);
                 spin_unlock(&d->page_alloc_lock);
 
index 15ebc6656bdb408bfd474e30cf189d619f6ed2aa..e273bb7eff2a6a8e318a9597f798f7eefc101a93 100644 (file)
@@ -239,6 +239,12 @@ static long midsize_alloc_zone_pages;
 
 static DEFINE_SPINLOCK(heap_lock);
 
+unsigned long domain_adjust_tot_pages(struct domain *d, long pages)
+{
+    ASSERT(spin_is_locked(&d->page_alloc_lock));
+    return d->tot_pages += pages;
+}
+
 static unsigned long init_node_heap(int node, unsigned long mfn,
                                     unsigned long nr, bool_t *use_tail)
 {
@@ -1291,7 +1297,7 @@ int assign_pages(
         if ( unlikely(d->tot_pages == 0) )
             get_knownalive_domain(d);
 
-        d->tot_pages += 1 << order;
+        domain_adjust_tot_pages(d, 1 << order);
     }
 
     for ( i = 0; i < (1 << order); i++ )
@@ -1375,7 +1381,7 @@ void free_domheap_pages(struct page_info *pg, unsigned int order)
             page_list_del2(&pg[i], &d->page_list, &d->arch.relmem_list);
         }
 
-        d->tot_pages -= 1 << order;
+        domain_adjust_tot_pages(d, -(1 << order));
         drop_dom_ref = (d->tot_pages == 0);
 
         spin_unlock_recursive(&d->page_alloc_lock);
index 64a0cc15f2df88b20ba48fa07798dfe3338869dc..00b191527fb99889c1084b2993e15abe26fc3b0d 100644 (file)
@@ -48,6 +48,8 @@ void free_xenheap_pages(void *v, unsigned int order);
 #define alloc_xenheap_page() (alloc_xenheap_pages(0,0))
 #define free_xenheap_page(v) (free_xenheap_pages(v,0))
 
+unsigned long domain_adjust_tot_pages(struct domain *d, long pages);
+
 /* Domain suballocator. These functions are *not* interrupt-safe.*/
 void init_domheap_pages(paddr_t ps, paddr_t pe);
 struct page_info *alloc_domheap_pages(