Lines Matching refs:page
442 struct page_info *page, struct domain *d, int readonly) in share_xen_page_with_guest() argument
444 if ( page_get_owner(page) == d ) in share_xen_page_with_guest()
447 set_gpfn_from_mfn(mfn_x(page_to_mfn(page)), INVALID_M2P_ENTRY); in share_xen_page_with_guest()
452 page->u.inuse.type_info = (readonly ? PGT_none : PGT_writable_page); in share_xen_page_with_guest()
453 page->u.inuse.type_info |= PGT_validated | 1; in share_xen_page_with_guest()
455 page_set_owner(page, d); in share_xen_page_with_guest()
457 ASSERT((page->count_info & ~PGC_xen_heap) == 0); in share_xen_page_with_guest()
462 page->count_info |= PGC_xen_heap | PGC_allocated | 1; in share_xen_page_with_guest()
465 page_list_add_tail(page, &d->xenpage_list); in share_xen_page_with_guest()
471 int __init unshare_xen_page_with_guest(struct page_info *page, in unshare_xen_page_with_guest() argument
474 if ( page_get_owner(page) != d || !is_xen_heap_page(page) ) in unshare_xen_page_with_guest()
477 if ( test_and_clear_bit(_PGC_allocated, &page->count_info) ) in unshare_xen_page_with_guest()
478 put_page(page); in unshare_xen_page_with_guest()
481 page->u.inuse.type_info = 0; in unshare_xen_page_with_guest()
482 page_set_owner(page, NULL); in unshare_xen_page_with_guest()
488 struct page_info *page, int readonly) in share_xen_page_with_privileged_guests() argument
490 share_xen_page_with_guest(page, dom_xen, readonly); in share_xen_page_with_privileged_guests()
493 void free_shared_domheap_page(struct page_info *page) in free_shared_domheap_page() argument
495 if ( test_and_clear_bit(_PGC_allocated, &page->count_info) ) in free_shared_domheap_page()
496 put_page(page); in free_shared_domheap_page()
497 if ( !test_and_clear_bit(_PGC_xen_heap, &page->count_info) ) in free_shared_domheap_page()
499 page->u.inuse.type_info = 0; in free_shared_domheap_page()
500 page_set_owner(page, NULL); in free_shared_domheap_page()
501 free_domheap_page(page); in free_shared_domheap_page()
540 static inline void set_tlbflush_timestamp(struct page_info *page) in set_tlbflush_timestamp() argument
549 if ( !(page->count_info & PGC_page_table) || in set_tlbflush_timestamp()
550 !shadow_mode_enabled(page_get_owner(page)) ) in set_tlbflush_timestamp()
551 page_set_tlbflush_timestamp(page); in set_tlbflush_timestamp()
561 struct page_info *page; in invalidate_shadow_ldt() local
577 page = l1e_get_page(pl1e[i]); in invalidate_shadow_ldt()
579 ASSERT_PAGE_IS_TYPE(page, PGT_seg_desc_page); in invalidate_shadow_ldt()
580 ASSERT_PAGE_IS_DOMAIN(page, v->domain); in invalidate_shadow_ldt()
581 put_page_and_type(page); in invalidate_shadow_ldt()
593 static int alloc_segdesc_page(struct page_info *page) in alloc_segdesc_page() argument
595 const struct domain *owner = page_get_owner(page); in alloc_segdesc_page()
596 struct desc_struct *descs = __map_domain_page(page); in alloc_segdesc_page()
612 struct page_info *page = mfn_to_page(mfn); in get_page_and_type_from_mfn() local
620 get_page_type_preemptible(page, type) : in get_page_and_type_from_mfn()
621 (get_page_type(page, type) ? 0 : -EINVAL)); in get_page_and_type_from_mfn()
624 (!preemptible || page != current->arch.old_guest_table) ) in get_page_and_type_from_mfn()
625 put_page(page); in get_page_and_type_from_mfn()
631 struct page_info *page, int writeable) in put_data_page() argument
634 put_page_and_type(page); in put_data_page()
636 put_page(page); in put_data_page()
717 struct page_info *page; \
753 page = mfn_to_page(_mfn(pfn)); \
756 put_page(page); \
759 if ( !inc_linear_uses(page) ) \
762 put_page(page); \
765 y = page->u.inuse.type_info; \
772 dec_linear_uses(page); \
774 put_page(page); \
778 while ( (y = cmpxchg(&page->u.inuse.type_info, x, x + 1)) != x ); \
808 struct page_info *page; in is_iomem_page() local
814 page = mfn_to_page(mfn); in is_iomem_page()
815 ASSERT((page->count_info & PGC_count_mask) != 0); in is_iomem_page()
817 return (page_get_owner(page) == dom_io); in is_iomem_page()
889 struct page_info *page = mfn_to_page(_mfn(mfn)); in get_page_from_l1e() local
906 (real_pg_owner = page_get_owner_and_reference(page)) == dom_io ) in get_page_from_l1e()
912 put_page(page); in get_page_from_l1e()
1033 if ( write && !get_page_type(page, PGT_writable_page) ) in get_page_from_l1e()
1040 ((page->count_info & PGC_cacheattr_mask) >> PGC_cacheattr_base) ) in get_page_from_l1e()
1042 unsigned long x, nx, y = page->count_info; in get_page_from_l1e()
1046 if ( is_xen_heap_page(page) ) in get_page_from_l1e()
1049 put_page_type(page); in get_page_from_l1e()
1050 put_page(page); in get_page_from_l1e()
1059 } while ( (y = cmpxchg(&page->count_info, x, nx)) != x ); in get_page_from_l1e()
1068 } while ( (y = cmpxchg(&page->count_info, x, nx)) != x ); in get_page_from_l1e()
1071 put_page_type(page); in get_page_from_l1e()
1072 put_page(page); in get_page_from_l1e()
1090 put_page(page); in get_page_from_l1e()
1196 static int _put_page_type(struct page_info *page, bool preemptible,
1202 struct page_info *page; in put_page_from_l1e() local
1209 page = mfn_to_page(_mfn(pfn)); in put_page_from_l1e()
1210 pg_owner = page_get_owner(page); in put_page_from_l1e()
1241 put_page_and_type(page); in put_page_from_l1e()
1246 if ( unlikely(((page->u.inuse.type_info & PGT_type_mask) == in put_page_from_l1e()
1248 unlikely(((page->u.inuse.type_info & PGT_count_mask) != 0)) && in put_page_from_l1e()
1254 put_page(page); in put_page_from_l1e()
1270 struct page_info *page = l2e_get_page(l2e); in put_page_from_l2e() local
1273 for ( i = 0; i < (1u << PAGETABLE_ORDER); i++, page++ ) in put_page_from_l2e()
1274 put_page_and_type(page); in put_page_from_l2e()
1363 static int alloc_l1_table(struct page_info *page) in alloc_l1_table() argument
1365 struct domain *d = page_get_owner(page); in alloc_l1_table()
1370 pl1e = __map_domain_page(page); in alloc_l1_table()
1403 struct page_info *page; in create_pae_xen_mappings() local
1428 page = l3e_get_page(l3e3); in create_pae_xen_mappings()
1429 BUG_ON(page->u.inuse.type_info & PGT_pinned); in create_pae_xen_mappings()
1430 BUG_ON((page->u.inuse.type_info & PGT_count_mask) == 0); in create_pae_xen_mappings()
1431 BUG_ON(!(page->u.inuse.type_info & PGT_pae_xen_l2)); in create_pae_xen_mappings()
1432 if ( (page->u.inuse.type_info & PGT_count_mask) != 1 ) in create_pae_xen_mappings()
1441 static int alloc_l2_table(struct page_info *page, unsigned long type, in alloc_l2_table() argument
1444 struct domain *d = page_get_owner(page); in alloc_l2_table()
1445 unsigned long pfn = mfn_x(page_to_mfn(page)); in alloc_l2_table()
1452 for ( i = page->nr_validated_ptes; i < L2_PAGETABLE_ENTRIES; i++ ) in alloc_l2_table()
1454 if ( preemptible && i > page->nr_validated_ptes in alloc_l2_table()
1457 page->nr_validated_ptes = i; in alloc_l2_table()
1485 static int alloc_l3_table(struct page_info *page) in alloc_l3_table() argument
1487 struct domain *d = page_get_owner(page); in alloc_l3_table()
1488 unsigned long pfn = mfn_x(page_to_mfn(page)); in alloc_l3_table()
1491 int rc = 0, partial = page->partial_pte; in alloc_l3_table()
1505 for ( i = page->nr_validated_ptes; i < L3_PAGETABLE_ENTRIES; in alloc_l3_table()
1523 page->nr_validated_ptes = i; in alloc_l3_table()
1524 page->partial_pte = partial ?: 1; in alloc_l3_table()
1528 page->nr_validated_ptes = i; in alloc_l3_table()
1529 page->partial_pte = 0; in alloc_l3_table()
1545 page->nr_validated_ptes = i; in alloc_l3_table()
1546 page->partial_pte = 0; in alloc_l3_table()
1548 current->arch.old_guest_table = page; in alloc_l3_table()
1672 static int alloc_l4_table(struct page_info *page) in alloc_l4_table() argument
1674 struct domain *d = page_get_owner(page); in alloc_l4_table()
1675 unsigned long pfn = mfn_x(page_to_mfn(page)); in alloc_l4_table()
1678 int rc = 0, partial = page->partial_pte; in alloc_l4_table()
1680 for ( i = page->nr_validated_ptes; i < L4_PAGETABLE_ENTRIES; in alloc_l4_table()
1689 page->nr_validated_ptes = i; in alloc_l4_table()
1690 page->partial_pte = partial ?: 1; in alloc_l4_table()
1699 page->nr_validated_ptes = i; in alloc_l4_table()
1700 page->partial_pte = 0; in alloc_l4_table()
1706 page->nr_validated_ptes++; in alloc_l4_table()
1708 current->arch.old_guest_table = page; in alloc_l4_table()
1733 static void free_l1_table(struct page_info *page) in free_l1_table() argument
1735 struct domain *d = page_get_owner(page); in free_l1_table()
1739 pl1e = __map_domain_page(page); in free_l1_table()
1748 static int free_l2_table(struct page_info *page, int preemptible) in free_l2_table() argument
1750 struct domain *d = page_get_owner(page); in free_l2_table()
1751 unsigned long pfn = mfn_x(page_to_mfn(page)); in free_l2_table()
1753 unsigned int i = page->nr_validated_ptes - 1; in free_l2_table()
1758 ASSERT(page->nr_validated_ptes); in free_l2_table()
1760 if ( is_guest_l2_slot(d, page->u.inuse.type_info, i) && in free_l2_table()
1764 page->nr_validated_ptes = i; in free_l2_table()
1772 page->u.inuse.type_info &= ~PGT_pae_xen_l2; in free_l2_table()
1777 static int free_l3_table(struct page_info *page) in free_l3_table() argument
1779 struct domain *d = page_get_owner(page); in free_l3_table()
1780 unsigned long pfn = mfn_x(page_to_mfn(page)); in free_l3_table()
1782 int rc = 0, partial = page->partial_pte; in free_l3_table()
1783 unsigned int i = page->nr_validated_ptes - !partial; in free_l3_table()
1801 page->nr_validated_ptes = i; in free_l3_table()
1802 page->partial_pte = partial ?: -1; in free_l3_table()
1806 page->nr_validated_ptes = i + 1; in free_l3_table()
1807 page->partial_pte = 0; in free_l3_table()
1813 static int free_l4_table(struct page_info *page) in free_l4_table() argument
1815 struct domain *d = page_get_owner(page); in free_l4_table()
1816 unsigned long pfn = mfn_x(page_to_mfn(page)); in free_l4_table()
1818 int rc = 0, partial = page->partial_pte; in free_l4_table()
1819 unsigned int i = page->nr_validated_ptes - !partial; in free_l4_table()
1831 page->nr_validated_ptes = i; in free_l4_table()
1832 page->partial_pte = partial ?: -1; in free_l4_table()
1836 page->nr_validated_ptes = i + 1; in free_l4_table()
1837 page->partial_pte = 0; in free_l4_table()
1852 int page_lock(struct page_info *page) in page_lock() argument
1857 while ( (x = page->u.inuse.type_info) & PGT_locked ) in page_lock()
1864 } while ( cmpxchg(&page->u.inuse.type_info, x, nx) != x ); in page_lock()
1869 void page_unlock(struct page_info *page) in page_unlock() argument
1871 unsigned long x, nx, y = page->u.inuse.type_info; in page_unlock()
1880 } while ( (y = cmpxchg(&page->u.inuse.type_info, x, nx)) != x ); in page_unlock()
1907 struct page_info *page = NULL; in mod_l1_entry() local
1923 page = get_page_from_gfn(pg_dom, l1e_get_pfn(nl1e), &p2mt, q); in mod_l1_entry()
1927 if ( page ) in mod_l1_entry()
1928 put_page(page); in mod_l1_entry()
1933 if ( p2mt == p2m_ram_paging_in && !page ) in mod_l1_entry()
1940 ASSERT(!page); in mod_l1_entry()
1945 if ( !page ) in mod_l1_entry()
1947 nl1e = l1e_from_page(page, l1e_get_flags(nl1e)); in mod_l1_entry()
1956 if ( page ) in mod_l1_entry()
1957 put_page(page); in mod_l1_entry()
1964 if ( page ) in mod_l1_entry()
1965 put_page(page); in mod_l1_entry()
1975 if ( page ) in mod_l1_entry()
1976 put_page(page); in mod_l1_entry()
2185 static int cleanup_page_cacheattr(struct page_info *page) in cleanup_page_cacheattr() argument
2188 (page->count_info & PGC_cacheattr_mask) >> PGC_cacheattr_base; in cleanup_page_cacheattr()
2193 page->count_info &= ~PGC_cacheattr_mask; in cleanup_page_cacheattr()
2195 BUG_ON(is_xen_heap_page(page)); in cleanup_page_cacheattr()
2197 return update_xen_mappings(mfn_x(page_to_mfn(page)), 0); in cleanup_page_cacheattr()
2200 void put_page(struct page_info *page) in put_page() argument
2202 unsigned long nx, x, y = page->count_info; in put_page()
2209 while ( unlikely((y = cmpxchg(&page->count_info, x, nx)) != x) ); in put_page()
2213 if ( cleanup_page_cacheattr(page) == 0 ) in put_page()
2214 free_domheap_page(page); in put_page()
2217 "Leaking mfn %" PRI_mfn "\n", mfn_x(page_to_mfn(page))); in put_page()
2222 struct domain *page_get_owner_and_reference(struct page_info *page) in page_get_owner_and_reference() argument
2224 unsigned long x, y = page->count_info; in page_get_owner_and_reference()
2237 while ( (y = cmpxchg(&page->count_info, x, x + 1)) != x ); in page_get_owner_and_reference()
2239 owner = page_get_owner(page); in page_get_owner_and_reference()
2246 int get_page(struct page_info *page, struct domain *domain) in get_page() argument
2248 struct domain *owner = page_get_owner_and_reference(page); in get_page()
2256 mfn_x(page_to_mfn(page)), domain->domain_id, in get_page()
2258 page->count_info - !!owner, page->u.inuse.type_info); in get_page()
2261 put_page(page); in get_page()
2274 static void get_page_light(struct page_info *page) in get_page_light() argument
2276 unsigned long x, nx, y = page->count_info; in get_page_light()
2283 y = cmpxchg(&page->count_info, x, nx); in get_page_light()
2288 static int alloc_page_type(struct page_info *page, unsigned long type, in alloc_page_type() argument
2291 struct domain *owner = page_get_owner(page); in alloc_page_type()
2296 paging_mark_dirty(owner, page_to_mfn(page)); in alloc_page_type()
2301 rc = alloc_l1_table(page); in alloc_page_type()
2304 rc = alloc_l2_table(page, type, preemptible); in alloc_page_type()
2308 rc = alloc_l3_table(page); in alloc_page_type()
2312 rc = alloc_l4_table(page); in alloc_page_type()
2315 rc = alloc_segdesc_page(page); in alloc_page_type()
2319 type, page->u.inuse.type_info, in alloc_page_type()
2320 page->count_info); in alloc_page_type()
2330 page->u.inuse.type_info |= PGT_validated; in alloc_page_type()
2333 ASSERT((page->u.inuse.type_info & in alloc_page_type()
2335 page->u.inuse.type_info &= ~PGT_count_mask; in alloc_page_type()
2342 mfn_x(page_to_mfn(page)), in alloc_page_type()
2343 get_gpfn_from_mfn(mfn_x(page_to_mfn(page))), in alloc_page_type()
2344 type, page->count_info, page->u.inuse.type_info); in alloc_page_type()
2345 if ( page != current->arch.old_guest_table ) in alloc_page_type()
2346 page->u.inuse.type_info = 0; in alloc_page_type()
2349 ASSERT((page->u.inuse.type_info & in alloc_page_type()
2352 get_page_light(page); in alloc_page_type()
2353 page->u.inuse.type_info |= PGT_partial; in alloc_page_type()
2362 int free_page_type(struct page_info *page, unsigned long type, in free_page_type() argument
2365 struct domain *owner = page_get_owner(page); in free_page_type()
2372 paging_mark_dirty(owner, page_to_mfn(page)); in free_page_type()
2376 gmfn = mfn_to_gmfn(owner, mfn_x(page_to_mfn(page))); in free_page_type()
2385 page->nr_validated_ptes = 1U << PAGETABLE_ORDER; in free_page_type()
2386 page->partial_pte = 0; in free_page_type()
2392 free_l1_table(page); in free_page_type()
2396 rc = free_l2_table(page, preemptible); in free_page_type()
2400 rc = free_l3_table(page); in free_page_type()
2404 rc = free_l4_table(page); in free_page_type()
2408 type, mfn_x(page_to_mfn(page))); in free_page_type()
2417 static int _put_final_page_type(struct page_info *page, unsigned long type, in _put_final_page_type() argument
2420 int rc = free_page_type(page, type, preemptible); in _put_final_page_type()
2427 dec_linear_uses(page); in _put_final_page_type()
2430 ASSERT(!page->linear_pt_count || page_get_owner(page)->is_dying); in _put_final_page_type()
2431 set_tlbflush_timestamp(page); in _put_final_page_type()
2433 page->u.inuse.type_info--; in _put_final_page_type()
2437 ASSERT((page->u.inuse.type_info & in _put_final_page_type()
2440 page->u.inuse.type_info |= PGT_validated; in _put_final_page_type()
2446 get_page_light(page); in _put_final_page_type()
2447 page->u.inuse.type_info |= PGT_partial; in _put_final_page_type()
2454 static int _put_page_type(struct page_info *page, bool preemptible, in _put_page_type() argument
2457 unsigned long nx, x, y = page->u.inuse.type_info; in _put_page_type()
2478 if ( unlikely((y = cmpxchg(&page->u.inuse.type_info, in _put_page_type()
2482 rc = _put_final_page_type(page, x, preemptible, ptpg); in _put_page_type()
2485 put_page(page); in _put_page_type()
2498 set_tlbflush_timestamp(page); in _put_page_type()
2511 y = page->u.inuse.type_info; in _put_page_type()
2515 if ( likely((y = cmpxchg(&page->u.inuse.type_info, x, nx)) == x) ) in _put_page_type()
2525 dec_linear_uses(page); in _put_page_type()
2533 static int __get_page_type(struct page_info *page, unsigned long type, in __get_page_type() argument
2536 unsigned long nx, x, y = page->u.inuse.type_info; in __get_page_type()
2550 mfn_x(page_to_mfn(page))); in __get_page_type()
2555 struct domain *d = page_get_owner(page); in __get_page_type()
2564 && (page->count_info & PGC_page_table) in __get_page_type()
2565 && !((page->shadow_flags & (1u<<29)) in __get_page_type()
2567 shadow_remove_all_shadows(d, page_to_mfn(page)); in __get_page_type()
2583 tlbflush_filter(mask, page->tlbflush_timestamp); in __get_page_type()
2587 (!shadow_mode_enabled(page_get_owner(page)) || in __get_page_type()
2621 x, type, mfn_x(page_to_mfn(page)), in __get_page_type()
2622 get_gpfn_from_mfn(mfn_x(page_to_mfn(page)))); in __get_page_type()
2630 while ( (y = page->u.inuse.type_info) == x ) in __get_page_type()
2643 if ( likely((y = cmpxchg(&page->u.inuse.type_info, x, nx)) == x) ) in __get_page_type()
2653 struct domain *d = page_get_owner(page); in __get_page_type()
2656 gfn_t gfn = _gfn(mfn_to_gmfn(d, mfn_x(page_to_mfn(page)))); in __get_page_type()
2662 mfn_x(page_to_mfn(page)), in __get_page_type()
2671 page->nr_validated_ptes = 0; in __get_page_type()
2672 page->partial_pte = 0; in __get_page_type()
2674 page->linear_pt_count = 0; in __get_page_type()
2675 rc = alloc_page_type(page, type, preemptible); in __get_page_type()
2679 put_page(page); in __get_page_type()
2687 void put_page_type(struct page_info *page) in put_page_type() argument
2689 int rc = _put_page_type(page, false, NULL); in put_page_type()
2694 int get_page_type(struct page_info *page, unsigned long type) in get_page_type() argument
2696 int rc = __get_page_type(page, type, 0); in get_page_type()
2703 int put_page_type_preemptible(struct page_info *page) in put_page_type_preemptible() argument
2705 return _put_page_type(page, true, NULL); in put_page_type_preemptible()
2708 int get_page_type_preemptible(struct page_info *page, unsigned long type) in get_page_type_preemptible() argument
2711 return __get_page_type(page, type, 1); in get_page_type_preemptible()
2739 struct page_info *page; in vcpu_destroy_pagetables() local
2754 page = mfn_to_page(_mfn(mfn)); in vcpu_destroy_pagetables()
2756 put_page(page); in vcpu_destroy_pagetables()
2758 rc = put_page_and_type_preemptible(page); in vcpu_destroy_pagetables()
2775 page = mfn_to_page(_mfn(mfn)); in vcpu_destroy_pagetables()
2777 put_page(page); in vcpu_destroy_pagetables()
2779 rc = put_page_and_type_preemptible(page); in vcpu_destroy_pagetables()
2875 struct page_info *page = mfn_to_page(old_base_mfn); in new_guest_cr3() local
2878 put_page(page); in new_guest_cr3()
2880 switch ( rc = put_page_and_type_preemptible(page) ) in new_guest_cr3()
2887 curr->arch.old_guest_table = page; in new_guest_cr3()
3072 struct page_info *page; in do_mmuext_op() local
3100 page = get_page_from_gfn(pg_owner, op.arg1.mfn, NULL, P2M_ALLOC); in do_mmuext_op()
3101 if ( unlikely(!page) ) in do_mmuext_op()
3107 rc = get_page_type_preemptible(page, type); in do_mmuext_op()
3115 rc, mfn_x(page_to_mfn(page))); in do_mmuext_op()
3116 if ( page != curr->arch.old_guest_table ) in do_mmuext_op()
3117 put_page(page); in do_mmuext_op()
3121 rc = xsm_memory_pin_page(XSM_HOOK, currd, pg_owner, page); in do_mmuext_op()
3123 &page->u.inuse.type_info)) ) in do_mmuext_op()
3127 mfn_x(page_to_mfn(page))); in do_mmuext_op()
3135 paging_mark_dirty(pg_owner, page_to_mfn(page)); in do_mmuext_op()
3145 &page->u.inuse.type_info)); in do_mmuext_op()
3151 put_page_and_type(page); in do_mmuext_op()
3155 curr->arch.old_guest_table = page; in do_mmuext_op()
3165 page = get_page_from_gfn(pg_owner, op.arg1.mfn, NULL, P2M_ALLOC); in do_mmuext_op()
3166 if ( unlikely(!page) ) in do_mmuext_op()
3175 if ( !test_and_clear_bit(_PGT_pinned, &page->u.inuse.type_info) ) in do_mmuext_op()
3177 put_page(page); in do_mmuext_op()
3184 switch ( rc = put_page_and_type_preemptible(page) ) in do_mmuext_op()
3189 curr->arch.old_guest_table = page; in do_mmuext_op()
3196 put_page(page); in do_mmuext_op()
3199 paging_mark_dirty(pg_owner, page_to_mfn(page)); in do_mmuext_op()
3253 page = mfn_to_page(_mfn(old_mfn)); in do_mmuext_op()
3255 switch ( rc = put_page_and_type_preemptible(page) ) in do_mmuext_op()
3262 curr->arch.old_guest_table = page; in do_mmuext_op()
3381 page = get_page_from_gfn(pg_owner, op.arg1.mfn, &p2mt, P2M_ALLOC); in do_mmuext_op()
3382 if ( unlikely(p2mt != p2m_ram_rw) && page ) in do_mmuext_op()
3384 put_page(page); in do_mmuext_op()
3385 page = NULL; in do_mmuext_op()
3387 if ( !page || !get_page_type(page, PGT_writable_page) ) in do_mmuext_op()
3389 if ( page ) in do_mmuext_op()
3390 put_page(page); in do_mmuext_op()
3398 paging_mark_dirty(pg_owner, page_to_mfn(page)); in do_mmuext_op()
3400 clear_domain_page(page_to_mfn(page)); in do_mmuext_op()
3402 put_page_and_type(page); in do_mmuext_op()
3517 struct page_info *page; in do_mmu_update() local
3628 page = get_page_from_gfn(pt_owner, gmfn, &p2mt, P2M_ALLOC); in do_mmu_update()
3632 ASSERT(!page); in do_mmu_update()
3638 if ( unlikely(!page) ) in do_mmu_update()
3645 mfn = mfn_x(page_to_mfn(page)); in do_mmu_update()
3656 if ( page_lock(page) ) in do_mmu_update()
3658 switch ( page->u.inuse.type_info & PGT_type_mask ) in do_mmu_update()
3683 page_unlock(page); in do_mmu_update()
3687 else if ( get_page_type(page, PGT_writable_page) ) in do_mmu_update()
3692 put_page_type(page); in do_mmu_update()
3695 put_page(page); in do_mmu_update()
3795 struct domain *d, struct page_info *page, unsigned int memflags) in donate_page() argument
3801 if ( is_xen_heap_page(page) || ((owner = page_get_owner(page)) != NULL) ) in donate_page()
3807 if ( page->count_info & ~(PGC_allocated | 1) ) in donate_page()
3817 page->count_info = PGC_allocated | 1; in donate_page()
3818 page_set_owner(page, d); in donate_page()
3819 page_list_add_tail(page,&d->page_list); in donate_page()
3828 mfn_x(page_to_mfn(page)), d->domain_id, in donate_page()
3830 page->count_info, page->u.inuse.type_info); in donate_page()
3835 struct domain *d, struct page_info *page, unsigned int memflags) in steal_page() argument
3846 if ( is_xen_heap_page(page) || ((owner = page_get_owner(page)) != d) ) in steal_page()
3853 y = page->count_info; in steal_page()
3858 y = cmpxchg(&page->count_info, x, x & ~PGC_count_mask); in steal_page()
3868 BUG_ON(page->u.inuse.type_info & (PGT_count_mask | PGT_locked | in steal_page()
3870 page->u.inuse.type_info = 0; in steal_page()
3873 page_set_owner(page, NULL); in steal_page()
3874 y = page->count_info; in steal_page()
3878 } while ( (y = cmpxchg(&page->count_info, x, x | 1)) != x ); in steal_page()
3883 page_list_del(page, &d->page_list); in steal_page()
3894 mfn_x(page_to_mfn(page)), d->domain_id, in steal_page()
3896 page->count_info, page->u.inuse.type_info); in steal_page()
4086 struct page_info *page = NULL; in xenmem_add_to_physmap_one() local
4123 page = mfn_to_page(mfn); in xenmem_add_to_physmap_one()
4176 if ( page ) in xenmem_add_to_physmap_one()
4177 put_page(page); in xenmem_add_to_physmap_one()