Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 18 Jan 2020 02:39:38 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r356860 - in head/sys: powerpc/aim powerpc/powerpc tools
Message-ID:  <202001180239.00I2dc3D001810@repo.freebsd.org>

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



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