bitkeeper revision 1.1236.9.2 (422840a9xbbNuTrbO6poyFnzBRcuOg)
authorcwc22@centipede.cl.cam.ac.uk <cwc22@centipede.cl.cam.ac.uk>
Fri, 4 Mar 2005 11:04:09 +0000 (11:04 +0000)
committercwc22@centipede.cl.cam.ac.uk <cwc22@centipede.cl.cam.ac.uk>
Fri, 4 Mar 2005 11:04:09 +0000 (11:04 +0000)
caller specified decrement to put_page_type(s)

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

index f9d79042ce180e9c39062f90797cb604a11f317b..e81413efc4965c0f30c603f18418f5824612eab5 100644 (file)
@@ -1060,14 +1060,14 @@ void free_page_type(struct pfn_info *page, unsigned int type)
 }
 
 
-void put_page_type(struct pfn_info *page)
+void put_page_types(struct pfn_info *page, u32 decrement)
 {
     u32 nx, x, y = page->u.inuse.type_info;
 
  again:
     do {
         x  = y;
-        nx = x - 1;
+        nx = x - decrement;
 
         ASSERT((x & PGT_count_mask) != 0);
 
index edc6171f16d4afb7d9bff54d89a1345b40366929..26ae542bd68c1dd0a3022dbae71b51be51690587 100644 (file)
@@ -707,7 +707,8 @@ gnttab_release_all_mappings(grant_table_t *gt)
     grant_mapping_t        *map;
     domid_t                 dom;
     grant_ref_t             ref;
-    u16                     handle, i;
+    u16                     handle;
+    u32                     pincount;
     struct domain          *ld, *rd;
     unsigned long           frame;
     active_grant_entry_t   *act;
@@ -733,10 +734,8 @@ gnttab_release_all_mappings(grant_table_t *gt)
             {
                 if ( rd != NULL )
                     put_domain(rd);
-                /* TODO: need to be able to handle domains destroyed
-                 *       with active mappings.
-                 */
-                DPRINTK("Grant release: Could not find domain %d\n", dom);
+
+                printk(KERN_WARNING "Grant release: Could not find domain %d\n", dom);
                 continue;
             }
 
@@ -747,16 +746,16 @@ gnttab_release_all_mappings(grant_table_t *gt)
 
             frame = act->frame;
 
-            for ( i = ((act->pin & GNTPIN_hstw_mask) >> GNTPIN_hstw_shift) +
-                      ((act->pin & GNTPIN_devw_mask) >> GNTPIN_devw_shift);
-                  i > 0; i-- )
-            {
-                put_page_type(&frame_table[frame]);
-            }
-            act->pin = 0;
+            pincount = ((act->pin & GNTPIN_hstw_mask) >> GNTPIN_hstw_shift) +
+                       ((act->pin & GNTPIN_devw_mask) >> GNTPIN_devw_shift);
+
+            if ( pincount > 0 )
+                put_page_types(&frame_table[frame], pincount);
 
             put_page(&frame_table[frame]);
 
+            act->pin = 0;
+
             clear_bit(_GTF_reading, &sha->flags);
             clear_bit(_GTF_writing, &sha->flags);
 
index 3e4b1d4b0b51f16581f75f61e876f11a2f9db035..75f26d54ad9dbcf83e3d3b28ed473721f407d7f7 100644 (file)
@@ -182,9 +182,14 @@ static inline int get_page(struct pfn_info *page,
     return 1;
 }
 
-void put_page_type(struct pfn_info *page);
+void put_page_types(struct pfn_info *page, u32 decrement);
 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);