grant tables: page ref counting fixes.
#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>
/* 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);
}
-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);
{
long rc;
- DPRINTK("Grant: table operation (%u) count: (%u)\n", cmd, count);
-
if ( count > 512 )
return -EINVAL;
return -ENOMEM;
}
-static void
+void
gnttab_release_all_mappings(grant_table_t *gt)
{
grant_mapping_t *map;
((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;
spin_unlock(&rd->grant_table->lock);
+ map->ref_and_flags = 0;
+
put_domain(rd);
}
}
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);
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__ */