}
-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);
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;
{
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;
}
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);
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);