[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [XEN] Move mark_dirty() from alloc_page_type() to get_page_type(),
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxx # Node ID affbab70fca28b6ab6bb483bc149543c21aa2617 # Parent 6d83c86ebfe913b23bdd1e59278e0b4f605047dd [XEN] Move mark_dirty() from alloc_page_type() to get_page_type(), for symmetry with put_page_type(). Limit calls to mark_dirty() in put_page_type() so that they happen only for page-table pages. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- xen/arch/x86/mm.c | 38 +++++++++++++++----------------------- 1 files changed, 15 insertions(+), 23 deletions(-) diff -r 6d83c86ebfe9 -r affbab70fca2 xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Wed Sep 20 18:33:26 2006 +0100 +++ b/xen/arch/x86/mm.c Wed Sep 20 18:41:44 2006 +0100 @@ -1490,26 +1490,19 @@ static int mod_l4_entry(l4_pgentry_t *pl int alloc_page_type(struct page_info *page, unsigned long type) { - int rc; - switch ( type & PGT_type_mask ) { case PGT_l1_page_table: - rc = alloc_l1_table(page); - break; + return alloc_l1_table(page); case PGT_l2_page_table: - rc = alloc_l2_table(page, type); - break; + return alloc_l2_table(page, type); case PGT_l3_page_table: - rc = alloc_l3_table(page); - break; + return alloc_l3_table(page); case PGT_l4_page_table: - rc = alloc_l4_table(page); - break; + return alloc_l4_table(page); case PGT_gdt_page: case PGT_ldt_page: - rc = alloc_segdesc_page(page); - break; + return alloc_segdesc_page(page); default: printk("Bad type in alloc_page_type %lx t=%" PRtype_info " c=%x\n", type, page->u.inuse.type_info, @@ -1517,15 +1510,7 @@ int alloc_page_type(struct page_info *pa BUG(); } - /* - * A page is dirtied when its type count becomes non-zero. - * It is safe to mark dirty here because any PTE modifications in - * alloc_l?_table have now happened. The caller has already set the type - * and incremented the reference count. - */ - mark_dirty(page_get_owner(page), page_to_mfn(page)); - - return rc; + return 0; } @@ -1625,11 +1610,11 @@ void put_page_type(struct page_info *pag while ( unlikely((y = cmpxchg(&page->u.inuse.type_info, x, nx)) != x) ); /* - * A page is dirtied when its type count becomes zero. + * A page table is dirtied when its type count becomes zero. * We cannot set the dirty flag earlier than this because we must wait * until the type count has been zeroed by the CMPXCHG above. */ - if ( unlikely((nx & PGT_count_mask) == 0) ) + if ( unlikely((nx & (PGT_validated|PGT_count_mask)) == 0) ) mark_dirty(page_get_owner(page), page_to_mfn(page)); } @@ -1716,6 +1701,13 @@ int get_page_type(struct page_info *page /* Noone else is updating simultaneously. */ __set_bit(_PGT_validated, &page->u.inuse.type_info); + + /* + * A page table is dirtied when its type count becomes non-zero. It is + * safe to mark dirty here because any PTE modifications in + * alloc_page_type() have now happened. + */ + mark_dirty(page_get_owner(page), page_to_mfn(page)); } return 1; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |