From: cwc22@centipede.cl.cam.ac.uk Date: Tue, 8 Mar 2005 23:04:52 +0000 (+0000) Subject: bitkeeper revision 1.1236.12.12 (422e2f94y48ELm2z25jB8lJCOUxZgw) X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~17857^2~57^2~14 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ff2955a71332b3136d7670a2f9d1d1f7bb644ab0;p=xen.git bitkeeper revision 1.1236.12.12 (422e2f94y48ELm2z25jB8lJCOUxZgw) grant tables: page ref counting fixes. --- diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index ccff154191..e9ed583507 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -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); diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index aed94baeec..7233e28655 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -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); diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index afb02d6b13..b13ce0c636 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -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); } } diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h index f2332908e7..e6bd40560d 100644 --- a/xen/include/asm-x86/mm.h +++ b/xen/include/asm-x86/mm.h @@ -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); diff --git a/xen/include/xen/grant_table.h b/xen/include/xen/grant_table.h index c161667cdf..1404b95542 100644 --- a/xen/include/xen/grant_table.h +++ b/xen/include/xen/grant_table.h @@ -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__ */