Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Feb 2017 07:08:37 +0000 (UTC)
From:      "Jason A. Harmening" <jah@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r313862 - in stable/11/sys/i386: i386 include
Message-ID:  <201702170708.v1H78bjt069150@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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)



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