Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Nov 2010 22:06:08 +0000 (UTC)
From:      Colin Percival <cperciva@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r215844 - head/sys/i386/xen
Message-ID:  <201011252206.oAPM68sj018992@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cperciva
Date: Thu Nov 25 22:06:07 2010
New Revision: 215844
URL: http://svn.freebsd.org/changeset/base/215844

Log:
  Revert r215819 and fix the bug properly.  In pmap_qremove, paging table
  updates were being queued by pmap_kremove, but the queue wasn't being
  flushed; as a result, the updates didn't happen until *after* the call
  to pmap_invalidate_range, and old entries could stick around in the TLB.
  Adding a PT_UPDATES_FLUSH() call immediately before pmap_invalidate_range
  ensures that after the invalidation the TLB will be repopulated with the
  correct new entries.
  
  Thanks to:	kib, avg, alc

Modified:
  head/sys/i386/xen/pmap.c

Modified: head/sys/i386/xen/pmap.c
==============================================================================
--- head/sys/i386/xen/pmap.c	Thu Nov 25 21:51:43 2010	(r215843)
+++ head/sys/i386/xen/pmap.c	Thu Nov 25 22:06:07 2010	(r215844)
@@ -1292,19 +1292,7 @@ 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++;
@@ -1348,6 +1336,7 @@ pmap_qremove(vm_offset_t sva, int count)
 		pmap_kremove(va);
 		va += PAGE_SIZE;
 	}
+	PT_UPDATES_FLUSH();
 	pmap_invalidate_range(kernel_pmap, sva, va);
 	critical_exit();
 	vm_page_unlock_queues();



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011252206.oAPM68sj018992>