unsigned int foreigndom)
{
struct mmu_update req;
- void *va;
+ void *va = NULL;
unsigned long gpfn, gmfn, mfn;
struct page_info *page;
unsigned int cmd, i = 0, done = 0, pt_dom;
struct vcpu *curr = current, *v = curr;
struct domain *d = v->domain, *pt_owner = d, *pg_owner;
- struct domain_mmap_cache mapcache;
+ mfn_t map_mfn = INVALID_MFN;
uint32_t xsm_needed = 0;
uint32_t xsm_checked = 0;
int rc = put_old_guest_table(curr);
goto out;
}
- domain_mmap_cache_init(&mapcache);
-
for ( i = 0; i < count; i++ )
{
if ( curr->arch.old_guest_table || (i && hypercall_preempt_check()) )
}
mfn = page_to_mfn(page);
- va = map_domain_page_with_cache(mfn, &mapcache);
- va = (void *)((unsigned long)va +
- (unsigned long)(req.ptr & ~PAGE_MASK));
+
+ if ( !mfn_eq(_mfn(mfn), map_mfn) )
+ {
+ if ( va )
+ unmap_domain_page(va);
+ va = map_domain_page(_mfn(mfn));
+ map_mfn = _mfn(mfn);
+ }
+ va = _p(((unsigned long)va & PAGE_MASK) + (req.ptr & ~PAGE_MASK));
if ( page_lock(page) )
{
put_page_type(page);
}
- unmap_domain_page_with_cache(va, &mapcache);
put_page(page);
}
break;
put_pg_owner(pg_owner);
- domain_mmap_cache_destroy(&mapcache);
+ if ( va )
+ unmap_domain_page(va);
perfc_add(num_page_updates, i);
return map_domain_page_global(_mfn(__page_to_mfn(pg)));
}
-#define DMCACHE_ENTRY_VALID 1U
-#define DMCACHE_ENTRY_HELD 2U
-
-struct domain_mmap_cache {
- unsigned long mfn;
- void *va;
- unsigned int flags;
-};
-
-static inline void
-domain_mmap_cache_init(struct domain_mmap_cache *cache)
-{
- ASSERT(cache != NULL);
- cache->flags = 0;
- cache->mfn = 0;
- cache->va = NULL;
-}
-
-static inline void *
-map_domain_page_with_cache(unsigned long mfn, struct domain_mmap_cache *cache)
-{
- ASSERT(cache != NULL);
- BUG_ON(cache->flags & DMCACHE_ENTRY_HELD);
-
- if ( likely(cache->flags & DMCACHE_ENTRY_VALID) )
- {
- cache->flags |= DMCACHE_ENTRY_HELD;
- if ( likely(mfn == cache->mfn) )
- goto done;
- unmap_domain_page(cache->va);
- }
-
- cache->mfn = mfn;
- cache->va = map_domain_page(_mfn(mfn));
- cache->flags = DMCACHE_ENTRY_HELD | DMCACHE_ENTRY_VALID;
-
- done:
- return cache->va;
-}
-
-static inline void
-unmap_domain_page_with_cache(const void *va, struct domain_mmap_cache *cache)
-{
- ASSERT(cache != NULL);
- cache->flags &= ~DMCACHE_ENTRY_HELD;
-}
-
-static inline void
-domain_mmap_cache_destroy(struct domain_mmap_cache *cache)
-{
- ASSERT(cache != NULL);
- BUG_ON(cache->flags & DMCACHE_ENTRY_HELD);
-
- if ( likely(cache->flags & DMCACHE_ENTRY_VALID) )
- {
- unmap_domain_page(cache->va);
- cache->flags = 0;
- }
-}
-
#else /* !CONFIG_DOMAIN_PAGE */
#define map_domain_page(mfn) mfn_to_virt(mfn_x(mfn))
static inline void unmap_domain_page_global(const void *va) {};
-struct domain_mmap_cache {
-};
-
-#define domain_mmap_cache_init(c) ((void)(c))
-#define map_domain_page_with_cache(mfn,c) (map_domain_page(mfn))
-#define unmap_domain_page_with_cache(va,c) ((void)(va))
-#define domain_mmap_cache_destroy(c) ((void)(c))
-
#endif /* !CONFIG_DOMAIN_PAGE */
#endif /* __XEN_DOMAIN_PAGE_H__ */