svn commit: r215819 - head/sys/i386/xen
Colin Percival
cperciva at FreeBSD.org
Thu Nov 25 15:41:34 UTC 2010
Author: cperciva
Date: Thu Nov 25 15:41:34 2010
New Revision: 215819
URL: http://svn.freebsd.org/changeset/base/215819
Log:
Work around paging bug. Somehow we seem to be ending up with entries in
the TLB which don't correspond to ptes with PG_V set; prior to this commit
I'm sometimes getting the wrong data when pages are loaded into the buffer
cache (they're being loaded, but the missing TLB invalidation is causing
the wrong data to be visible).
Modified:
head/sys/i386/xen/pmap.c
Modified: head/sys/i386/xen/pmap.c
==============================================================================
--- head/sys/i386/xen/pmap.c Thu Nov 25 15:05:21 2010 (r215818)
+++ head/sys/i386/xen/pmap.c Thu Nov 25 15:41:34 2010 (r215819)
@@ -1292,7 +1292,19 @@ pmap_qenter(vm_offset_t sva, vm_page_t *
mclp->args[0] = va;
mclp->args[1] = (uint32_t)(pa & 0xffffffff);
mclp->args[2] = (uint32_t)(pa >> 32);
+#if 0
mclp->args[3] = (*pte & PG_V) ? UVMF_INVLPG|UVMF_ALL : 0;
+#else
+ /*
+ * Somehow we seem to be ending up with pages which are in
+ * the TLB in spite of not having PG_V set, resulting in
+ * pages newly loaded into the bufcache not showing up
+ * immediately (i.e., accessing them provides the old data).
+ * As a workaround, always perform a TLB flush, even if the
+ * old page didn't have PG_V.
+ */
+ mclp->args[3] = UVMF_INVLPG|UVMF_ALL;
+#endif
va += PAGE_SIZE;
pte++;
More information about the svn-src-head
mailing list