Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Dec 2013 11:13:37 +0000 (UTC)
From:      "Cherry G. Mathew" <cherry@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r259098 - projects/amd64_xen_pv/sys/amd64/xen
Message-ID:  <201312081113.rB8BDbub031491@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cherry
Date: Sun Dec  8 11:13:37 2013
New Revision: 259098
URL: http://svnweb.freebsd.org/changeset/base/259098

Log:
  - We don't support Process Context Identifiers (PCID) (the x86 version of ASIDs) yet.
  - You've got to flush that TLB when you've got to flush that TLB (as
    soon as the new user pmap has been loaded).
  - Do not destroy the pmap lock when a pmap is destroyed. The zone
    .init()/.fini() lock handling is leaky.
  - Remove stray #include
  
  These changes now enable fork(2) to succeed, and both parent and child
  to make progress.
  
  Next stop, exec(2)
  
  Approved by: gibbs(implicit)

Modified:
  projects/amd64_xen_pv/sys/amd64/xen/pmap.c

Modified: projects/amd64_xen_pv/sys/amd64/xen/pmap.c
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/pmap.c	Sun Dec  8 11:03:29 2013	(r259097)
+++ projects/amd64_xen_pv/sys/amd64/xen/pmap.c	Sun Dec  8 11:13:37 2013	(r259098)
@@ -761,6 +761,7 @@ pmap_pinit0(pmap_t pmap)
 	PCPU_SET(curpmap, pmap);
 	pmap_pv_pmap_init(pmap);
 	bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
+	pmap->pm_pcid = -1;
 }
 
 int
@@ -815,6 +816,7 @@ void pmap_xen_userload(pmap_t pmap)
 		PT_SET_VA_MA((pml4_entry_t *)KPML4phys + i, pml4e, false);
 	}
 	PT_UPDATES_FLUSH();
+	invltlb();
 
 	/* Tell xen about user pmap switch */
 	xen_pt_user_switch(pmap->pm_cr3);
@@ -826,13 +828,18 @@ pmap_release(pmap_t pmap)
 	KASSERT(pmap != kernel_pmap,
 		("%s: kernel pmap released", __func__));
 
+	KASSERT(pmap->pm_stats.resident_count == 0,
+	    ("pmap_release: pmap resident count %ld != 0",
+	    pmap->pm_stats.resident_count));
+
+	KASSERT(vm_radix_is_empty(&pmap->pm_root),
+	    ("pmap_release: pmap has reserved page table page(s)"));
+
 	xen_pgdir_unpin(pmap->pm_cr3);
 	pmap_xen_setpages_rw((uintptr_t)pmap->pm_pml4, 1);
 
 	bzero(pmap->pm_pml4, PAGE_SIZE);
 	kmem_free(kernel_arena, (vm_offset_t)pmap->pm_pml4, PAGE_SIZE);
-
-	PMAP_LOCK_DESTROY(pmap);
 }
 
 static pt_entry_t *
@@ -1005,8 +1012,6 @@ pmap_qremove(vm_offset_t sva, int count)
 	// XXX: TODO: pmap_invalidate_range(kernel_pmap, sva, va);
 }
 
-#include <ddb/ddb.h>
-
 static void
 pmap_enter_locked(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m,
     vm_prot_t prot, boolean_t wired)



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