bitkeeper revision 1.1236.12.12 (422e2f94y48ELm2z25jB8lJCOUxZgw)
authorcwc22@centipede.cl.cam.ac.uk <cwc22@centipede.cl.cam.ac.uk>
Tue, 8 Mar 2005 23:04:52 +0000 (23:04 +0000)
committercwc22@centipede.cl.cam.ac.uk <cwc22@centipede.cl.cam.ac.uk>
Tue, 8 Mar 2005 23:04:52 +0000 (23:04 +0000)
grant tables: page ref counting fixes.

xen/arch/x86/domain.c
xen/arch/x86/mm.c
xen/common/grant_table.c
xen/include/asm-x86/mm.h
xen/include/xen/grant_table.h

index ccff1541913cf0744408fd8d05f6665473bc9926..e9ed5835074fd735e129bbb376493ae3412134a9 100644 (file)
@@ -19,6 +19,7 @@
 #include <xen/smp.h>
 #include <xen/delay.h>
 #include <xen/softirq.h>
+#include <xen/grant_table.h>
 #include <asm/regs.h>
 #include <asm/mc146818rtc.h>
 #include <asm/system.h>
@@ -956,6 +957,9 @@ void domain_relinquish_memory(struct domain *d)
     /* Ensure that noone is running over the dead domain's page tables. */
     synchronise_pagetables(~0UL);
 
+    /* Release mappings of other domains */
+    gnttab_release_all_mappings( d->grant_table );
+
     /* Exit shadow mode before deconstructing final guest page table. */
     shadow_mode_disable(d);
 
index aed94baeec39d555da4f4b2c005100db27c3c084..7233e28655c673f78a7f8e6b2eac1af62a9528b1 100644 (file)
@@ -1060,14 +1060,14 @@ void free_page_type(struct pfn_info *page, unsigned int type)
 }
 
 
-void put_page_types(struct pfn_info *page, u32 decrement)
+void put_page_type(struct pfn_info *page)
 {
     u32 nx, x, y = page->u.inuse.type_info;
 
  again:
     do {
         x  = y;
-        nx = x - decrement;
+        nx = x - 1;
 
         ASSERT((x & PGT_count_mask) != 0);
 
index afb02d6b13a6e8dfd5284db92e80af2f6ac02946..b13ce0c6361975dbabd5974a2868cd19304c1e15 100644 (file)
@@ -658,8 +658,6 @@ do_grant_table_op(
 {
     long rc;
 
-    DPRINTK("Grant: table operation (%u) count: (%u)\n", cmd, count);
-
     if ( count > 512 )
         return -EINVAL;
 
@@ -846,7 +844,7 @@ grant_table_create(
     return -ENOMEM;
 }
 
-static void
+void
 gnttab_release_all_mappings(grant_table_t *gt)
 {
     grant_mapping_t        *map;
@@ -895,9 +893,10 @@ gnttab_release_all_mappings(grant_table_t *gt)
                        ((act->pin & GNTPIN_devw_mask) >> GNTPIN_devw_shift);
 
             if ( pincount > 0 )
-                put_page_types(&frame_table[frame], pincount);
+                put_page_type(&frame_table[frame]);
 
-            put_page(&frame_table[frame]);
+            if (act->pin)
+                put_page(&frame_table[frame]);
 
             act->pin = 0;
 
@@ -906,6 +905,8 @@ gnttab_release_all_mappings(grant_table_t *gt)
 
             spin_unlock(&rd->grant_table->lock);
 
+            map->ref_and_flags = 0;
+
             put_domain(rd);
         }
     }
index f2332908e7b8b55a0cf4a4637f89c4ccaab2faf6..e6bd40560d24e522e1acbdeae8dd3a6ba412cb27 100644 (file)
@@ -182,14 +182,9 @@ static inline int get_page(struct pfn_info *page,
     return 1;
 }
 
-void put_page_types(struct pfn_info *page, u32 decrement);
+void put_page_type(struct pfn_info *page);
 int  get_page_type(struct pfn_info *page, u32 type);
 
-static inline void put_page_type(struct pfn_info *page)
-{
-    put_page_types(page, 1);
-}
-
 static inline void put_page_and_type(struct pfn_info *page)
 {
     put_page_type(page);
index c161667cdf9f39e141f16c441c12a7f3016cec3c..1404b955423d7311527ae39663d5f09ae3dcfdcb 100644 (file)
@@ -105,4 +105,9 @@ void
 gnttab_notify_transfer(
     struct domain *rd, grant_ref_t ref, unsigned long frame);
 
+/* Pre-domain destruction release of all mappings of other domains */
+void
+gnttab_release_all_mappings(grant_table_t *gt);
+
+
 #endif /* __XEN_GRANT_H__ */