aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormafetter@fleming.research <mafetter@fleming.research>2005-02-12 13:45:18 +0000
committermafetter@fleming.research <mafetter@fleming.research>2005-02-12 13:45:18 +0000
commit2a0b261ce3ec01e9fee6827fa7d7548b7552dcad (patch)
tree6fb22abb7aa9d0867605dd47bee2896b9306e132
parentb9692e52eb582de971810d61fdb1c09787dacd82 (diff)
parent50170099899745d7bfaedc6a25901f2561b46bc1 (diff)
downloadxen-2a0b261ce3ec01e9fee6827fa7d7548b7552dcad.tar.gz
xen-2a0b261ce3ec01e9fee6827fa7d7548b7552dcad.tar.bz2
xen-2a0b261ce3ec01e9fee6827fa7d7548b7552dcad.zip
bitkeeper revision 1.1159.258.4 (420e086eRqMDAepFfVSrE8gAuTZ1dg)
Merge maf46@ssh-relay1.cl.cam.ac.uk:/usr/groups/xeno/BK/xen-2.0-testing.bk into fleming.research:/scratch/fleming/mafetter/xen-2.0-testing.bk
-rw-r--r--xen/arch/x86/memory.c22
-rw-r--r--xen/arch/x86/shadow.c2
-rw-r--r--xen/include/asm-x86/shadow.h3
-rw-r--r--xen/include/xen/perfc_defn.h3
4 files changed, 24 insertions, 6 deletions
diff --git a/xen/arch/x86/memory.c b/xen/arch/x86/memory.c
index 631e5c50c9..3961b37a89 100644
--- a/xen/arch/x86/memory.c
+++ b/xen/arch/x86/memory.c
@@ -1573,10 +1573,26 @@ int do_update_va_mapping(unsigned long page_nr,
&shadow_linear_pg_table[page_nr])))) )
{
/*
- * Since L2's are guranteed RW, failure indicates the page was not
- * shadowed, so ignore.
+ * Since L2's are guranteed RW, failure indicates either that the
+ * page was not shadowed, or that the L2 entry has not yet been
+ * updated to reflect the shadow.
*/
- perfc_incrc(shadow_update_va_fail);
+ unsigned l2_idx = page_nr >> (L2_PAGETABLE_SHIFT - L1_PAGETABLE_SHIFT);
+ l2_pgentry_t gpde = linear_l2_table[l2_idx];
+ unsigned long gpfn = l2_pgentry_val(gpde) >> PAGE_SHIFT;
+
+ if (get_shadow_status(&d->mm, gpfn))
+ {
+ unsigned long *gl1e = map_domain_mem(gpfn << PAGE_SHIFT);
+ unsigned l1_idx = page_nr & (ENTRIES_PER_L1_PAGETABLE - 1);
+ gl1e[l1_idx] = sval;
+ unmap_domain_mem(gl1e);
+ put_shadow_status(&d->mm);
+
+ perfc_incrc(shadow_update_va_fail1);
+ }
+ else
+ perfc_incrc(shadow_update_va_fail2);
}
/*
diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c
index 41ac65177a..01d67d43ad 100644
--- a/xen/arch/x86/shadow.c
+++ b/xen/arch/x86/shadow.c
@@ -794,7 +794,7 @@ static int check_l1_table(
BUG(); \
} while ( 0 )
-int check_pagetable(struct mm_struct *m, pagetable_t pt, char *s)
+int _check_pagetable(struct mm_struct *m, pagetable_t pt, char *s)
{
unsigned long gptbase = pagetable_val(pt);
unsigned long gpfn, spfn;
diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h
index 33172926ef..97082e5964 100644
--- a/xen/include/asm-x86/shadow.h
+++ b/xen/include/asm-x86/shadow.h
@@ -573,7 +573,8 @@ static inline void shadow_mk_pagetable(struct mm_struct *mm)
}
#if SHADOW_DEBUG
-extern int check_pagetable(struct mm_struct *m, pagetable_t pt, char *s);
+extern int _check_pagetable(struct mm_struct *m, pagetable_t pt, char *s);
+#define check_pagetable(m, pt, s) _check_pagetable(m, pt, s)
#else
#define check_pagetable(m, pt, s) ((void)0)
#endif
diff --git a/xen/include/xen/perfc_defn.h b/xen/include/xen/perfc_defn.h
index f6868d78b9..d5dc9436ff 100644
--- a/xen/include/xen/perfc_defn.h
+++ b/xen/include/xen/perfc_defn.h
@@ -25,7 +25,8 @@ PERFCOUNTER_CPU( shadow_l2_table_count, "shadow_l2_table count" )
PERFCOUNTER_CPU( shadow_l1_table_count, "shadow_l1_table count" )
PERFCOUNTER_CPU( unshadow_table_count, "unshadow_table count" )
PERFCOUNTER_CPU( shadow_fixup_count, "shadow_fixup count" )
-PERFCOUNTER_CPU( shadow_update_va_fail, "shadow_update_va_fail" )
+PERFCOUNTER_CPU( shadow_update_va_fail1, "shadow_update_va_fail1" )
+PERFCOUNTER_CPU( shadow_update_va_fail2, "shadow_update_va_fail2" )
/* STATUS counters do not reset when 'P' is hit */
PERFSTATUS( shadow_l2_pages, "current # shadow L2 pages" )