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");
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to