# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID ed7888c838ad5cd213a24d21ae294b31a2500f4d
# Parent 542cb7acb21af9704044cea6720c84e73cb165f3
Update map_domain_page() documentation (mappings may only be
be used within the mapping vcpu). Implement TLB flush
filtering on the per-domain mapcache.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
diff -r 542cb7acb21a -r ed7888c838ad xen/arch/x86/x86_32/domain_page.c
--- a/xen/arch/x86/x86_32/domain_page.c Tue Jan 10 17:25:45 2006
+++ b/xen/arch/x86/x86_32/domain_page.c Tue Jan 10 17:53:44 2006
@@ -40,7 +40,8 @@
{
unsigned long va;
unsigned int idx, i, flags, vcpu = current->vcpu_id;
- struct mapcache *cache = ¤t->domain->arch.mapcache;
+ struct domain *d;
+ struct mapcache *cache;
#ifndef NDEBUG
unsigned int flush_count = 0;
#endif
@@ -49,17 +50,24 @@
perfc_incrc(map_domain_page_count);
/* If we are the idle domain, ensure that we run on our own page tables. */
- if ( unlikely(is_idle_vcpu(current)) )
+ d = current->domain;
+ if ( unlikely(is_idle_domain(d)) )
__sync_lazy_execstate();
+
+ cache = &d->arch.mapcache;
spin_lock(&cache->lock);
/* Has some other CPU caused a wrap? We must flush if so. */
- if ( cache->epoch != cache->shadow_epoch[vcpu] )
+ if ( unlikely(cache->epoch != cache->shadow_epoch[vcpu]) )
{
- perfc_incrc(domain_page_tlb_flush);
- local_flush_tlb();
cache->shadow_epoch[vcpu] = cache->epoch;
+ if ( NEED_FLUSH(tlbflush_time[smp_processor_id()],
+ cache->tlbflush_timestamp) )
+ {
+ perfc_incrc(domain_page_tlb_flush);
+ local_flush_tlb();
+ }
}
do {
@@ -71,6 +79,7 @@
perfc_incrc(domain_page_tlb_flush);
local_flush_tlb();
cache->shadow_epoch[vcpu] = ++cache->epoch;
+ cache->tlbflush_timestamp = tlbflush_current_time();
}
flags = 0;
diff -r 542cb7acb21a -r ed7888c838ad xen/include/asm-x86/domain.h
--- a/xen/include/asm-x86/domain.h Tue Jan 10 17:25:45 2006
+++ b/xen/include/asm-x86/domain.h Tue Jan 10 17:53:44 2006
@@ -17,6 +17,7 @@
l1_pgentry_t *l1tab;
unsigned int cursor;
unsigned int epoch, shadow_epoch[MAX_VIRT_CPUS];
+ u32 tlbflush_timestamp;
spinlock_t lock;
};
diff -r 542cb7acb21a -r ed7888c838ad xen/include/xen/domain_page.h
--- a/xen/include/xen/domain_page.h Tue Jan 10 17:25:45 2006
+++ b/xen/include/xen/domain_page.h Tue Jan 10 17:53:44 2006
@@ -17,21 +17,21 @@
/*
* Maps a given range of page frames, returning the mapped virtual address. The
- * pages are now accessible within the current domain until a corresponding
+ * pages are now accessible within the current VCPU until a corresponding
* call to unmap_domain_page().
*/
extern void *map_domain_pages(unsigned long pfn, unsigned int order);
/*
* Pass a VA within the first page of a range previously mapped in the context
- * of the currently-executing domain via a call to map_domain_pages(). Those
+ * of the currently-executing VCPU via a call to map_domain_pages(). Those
* pages will then be removed from the mapping lists.
*/
extern void unmap_domain_pages(void *va, unsigned int order);
/*
* Similar to the above calls, except the mapping is accessible in all
- * address spaces (not just within the domain that created the mapping). Global
+ * address spaces (not just within the VCPU that created the mapping). Global
* mappings can also be unmapped from any context.
*/
extern void *map_domain_page_global(unsigned long pfn);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|