ChangeSet 1.1688, 2005/06/07 09:59:04+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx
Give the map_dom_mem_cache a better name, and fix a bug in
unmap_domain_mem_with_cache() [it shouldn't actually unmap the page!].
The bug was spotted by George Dunlap.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
arch/x86/mm.c | 10 +++++-----
arch/x86/shadow.c | 22 +++++++++++-----------
include/asm-x86/shadow.h | 12 ++++++------
include/asm-x86/x86_32/domain_page.h | 19 ++++++++++++-------
include/asm-x86/x86_64/domain_page.h | 6 +++---
5 files changed, 37 insertions(+), 32 deletions(-)
diff -Nru a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c 2005-06-07 05:02:50 -04:00
+++ b/xen/arch/x86/mm.c 2005-06-07 05:02:50 -04:00
@@ -1940,7 +1940,7 @@
struct vcpu *v = current;
struct domain *d = v->domain;
u32 type_info;
- struct map_dom_mem_cache mapcache, sh_mapcache;
+ struct domain_mmap_cache mapcache, sh_mapcache;
LOCK_BIGLOCK(d);
@@ -1956,8 +1956,8 @@
(void)get_user(done, pdone);
}
- init_map_domain_mem_cache(&mapcache);
- init_map_domain_mem_cache(&sh_mapcache);
+ domain_mmap_cache_init(&mapcache);
+ domain_mmap_cache_init(&sh_mapcache);
if ( !set_foreigndom(cpu, foreigndom) )
{
@@ -2169,8 +2169,8 @@
}
out:
- destroy_map_domain_mem_cache(&mapcache);
- destroy_map_domain_mem_cache(&sh_mapcache);
+ domain_mmap_cache_destroy(&mapcache);
+ domain_mmap_cache_destroy(&sh_mapcache);
process_deferred_ops(cpu);
diff -Nru a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c
--- a/xen/arch/x86/shadow.c 2005-06-07 05:02:51 -04:00
+++ b/xen/arch/x86/shadow.c 2005-06-07 05:02:51 -04:00
@@ -763,8 +763,8 @@
int
set_p2m_entry(struct domain *d, unsigned long pfn, unsigned long mfn,
- struct map_dom_mem_cache *l2cache,
- struct map_dom_mem_cache *l1cache)
+ struct domain_mmap_cache *l2cache,
+ struct domain_mmap_cache *l1cache)
{
unsigned long phystab = pagetable_get_paddr(d->arch.phys_table);
l2_pgentry_t *l2, l2e;
@@ -808,14 +808,14 @@
struct pfn_info *page, *l2page;
l2_pgentry_t *l2;
unsigned long mfn, pfn;
- struct map_dom_mem_cache l1cache, l2cache;
+ struct domain_mmap_cache l1cache, l2cache;
l2page = alloc_domheap_page(NULL);
if ( l2page == NULL )
return 0;
- init_map_domain_mem_cache(&l1cache);
- init_map_domain_mem_cache(&l2cache);
+ domain_mmap_cache_init(&l1cache);
+ domain_mmap_cache_init(&l2cache);
d->arch.phys_table = mk_pagetable(page_to_phys(l2page));
l2 = map_domain_mem_with_cache(page_to_phys(l2page), &l2cache);
@@ -851,8 +851,8 @@
list_ent = page->list.next;
}
- destroy_map_domain_mem_cache(&l2cache);
- destroy_map_domain_mem_cache(&l1cache);
+ domain_mmap_cache_destroy(&l2cache);
+ domain_mmap_cache_destroy(&l1cache);
return 1;
}
@@ -2682,7 +2682,7 @@
void shadow_l1_normal_pt_update(
struct domain *d,
unsigned long pa, l1_pgentry_t gpte,
- struct map_dom_mem_cache *cache)
+ struct domain_mmap_cache *cache)
{
unsigned long sl1mfn;
l1_pgentry_t *spl1e, spte;
@@ -2707,7 +2707,7 @@
void shadow_l2_normal_pt_update(
struct domain *d,
unsigned long pa, l2_pgentry_t gpde,
- struct map_dom_mem_cache *cache)
+ struct domain_mmap_cache *cache)
{
unsigned long sl2mfn;
l2_pgentry_t *spl2e;
@@ -2732,7 +2732,7 @@
void shadow_l3_normal_pt_update(
struct domain *d,
unsigned long pa, l3_pgentry_t gpde,
- struct map_dom_mem_cache *cache)
+ struct domain_mmap_cache *cache)
{
BUG(); // not yet implemented
}
@@ -2742,7 +2742,7 @@
void shadow_l4_normal_pt_update(
struct domain *d,
unsigned long pa, l4_pgentry_t gpde,
- struct map_dom_mem_cache *cache)
+ struct domain_mmap_cache *cache)
{
BUG(); // not yet implemented
}
diff -Nru a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h
--- a/xen/include/asm-x86/shadow.h 2005-06-07 05:02:50 -04:00
+++ b/xen/include/asm-x86/shadow.h 2005-06-07 05:02:50 -04:00
@@ -121,25 +121,25 @@
extern int __shadow_out_of_sync(struct vcpu *v, unsigned long va);
extern int set_p2m_entry(
struct domain *d, unsigned long pfn, unsigned long mfn,
- struct map_dom_mem_cache *l2cache,
- struct map_dom_mem_cache *l1cache);
+ struct domain_mmap_cache *l2cache,
+ struct domain_mmap_cache *l1cache);
extern void remove_shadow(struct domain *d, unsigned long gpfn, u32 stype);
extern void shadow_l1_normal_pt_update(struct domain *d,
unsigned long pa, l1_pgentry_t l1e,
- struct map_dom_mem_cache *cache);
+ struct domain_mmap_cache *cache);
extern void shadow_l2_normal_pt_update(struct domain *d,
unsigned long pa, l2_pgentry_t l2e,
- struct map_dom_mem_cache *cache);
+ struct domain_mmap_cache *cache);
#if CONFIG_PAGING_LEVELS >= 3
extern void shadow_l3_normal_pt_update(struct domain *d,
unsigned long pa, l3_pgentry_t l3e,
- struct map_dom_mem_cache *cache);
+ struct domain_mmap_cache *cache);
#endif
#if CONFIG_PAGING_LEVELS >= 4
extern void shadow_l4_normal_pt_update(struct domain *d,
unsigned long pa, l4_pgentry_t l4e,
- struct map_dom_mem_cache *cache);
+ struct domain_mmap_cache *cache);
#endif
extern int shadow_do_update_va_mapping(unsigned long va,
l1_pgentry_t val,
diff -Nru a/xen/include/asm-x86/x86_32/domain_page.h
b/xen/include/asm-x86/x86_32/domain_page.h
--- a/xen/include/asm-x86/x86_32/domain_page.h 2005-06-07 05:02:50 -04:00
+++ b/xen/include/asm-x86/x86_32/domain_page.h 2005-06-07 05:02:50 -04:00
@@ -27,31 +27,36 @@
*/
extern void unmap_domain_mem(void *va);
-struct map_dom_mem_cache {
+#define DMCACHE_ENTRY_VALID 1UL
+#define DMCACHE_ENTRY_HELD 2UL
+
+struct domain_mmap_cache {
unsigned long pa;
void *va;
};
static inline void
-init_map_domain_mem_cache(struct map_dom_mem_cache *cache)
+domain_mmap_cache_init(struct domain_mmap_cache *cache)
{
ASSERT(cache != NULL);
cache->pa = 0;
}
static inline void *
-map_domain_mem_with_cache(unsigned long pa, struct map_dom_mem_cache *cache)
+map_domain_mem_with_cache(unsigned long pa, struct domain_mmap_cache *cache)
{
ASSERT(cache != NULL);
+ BUG_ON(cache->pa & DMCACHE_ENTRY_HELD);
if ( likely(cache->pa) )
{
+ cache->pa |= DMCACHE_ENTRY_HELD;
if ( likely((pa & PAGE_MASK) == (cache->pa & PAGE_MASK)) )
goto done;
unmap_domain_mem(cache->va);
}
- cache->pa = (pa & PAGE_MASK) | 1;
+ cache->pa = (pa & PAGE_MASK) | DMCACHE_ENTRY_HELD | DMCACHE_ENTRY_VALID;
cache->va = map_domain_mem(cache->pa);
done:
@@ -60,14 +65,14 @@
}
static inline void
-unmap_domain_mem_with_cache(void *va, struct map_dom_mem_cache *cache)
+unmap_domain_mem_with_cache(void *va, struct domain_mmap_cache *cache)
{
ASSERT(cache != NULL);
- unmap_domain_mem(va);
+ cache->pa &= ~DMCACHE_ENTRY_HELD;
}
static inline void
-destroy_map_domain_mem_cache(struct map_dom_mem_cache *cache)
+domain_mmap_cache_destroy(struct domain_mmap_cache *cache)
{
ASSERT(cache != NULL);
if ( likely(cache->pa) )
diff -Nru a/xen/include/asm-x86/x86_64/domain_page.h
b/xen/include/asm-x86/x86_64/domain_page.h
--- a/xen/include/asm-x86/x86_64/domain_page.h 2005-06-07 05:02:50 -04:00
+++ b/xen/include/asm-x86/x86_64/domain_page.h 2005-06-07 05:02:50 -04:00
@@ -10,12 +10,12 @@
#define map_domain_mem(_pa) phys_to_virt(_pa)
#define unmap_domain_mem(_va) ((void)(_va))
-struct map_dom_mem_cache {
+struct domain_mmap_cache {
};
-#define init_map_domain_mem_cache(_c) ((void)(_c))
+#define domain_mmap_cache_init(_c) ((void)(_c))
#define map_domain_mem_with_cache(_p,_c) (map_domain_mem(_p))
#define unmap_domain_mem_with_cache(_v,_c) ((void)(_v))
-#define destroy_map_domain_mem_cache(_c) ((void)(_c))
+#define domain_mmap_cache_destroy(_c) ((void)(_c))
#endif /* __ASM_DOMAIN_PAGE_H__ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|