Lines Matching refs:page
59 #define RMAP_USES_HASHTAB(page) \ argument
60 ((page)->sharing->hash_table.flag == NULL)
78 static inline void audit_add_list(struct page_info *page) in audit_add_list() argument
80 INIT_LIST_HEAD(&page->sharing->entry); in audit_add_list()
82 list_add_rcu(&page->sharing->entry, &shr_audit_list); in audit_add_list()
87 static inline void page_sharing_dispose(struct page_info *page) in page_sharing_dispose() argument
90 if ( unlikely(RMAP_USES_HASHTAB(page)) ) in page_sharing_dispose()
91 free_xenheap_pages(page->sharing->hash_table.bucket, in page_sharing_dispose()
95 list_del_rcu(&page->sharing->entry); in page_sharing_dispose()
97 INIT_RCU_HEAD(&page->sharing->rcu_head); in page_sharing_dispose()
98 call_rcu(&page->sharing->rcu_head, _free_pg_shared_info); in page_sharing_dispose()
104 static inline void page_sharing_dispose(struct page_info *page) in page_sharing_dispose() argument
107 if ( unlikely(RMAP_USES_HASHTAB(page)) ) in page_sharing_dispose()
108 free_xenheap_pages(page->sharing->hash_table.bucket, in page_sharing_dispose()
110 xfree(page->sharing); in page_sharing_dispose()
177 rmap_init(struct page_info *page) in rmap_init() argument
180 INIT_LIST_HEAD(&page->sharing->gfns); in rmap_init()
190 rmap_list_to_hash_table(struct page_info *page) in rmap_list_to_hash_table() argument
202 list_for_each_safe(pos, tmp, &page->sharing->gfns) in rmap_list_to_hash_table()
210 page->sharing->hash_table.bucket = b; in rmap_list_to_hash_table()
211 page->sharing->hash_table.flag = NULL; in rmap_list_to_hash_table()
217 rmap_hash_table_to_list(struct page_info *page) in rmap_hash_table_to_list() argument
220 struct list_head *bucket = page->sharing->hash_table.bucket; in rmap_hash_table_to_list()
222 INIT_LIST_HEAD(&page->sharing->gfns); in rmap_hash_table_to_list()
230 list_add(pos, &page->sharing->gfns); in rmap_hash_table_to_list()
253 rmap_del(gfn_info_t *gfn_info, struct page_info *page, int convert) in rmap_del() argument
255 if ( RMAP_USES_HASHTAB(page) && convert && in rmap_del()
256 (rmap_count(page) <= RMAP_LIGHT_SHARED_PAGE) ) in rmap_del()
257 rmap_hash_table_to_list(page); in rmap_del()
265 rmap_add(gfn_info_t *gfn_info, struct page_info *page) in rmap_add() argument
269 if ( !RMAP_USES_HASHTAB(page) && in rmap_add()
270 (rmap_count(page) >= RMAP_HEAVY_SHARED_PAGE) ) in rmap_add()
273 (void)rmap_list_to_hash_table(page); in rmap_add()
275 head = (RMAP_USES_HASHTAB(page)) ? in rmap_add()
276 page->sharing->hash_table.bucket + in rmap_add()
278 &page->sharing->gfns; in rmap_add()
286 struct page_info *page) in rmap_retrieve() argument
291 head = (RMAP_USES_HASHTAB(page)) ? in rmap_retrieve()
292 page->sharing->hash_table.bucket + HASH(domain_id, gfn) : in rmap_retrieve()
293 &page->sharing->gfns; in rmap_retrieve()
307 static inline int rmap_has_one_entry(struct page_info *page) in rmap_has_one_entry() argument
309 return (rmap_count(page) == 1); in rmap_has_one_entry()
313 static inline int rmap_has_entries(struct page_info *page) in rmap_has_entries() argument
315 return (rmap_count(page) != 0); in rmap_has_entries()
327 rmap_seed_iterator(struct page_info *page, struct rmap_iterator *ri) in rmap_seed_iterator() argument
329 ri->curr = (RMAP_USES_HASHTAB(page)) ? in rmap_seed_iterator()
330 page->sharing->hash_table.bucket : in rmap_seed_iterator()
331 &page->sharing->gfns; in rmap_seed_iterator()
337 rmap_iterate(struct page_info *page, struct rmap_iterator *ri) in rmap_iterate() argument
339 struct list_head *head = (RMAP_USES_HASHTAB(page)) ? in rmap_iterate()
340 page->sharing->hash_table.bucket + ri->bucket : in rmap_iterate()
341 &page->sharing->gfns; in rmap_iterate()
346 if ( RMAP_USES_HASHTAB(page) ) in rmap_iterate()
352 head = page->sharing->hash_table.bucket + ri->bucket; in rmap_iterate()
367 static inline gfn_info_t *mem_sharing_gfn_alloc(struct page_info *page, in mem_sharing_gfn_alloc() argument
379 rmap_add(gfn_info, page); in mem_sharing_gfn_alloc()
387 static inline void mem_sharing_gfn_destroy(struct page_info *page, in mem_sharing_gfn_destroy() argument
395 rmap_del(gfn_info, page, 1); in mem_sharing_gfn_destroy()
403 struct page_info* page = mfn_to_page(_mfn(mfn)); in mem_sharing_lookup() local
404 if ( page_get_owner(page) == dom_cow ) in mem_sharing_lookup()
409 unsigned long t = read_atomic(&page->u.inuse.type_info); in mem_sharing_lookup()
413 return page; in mem_sharing_lookup()
592 struct page_info *page, in page_make_sharable() argument
606 if ( !get_page_and_type(page, d, PGT_shared_page) ) in page_make_sharable()
613 if ( (page->u.inuse.type_info & PGT_count_mask) != 1 ) in page_make_sharable()
616 put_page_and_type(page); in page_make_sharable()
622 if ( page->count_info != (PGC_allocated | (2 + expected_refcnt)) ) in page_make_sharable()
626 put_page_and_type(page); in page_make_sharable()
630 page_set_owner(page, dom_cow); in page_make_sharable()
632 page_list_del(page, &d->page_list); in page_make_sharable()
640 static int page_make_private(struct domain *d, struct page_info *page) in page_make_private() argument
644 if ( !get_page(page, dom_cow) ) in page_make_private()
652 put_page(page); in page_make_private()
661 if ( page->u.inuse.type_info != expected_type ) in page_make_private()
664 put_page(page); in page_make_private()
669 put_page_and_type(page); in page_make_private()
672 mem_sharing_page_unlock(page); in page_make_private()
675 ASSERT(page_get_owner(page) == dom_cow); in page_make_private()
676 page_set_owner(page, d); in page_make_private()
680 page_list_add_tail(page, &d->page_list); in page_make_private()
683 put_page(page); in page_make_private()
712 struct page_info *page; in debug_mfn() local
715 if ( (page = __grab_shared_page(mfn)) == NULL) in debug_mfn()
723 mfn_x(page_to_mfn(page)), in debug_mfn()
724 page->count_info, in debug_mfn()
725 page->u.inuse.type_info, in debug_mfn()
726 page_get_owner(page)->domain_id); in debug_mfn()
729 num_refs = ((int) (page->u.inuse.type_info & PGT_count_mask)) - 1; in debug_mfn()
730 mem_sharing_page_unlock(page); in debug_mfn()
778 struct page_info *page = NULL; /* gcc... */ in nominate_page() local
839 page = mfn_to_page(mfn); in nominate_page()
840 ret = page_make_sharable(d, page, expected_refcnt); in nominate_page()
848 if ( !mem_sharing_page_lock(page) ) in nominate_page()
853 if ( (page->sharing = in nominate_page()
857 BUG_ON(page_make_private(d, page) != 0); in nominate_page()
860 page->sharing->pg = page; in nominate_page()
861 rmap_init(page); in nominate_page()
864 page->sharing->handle = get_next_handle(); in nominate_page()
867 if ( mem_sharing_gfn_alloc(page, d, gfn_x(gfn)) == NULL ) in nominate_page()
869 xfree(page->sharing); in nominate_page()
870 page->sharing = NULL; in nominate_page()
871 BUG_ON(page_make_private(d, page) != 0); in nominate_page()
884 *phandle = page->sharing->handle; in nominate_page()
885 audit_add_list(page); in nominate_page()
886 mem_sharing_page_unlock(page); in nominate_page()
1108 struct page_info *page, *old_page; in __mem_sharing_unshare_page() local
1120 page = __grab_shared_page(mfn); in __mem_sharing_unshare_page()
1121 if ( page == NULL ) in __mem_sharing_unshare_page()
1128 gfn_info = rmap_retrieve(d->domain_id, gfn, page); in __mem_sharing_unshare_page()
1138 last_gfn = rmap_has_one_entry(page); in __mem_sharing_unshare_page()
1143 mem_sharing_gfn_destroy(page, d, gfn_info); in __mem_sharing_unshare_page()
1144 page_sharing_dispose(page); in __mem_sharing_unshare_page()
1145 page->sharing = NULL; in __mem_sharing_unshare_page()
1156 mem_sharing_gfn_destroy(page, d, gfn_info); in __mem_sharing_unshare_page()
1157 put_page_and_type(page); in __mem_sharing_unshare_page()
1158 mem_sharing_page_unlock(page); in __mem_sharing_unshare_page()
1160 test_and_clear_bit(_PGC_allocated, &page->count_info) ) in __mem_sharing_unshare_page()
1161 put_page(page); in __mem_sharing_unshare_page()
1170 BUG_ON(page_make_private(d, page) != 0); in __mem_sharing_unshare_page()
1174 old_page = page; in __mem_sharing_unshare_page()
1175 page = alloc_domheap_page(d, 0); in __mem_sharing_unshare_page()
1176 if ( !page ) in __mem_sharing_unshare_page()
1187 copy_domain_page(page_to_mfn(page), page_to_mfn(old_page)); in __mem_sharing_unshare_page()
1189 BUG_ON(set_shared_p2m_entry(d, gfn, page_to_mfn(page))); in __mem_sharing_unshare_page()
1203 set_gpfn_from_mfn(mfn_x(page_to_mfn(page)), gfn); in __mem_sharing_unshare_page()
1207 paging_mark_dirty(d, page_to_mfn(page)); in __mem_sharing_unshare_page()