svn commit: r338312 - in head/sys: amd64/amd64 i386/i386 i386/include x86/x86

Konstantin Belousov kib at FreeBSD.org
Sat Aug 25 15:21:30 UTC 2018


Author: kib
Date: Sat Aug 25 15:21:28 2018
New Revision: 338312
URL: https://svnweb.freebsd.org/changeset/base/338312

Log:
  Unify amd64 and i386 vmspace0 pmap activation.
  
  Add pmap_activate_boot() for i386, move the invocation on APs from MD
  init_secondary() to x86 init_secondary_tail().
  
  Suggested by:	alc
  Reviewed by:	alc, markj
  Sponsored by:	The FreeBSD Foundation
  Approved by:	re (marius)
  MFC after:	1 week
  Differential revision:	https://reviews.freebsd.org/D16893

Modified:
  head/sys/amd64/amd64/mp_machdep.c
  head/sys/i386/i386/pmap.c
  head/sys/i386/include/pmap.h
  head/sys/x86/x86/mp_x86.c

Modified: head/sys/amd64/amd64/mp_machdep.c
==============================================================================
--- head/sys/amd64/amd64/mp_machdep.c	Sat Aug 25 10:42:44 2018	(r338311)
+++ head/sys/amd64/amd64/mp_machdep.c	Sat Aug 25 15:21:28 2018	(r338312)
@@ -58,7 +58,6 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_param.h>
 #include <vm/pmap.h>
 #include <vm/vm_kern.h>
-#include <vm/vm_map.h>
 #include <vm/vm_extern.h>
 
 #include <x86/apicreg.h>
@@ -343,7 +342,6 @@ init_secondary(void)
 	while (atomic_load_acq_int(&aps_ready) == 0)
 		ia32_pause();
 
-	pmap_activate_boot(vmspace_pmap(proc0.p_vmspace));
 	init_secondary_tail();
 }
 

Modified: head/sys/i386/i386/pmap.c
==============================================================================
--- head/sys/i386/i386/pmap.c	Sat Aug 25 10:42:44 2018	(r338311)
+++ head/sys/i386/i386/pmap.c	Sat Aug 25 15:21:28 2018	(r338312)
@@ -2000,9 +2000,9 @@ pmap_pinit0(pmap_t pmap)
 #endif
 	pmap->pm_root.rt_root = 0;
 	CPU_ZERO(&pmap->pm_active);
-	PCPU_SET(curpmap, pmap);
 	TAILQ_INIT(&pmap->pm_pvchunk);
 	bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
+	pmap_activate_boot(pmap);
 }
 
 /*
@@ -5802,6 +5802,20 @@ pmap_activate(struct thread *td)
 	td->td_pcb->pcb_cr3 = cr3;
 	PCPU_SET(curpmap, pmap);
 	critical_exit();
+}
+
+void
+pmap_activate_boot(pmap_t pmap)
+{
+	u_int cpuid;
+
+	cpuid = PCPU_GET(cpuid);
+#if defined(SMP)
+	CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
+#else
+	CPU_SET(cpuid, &pmap->pm_active);
+#endif
+	PCPU_SET(curpmap, pmap);
 }
 
 void

Modified: head/sys/i386/include/pmap.h
==============================================================================
--- head/sys/i386/include/pmap.h	Sat Aug 25 10:42:44 2018	(r338311)
+++ head/sys/i386/include/pmap.h	Sat Aug 25 15:21:28 2018	(r338312)
@@ -373,6 +373,7 @@ extern vm_offset_t virtual_end;
  * is called: pmap_kenter(), pmap_kextract(), pmap_kremove(), vtophys(), and
  * vtopte().
  */
+void	pmap_activate_boot(pmap_t pmap);
 void	pmap_bootstrap(vm_paddr_t);
 int	pmap_cache_bits(pmap_t, int mode, boolean_t is_pde);
 int	pmap_change_attr(vm_offset_t, vm_size_t, int);

Modified: head/sys/x86/x86/mp_x86.c
==============================================================================
--- head/sys/x86/x86/mp_x86.c	Sat Aug 25 10:42:44 2018	(r338311)
+++ head/sys/x86/x86/mp_x86.c	Sat Aug 25 15:21:28 2018	(r338312)
@@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$");
 #include <vm/pmap.h>
 #include <vm/vm_kern.h>
 #include <vm/vm_extern.h>
+#include <vm/vm_map.h>
 
 #include <x86/apicreg.h>
 #include <machine/clock.h>
@@ -966,6 +967,8 @@ void
 init_secondary_tail(void)
 {
 	u_int cpuid;
+
+	pmap_activate_boot(vmspace_pmap(proc0.p_vmspace));
 
 	/*
 	 * On real hardware, switch to x2apic mode if possible.  Do it


More information about the svn-src-head mailing list