Author: jah
Date: Fri Feb 17 07:08:37 2017
New Revision: 313862
URL: https://svnweb.freebsd.org/changeset/base/313862

Log:
  MFC r312952:
  
  Implement get_pcpu() for i386 and use it to replace pcpu_find(curcpu)
  in the i386 pmap.
  
  The curcpu macro loads the per-cpu data pointer as its first step,
  so the remaining steps of pcpu_find(curcpu) are circular.

Modified:
  stable/11/sys/i386/i386/pmap.c
  stable/11/sys/i386/include/pcpu.h
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/i386/i386/pmap.c
==============================================================================
--- stable/11/sys/i386/i386/pmap.c      Fri Feb 17 06:49:54 2017        
(r313861)
+++ stable/11/sys/i386/i386/pmap.c      Fri Feb 17 07:08:37 2017        
(r313862)
@@ -441,7 +441,7 @@ pmap_bootstrap(vm_paddr_t firstaddr)
         * CMAP1/CMAP2 are used for zeroing and copying pages.
         * CMAP3 is used for the idle process page zeroing.
         */
-       pc = pcpu_find(curcpu);
+       pc = get_pcpu();
        mtx_init(&pc->pc_cmap_lock, "SYSMAPS", NULL, MTX_DEF);
        SYSMAP(caddr_t, pc->pc_cmap_pte1, pc->pc_cmap_addr1, 1)
        SYSMAP(caddr_t, pc->pc_cmap_pte2, pc->pc_cmap_addr2, 1)
@@ -4253,7 +4253,7 @@ pmap_zero_page(vm_page_t m)
        struct pcpu *pc;
 
        sched_pin();
-       pc = pcpu_find(curcpu);
+       pc = get_pcpu();
        cmap_pte2 = pc->pc_cmap_pte2;
        mtx_lock(&pc->pc_cmap_lock);
        if (*cmap_pte2)
@@ -4286,7 +4286,7 @@ pmap_zero_page_area(vm_page_t m, int off
        struct pcpu *pc;
 
        sched_pin();
-       pc = pcpu_find(curcpu);
+       pc = get_pcpu();
        cmap_pte2 = pc->pc_cmap_pte2;
        mtx_lock(&pc->pc_cmap_lock);
        if (*cmap_pte2)
@@ -4337,7 +4337,7 @@ pmap_copy_page(vm_page_t src, vm_page_t 
        struct pcpu *pc;
 
        sched_pin();
-       pc = pcpu_find(curcpu);
+       pc = get_pcpu();
        cmap_pte1 = pc->pc_cmap_pte1; 
        cmap_pte2 = pc->pc_cmap_pte2;
        mtx_lock(&pc->pc_cmap_lock);
@@ -4372,7 +4372,7 @@ pmap_copy_pages(vm_page_t ma[], vm_offse
        int cnt;
 
        sched_pin();
-       pc = pcpu_find(curcpu);
+       pc = get_pcpu();
        cmap_pte1 = pc->pc_cmap_pte1; 
        cmap_pte2 = pc->pc_cmap_pte2;
        mtx_lock(&pc->pc_cmap_lock);
@@ -5368,7 +5368,7 @@ pmap_flush_page(vm_page_t m)
        useclflushopt = (cpu_stdext_feature & CPUID_STDEXT_CLFLUSHOPT) != 0;
        if (useclflushopt || (cpu_feature & CPUID_CLFSH) != 0) {
                sched_pin();
-               pc = pcpu_find(curcpu);
+               pc = get_pcpu();
                cmap_pte2 = pc->pc_cmap_pte2; 
                mtx_lock(&pc->pc_cmap_lock);
                if (*cmap_pte2)

Modified: stable/11/sys/i386/include/pcpu.h
==============================================================================
--- stable/11/sys/i386/include/pcpu.h   Fri Feb 17 06:49:54 2017        
(r313861)
+++ stable/11/sys/i386/include/pcpu.h   Fri Feb 17 07:08:37 2017        
(r313862)
@@ -76,6 +76,7 @@
 
 extern struct pcpu *pcpup;
 
+#define        get_pcpu()              (pcpup)
 #define        PCPU_GET(member)        (pcpup->pc_ ## member)
 #define        PCPU_ADD(member, val)   (pcpup->pc_ ## member += (val))
 #define        PCPU_INC(member)        PCPU_ADD(member, 1)
@@ -196,6 +197,15 @@ extern struct pcpu *pcpup;
        }                                                               \
 } while (0)
 
+#define        get_pcpu() __extension__ ({                                     
\
+       struct pcpu *__pc;                                              \
+                                                                       \
+       __asm __volatile("movl %%fs:%1,%0"                              \
+           : "=r" (__pc)                                               \
+           : "m" (*(struct pcpu *)(__pcpu_offset(pc_prvspace))));      \
+       __pc;                                                           \
+})
+
 #define        PCPU_GET(member)        __PCPU_GET(pc_ ## member)
 #define        PCPU_ADD(member, val)   __PCPU_ADD(pc_ ## member, val)
 #define        PCPU_INC(member)        __PCPU_INC(pc_ ## member)
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to