svn commit: r313862 - in stable/11/sys/i386: i386 include
Jason A. Harmening
jah at FreeBSD.org
Fri Feb 17 07:08:39 UTC 2017
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)
More information about the svn-src-stable
mailing list