mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
[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@xensource.com>
This commit is contained in:
1 parent
91741e2cdd
commit
d6b2fad88e
1 file changed
+15
-23
+15
-23
@@ -1490,26 +1490,19 @@ static int mod_l4_entry(l4_pgentry_t *pl4e,
|
||||
|
||||
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 *page, unsigned long type)
|
||||
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 *page)
|
||||
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, unsigned long type)
|
||||
|
||||
/* 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;
|
||||
|
||||