svn commit: r356860 - in head/sys: powerpc/aim powerpc/powerpc tools

Justin Hibbits jhibbits at FreeBSD.org
Sat Jan 18 02:39:39 UTC 2020


Author: jhibbits
Date: Sat Jan 18 02:39:38 2020
New Revision: 356860
URL: https://svnweb.freebsd.org/changeset/base/356860

Log:
  Add a 'SINGLETON' directive to kobj interface definition
  
  Summary:
  This makes the interface described in the definition file act like a
  pseudo-IFUNC service, by caching the found method locally.
  
  Applying this to the PowerPC MMU definitions, it yields a significant
  (15-20%) performance improvement, seen in both a 'make buildworld' and a
  parallel build of LLVM, on a POWER9 system.
  
  Reviewed By:	imp
  Differential Revision:	https://reviews.freebsd.org/D23245

Modified:
  head/sys/powerpc/aim/moea64_if.m
  head/sys/powerpc/powerpc/mmu_if.m
  head/sys/tools/makeobjops.awk

Modified: head/sys/powerpc/aim/moea64_if.m
==============================================================================
--- head/sys/powerpc/aim/moea64_if.m	Sat Jan 18 01:29:02 2020	(r356859)
+++ head/sys/powerpc/aim/moea64_if.m	Sat Jan 18 02:39:38 2020	(r356860)
@@ -43,6 +43,7 @@
  */
 
 INTERFACE moea64;
+SINGLETON;
 
 CODE {
 	static moea64_pte_replace_t moea64_pte_replace_default;

Modified: head/sys/powerpc/powerpc/mmu_if.m
==============================================================================
--- head/sys/powerpc/powerpc/mmu_if.m	Sat Jan 18 01:29:02 2020	(r356859)
+++ head/sys/powerpc/powerpc/mmu_if.m	Sat Jan 18 02:39:38 2020	(r356860)
@@ -46,6 +46,7 @@
  */
 
 INTERFACE mmu;
+SINGLETON;
 
 #
 # Default implementations of some methods

Modified: head/sys/tools/makeobjops.awk
==============================================================================
--- head/sys/tools/makeobjops.awk	Sat Jan 18 01:29:02 2020	(r356859)
+++ head/sys/tools/makeobjops.awk	Sat Jan 18 02:39:38 2020	(r356860)
@@ -325,13 +325,18 @@ function handle_method (static, doc)
 		    line_width, length(prototype)));
 	}
 	printh("{");
-	printh("\tkobjop_t _m;");
+	if (singleton)
+		printh("\tstatic kobjop_t _m;");
+	else
+		printh("\tkobjop_t _m;");
 	if (ret != "void")
 		printh("\t" ret " rc;");
 	if (!static)
 		firstvar = "((kobj_t)" firstvar ")";
 	if (prolog != "")
 		printh(prolog);
+	if (singleton)
+		printh("\tif (_m == NULL)");
 	printh("\tKOBJOPLOOKUP(" firstvar "->ops," mname ");");
 	rceq = (ret != "void") ? "rc = " : "";
 	printh("\t" rceq "((" mname "_t *) _m)(" varname_list ");");
@@ -453,6 +458,7 @@ for (file_i = 0; file_i < num_files; file_i++) {
 	lastdoc = "";
 	prolog = "";
 	epilog = "";
+	singleton = 0;
 
 	while (!error && (getline < src) > 0) {
 		lineno++;
@@ -497,6 +503,8 @@ for (file_i = 0; file_i < num_files; file_i++) {
 			prolog = handle_code();
 		else if (/^EPILOG[ 	]*{$/)
 			epilog = handle_code();
+		else if (/^SINGLETON/)
+			singleton = 1;
 		else {
 			debug($0);
 			warnsrc("Invalid line encountered");


More information about the svn-src-head mailing list