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
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to