Guest User

Untitled

a guest
Dec 18th, 2019
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 14.62 KB | None | 0 0
  1. commit 11f5859f159e1648fd9ea83ec81f75f137fa6ed4
  2. Author: Yichun Zhang (agentzh) <yichun@openresty.com>
  3. Date:   Sat Nov 2 14:41:54 2019 -0700
  4.  
  5.     optimize: made the stapconf_xxx.h file generation process parallellable on a multi-core system.
  6.    
  7.     A simple stap script's Pass-3 real time reduces from 7.7s to 2.1s when the
  8.     stapconf_xxx.h file does not hit the cache.
  9.  
  10. diff --git a/buildrun.cxx b/buildrun.cxx
  11. index a6cb066b4..505842036 100644
  12. --- a/buildrun.cxx
  13. +++ b/buildrun.cxx
  14. @@ -165,6 +165,8 @@ static void
  15.  output_autoconf(systemtap_session& s, ofstream& o, const char *autoconf_c,
  16.                  const char *deftrue, const char *deffalse)
  17.  {
  18. +  s.autoconf_cs.push_back (autoconf_c);
  19. +  o << endl << s.tmpdir << "/" << autoconf_c << ".h:" << endl;
  20.    o << "\t";
  21.    if (s.verbose < 4)
  22.      o << "@";
  23. @@ -183,12 +185,8 @@ output_autoconf(systemtap_session& s, ofstream& o, const char *autoconf_c,
  24.  void output_exportconf(systemtap_session& s, ofstream& o, const char *symbol,
  25.                       const char *deftrue)
  26.  {
  27. -  o << "\t";
  28. -  if (s.verbose < 4)
  29. -    o << "@";
  30.    if (s.kernel_exports.find(symbol) != s.kernel_exports.end())
  31. -    o << "echo \"#define " << deftrue << " 1\"";
  32. -  o << ">> $@" << endl;
  33. +    o << "#define " << deftrue << " 1" << endl;
  34.  }
  35.  
  36.  
  37. @@ -196,13 +194,9 @@ void output_dual_exportconf(systemtap_session& s, ofstream& o,
  38.                 const char *symbol1, const char *symbol2,
  39.                 const char *deftrue)
  40.  {
  41. -  o << "\t";
  42. -  if (s.verbose < 4)
  43. -    o << "@";
  44.    if (s.kernel_exports.find(symbol1) != s.kernel_exports.end()
  45.        && s.kernel_exports.find(symbol2) != s.kernel_exports.end())
  46. -    o << "echo \"#define " << deftrue << " 1\"";
  47. -  o << ">> $@" << endl;
  48. +    o << "#define " << deftrue << " 1" << endl;
  49.  }
  50.  
  51.  
  52. @@ -210,13 +204,9 @@ void output_either_exportconf(systemtap_session& s, ofstream& o,
  53.                   const char *symbol1, const char *symbol2,
  54.                   const char *deftrue)
  55.  {
  56. -  o << "\t";
  57. -  if (s.verbose < 4)
  58. -    o << "@";
  59.    if (s.kernel_exports.find(symbol1) != s.kernel_exports.end()
  60.        || s.kernel_exports.find(symbol2) != s.kernel_exports.end())
  61. -    o << "echo \"#define " << deftrue << " 1\"";
  62. -  o << ">> $@" << endl;
  63. +    o << "#define " << deftrue << " 1" << endl;
  64.  }
  65.  
  66.  
  67. @@ -281,6 +271,9 @@ compile_pass (systemtap_session& s)
  68.    string makefile_nm = s.tmpdir + "/Makefile";
  69.    ofstream o (makefile_nm.c_str());
  70.  
  71. +  string stap_export_nm = s.tmpdir + "/stapconf_export.h";
  72. +  ofstream o2 (stap_export_nm.c_str());
  73. +
  74.    // Create makefile
  75.  
  76.    // Clever hacks copied from vmware modules
  77. @@ -332,32 +325,37 @@ compile_pass (systemtap_session& s)
  78.    // since such headers are cleansed of _KERNEL_ pieces that we need
  79.  
  80.    o << "STAPCONF_HEADER := " << s.tmpdir << "/" << s.stapconf_name << endl;
  81. +  o << ".DELETE_ON_ERROR: $(STAPCONF_HEADER)" << endl;
  82.    o << "$(STAPCONF_HEADER):" << endl;
  83. -  o << "\t@> $@" << endl;
  84. +  o << "\t";
  85. +  if (s.verbose < 4)
  86. +    o << "@";
  87. +  o << "$(MAKE) -f \"$(firstword $(MAKEFILE_LIST))\" gen-stapconf" << endl;
  88. +
  89.    output_autoconf(s, o, "autoconf-hrtimer-rel.c", "STAPCONF_HRTIMER_REL", NULL);
  90. -  output_exportconf(s, o, "hrtimer_get_res", "STAPCONF_HRTIMER_GET_RES");
  91. +  output_exportconf(s, o2, "hrtimer_get_res", "STAPCONF_HRTIMER_GET_RES");
  92.    output_autoconf(s, o, "autoconf-generated-compile.c", "STAPCONF_GENERATED_COMPILE", NULL);
  93.    output_autoconf(s, o, "autoconf-hrtimer-getset-expires.c", "STAPCONF_HRTIMER_GETSET_EXPIRES", NULL);
  94.    output_autoconf(s, o, "autoconf-inode-private.c", "STAPCONF_INODE_PRIVATE", NULL);
  95.    output_autoconf(s, o, "autoconf-inode-rwsem.c", "STAPCONF_INODE_RWSEM", NULL);
  96.    output_autoconf(s, o, "autoconf-constant-tsc.c", "STAPCONF_CONSTANT_TSC", NULL);
  97.    output_autoconf(s, o, "autoconf-ktime-get-real.c", "STAPCONF_KTIME_GET_REAL", NULL);
  98. -  output_exportconf(s, o, "ktime_get_real_fast_ns", "STAPCONF_KTIME_GET_REAL_FAST_NS");
  99. +  output_exportconf(s, o2, "ktime_get_real_fast_ns", "STAPCONF_KTIME_GET_REAL_FAST_NS");
  100.    output_autoconf(s, o, "autoconf-x86-uniregs.c", "STAPCONF_X86_UNIREGS", NULL);
  101.    output_autoconf(s, o, "autoconf-nameidata.c", "STAPCONF_NAMEIDATA_CLEANUP", NULL);
  102. -  output_dual_exportconf(s, o, "unregister_kprobes", "unregister_kretprobes", "STAPCONF_UNREGISTER_KPROBES");
  103. +  output_dual_exportconf(s, o2, "unregister_kprobes", "unregister_kretprobes", "STAPCONF_UNREGISTER_KPROBES");
  104.    output_autoconf(s, o, "autoconf-kprobe-symbol-name.c", "STAPCONF_KPROBE_SYMBOL_NAME", NULL);
  105.    output_autoconf(s, o, "autoconf-real-parent.c", "STAPCONF_REAL_PARENT", NULL);
  106.    output_autoconf(s, o, "autoconf-uaccess.c", "STAPCONF_LINUX_UACCESS_H", NULL);
  107.    output_autoconf(s, o, "autoconf-oneachcpu-retry.c", "STAPCONF_ONEACHCPU_RETRY", NULL);
  108.    output_autoconf(s, o, "autoconf-dpath-path.c", "STAPCONF_DPATH_PATH", NULL);
  109. -  output_exportconf(s, o, "synchronize_kernel", "STAPCONF_SYNCHRONIZE_KERNEL");
  110. -  output_exportconf(s, o, "synchronize_rcu", "STAPCONF_SYNCHRONIZE_RCU");
  111. -  output_exportconf(s, o, "synchronize_sched", "STAPCONF_SYNCHRONIZE_SCHED");
  112. +  output_exportconf(s, o2, "synchronize_kernel", "STAPCONF_SYNCHRONIZE_KERNEL");
  113. +  output_exportconf(s, o2, "synchronize_rcu", "STAPCONF_SYNCHRONIZE_RCU");
  114. +  output_exportconf(s, o2, "synchronize_sched", "STAPCONF_SYNCHRONIZE_SCHED");
  115.    output_autoconf(s, o, "autoconf-task-uid.c", "STAPCONF_TASK_UID", NULL);
  116.    output_autoconf(s, o, "autoconf-from_kuid_munged.c", "STAPCONF_FROM_KUID_MUNGED", NULL);
  117. -  output_exportconf(s, o, "get_mm_exe_file", "STAPCONF_GET_MM_EXE_FILE");
  118. -  output_dual_exportconf(s, o, "alloc_vm_area", "free_vm_area", "STAPCONF_VM_AREA");
  119. +  output_exportconf(s, o2, "get_mm_exe_file", "STAPCONF_GET_MM_EXE_FILE");
  120. +  output_dual_exportconf(s, o2, "alloc_vm_area", "free_vm_area", "STAPCONF_VM_AREA");
  121.    output_autoconf(s, o, "autoconf-procfs-owner.c", "STAPCONF_PROCFS_OWNER", NULL);
  122.    output_autoconf(s, o, "autoconf-alloc-percpu-align.c", "STAPCONF_ALLOC_PERCPU_ALIGN", NULL);
  123.    output_autoconf(s, o, "autoconf-x86-fs.c", "STAPCONF_X86_FS", NULL);
  124. @@ -369,15 +367,15 @@ compile_pass (systemtap_session& s)
  125.    output_autoconf(s, o, "autoconf-utrace-regset.c", "STAPCONF_UTRACE_REGSET", NULL);
  126.    output_autoconf(s, o, "autoconf-uprobe-get-pc.c", "STAPCONF_UPROBE_GET_PC", NULL);
  127.    output_autoconf(s, o, "autoconf-hlist-4args.c", "STAPCONF_HLIST_4ARGS", NULL);
  128. -  output_exportconf(s, o, "tsc_khz", "STAPCONF_TSC_KHZ");
  129. -  output_exportconf(s, o, "cpu_khz", "STAPCONF_CPU_KHZ");
  130. -  output_exportconf(s, o, "__module_text_address", "STAPCONF_MODULE_TEXT_ADDRESS");
  131. -  output_exportconf(s, o, "add_timer_on", "STAPCONF_ADD_TIMER_ON");
  132. +  output_exportconf(s, o2, "tsc_khz", "STAPCONF_TSC_KHZ");
  133. +  output_exportconf(s, o2, "cpu_khz", "STAPCONF_CPU_KHZ");
  134. +  output_exportconf(s, o2, "__module_text_address", "STAPCONF_MODULE_TEXT_ADDRESS");
  135. +  output_exportconf(s, o2, "add_timer_on", "STAPCONF_ADD_TIMER_ON");
  136.  
  137. -  output_dual_exportconf(s, o, "probe_kernel_read", "probe_kernel_write", "STAPCONF_PROBE_KERNEL");
  138. +  output_dual_exportconf(s, o2, "probe_kernel_read", "probe_kernel_write", "STAPCONF_PROBE_KERNEL");
  139.    output_autoconf(s, o, "autoconf-hw_breakpoint_context.c",
  140.           "STAPCONF_HW_BREAKPOINT_CONTEXT", NULL);
  141. -  output_exportconf(s, o, "save_stack_trace_regs", "STAPCONF_SAVE_STACK_TRACE_REGS_EXPORTED");
  142. +  output_exportconf(s, o2, "save_stack_trace_regs", "STAPCONF_SAVE_STACK_TRACE_REGS_EXPORTED");
  143.    output_autoconf(s, o, "autoconf-save-stack-trace.c",
  144.                    "STAPCONF_KERNEL_STACKTRACE", NULL);
  145.    output_autoconf(s, o, "autoconf-save-stack-trace-no-bp.c",
  146. @@ -405,12 +403,12 @@ compile_pass (systemtap_session& s)
  147.           "STAPCONF_PERF_COUNTER_CONTEXT", NULL);
  148.    output_autoconf(s, o, "perf_probe_handler_nmi.c",
  149.           "STAPCONF_PERF_HANDLER_NMI", NULL);
  150. -  output_exportconf(s, o, "path_lookup", "STAPCONF_PATH_LOOKUP");
  151. -  output_exportconf(s, o, "kern_path_parent", "STAPCONF_KERN_PATH_PARENT");
  152. -  output_exportconf(s, o, "vfs_path_lookup", "STAPCONF_VFS_PATH_LOOKUP");
  153. -  output_exportconf(s, o, "kern_path", "STAPCONF_KERN_PATH");
  154. -  output_exportconf(s, o, "proc_create_data", "STAPCONF_PROC_CREATE_DATA");
  155. -  output_exportconf(s, o, "PDE_DATA", "STAPCONF_PDE_DATA");
  156. +  output_exportconf(s, o2, "path_lookup", "STAPCONF_PATH_LOOKUP");
  157. +  output_exportconf(s, o2, "kern_path_parent", "STAPCONF_KERN_PATH_PARENT");
  158. +  output_exportconf(s, o2, "vfs_path_lookup", "STAPCONF_VFS_PATH_LOOKUP");
  159. +  output_exportconf(s, o2, "kern_path", "STAPCONF_KERN_PATH");
  160. +  output_exportconf(s, o2, "proc_create_data", "STAPCONF_PROC_CREATE_DATA");
  161. +  output_exportconf(s, o2, "PDE_DATA", "STAPCONF_PDE_DATA");
  162.    output_autoconf(s, o, "autoconf-module-sect-attrs.c", "STAPCONF_MODULE_SECT_ATTRS", NULL);
  163.  
  164.    output_autoconf(s, o, "autoconf-utrace-via-tracepoints.c", "STAPCONF_UTRACE_VIA_TRACEPOINTS", NULL);
  165. @@ -436,38 +434,38 @@ compile_pass (systemtap_session& s)
  166.    output_autoconf(s, o, "autoconf-local-clock.c", "STAPCONF_LOCAL_CLOCK", NULL);
  167.    
  168.    // used by runtime/uprobe-inode.c
  169. -  output_either_exportconf(s, o, "uprobe_register", "register_uprobe",
  170. +  output_either_exportconf(s, o2, "uprobe_register", "register_uprobe",
  171.                "STAPCONF_UPROBE_REGISTER_EXPORTED");
  172. -  output_either_exportconf(s, o, "uprobe_unregister", "unregister_uprobe",
  173. +  output_either_exportconf(s, o2, "uprobe_unregister", "unregister_uprobe",
  174.                "STAPCONF_UPROBE_UNREGISTER_EXPORTED");
  175.    output_autoconf(s, o, "autoconf-old-inode-uprobes.c", "STAPCONF_OLD_INODE_UPROBES", NULL);
  176.    output_autoconf(s, o, "autoconf-inode-uretprobes.c", "STAPCONF_INODE_URETPROBES", NULL);
  177.  
  178.    // used by tapsets.cxx inode uprobe generated code
  179. -  output_exportconf(s, o, "uprobe_get_swbp_addr", "STAPCONF_UPROBE_GET_SWBP_ADDR_EXPORTED");
  180. +  output_exportconf(s, o2, "uprobe_get_swbp_addr", "STAPCONF_UPROBE_GET_SWBP_ADDR_EXPORTED");
  181.  
  182.    // used by runtime/loc2c-runtime.h
  183. -  output_exportconf(s, o, "task_user_regset_view", "STAPCONF_TASK_USER_REGSET_VIEW_EXPORTED");
  184. +  output_exportconf(s, o2, "task_user_regset_view", "STAPCONF_TASK_USER_REGSET_VIEW_EXPORTED");
  185.  
  186.    // used by runtime/stp_utrace.c
  187. -  output_exportconf(s, o, "task_work_add", "STAPCONF_TASK_WORK_ADD_EXPORTED");
  188. -  output_exportconf(s, o, "task_work_cancel", "STAPCONF_TASK_WORK_CANCEL_EXPORTED");  
  189. -  output_exportconf(s, o, "wake_up_state", "STAPCONF_WAKE_UP_STATE_EXPORTED");
  190. -  output_exportconf(s, o, "try_to_wake_up", "STAPCONF_TRY_TO_WAKE_UP_EXPORTED");
  191. -  output_exportconf(s, o, "signal_wake_up_state", "STAPCONF_SIGNAL_WAKE_UP_STATE_EXPORTED");
  192. -  output_exportconf(s, o, "signal_wake_up", "STAPCONF_SIGNAL_WAKE_UP_EXPORTED");
  193. -  output_exportconf(s, o, "__lock_task_sighand", "STAPCONF___LOCK_TASK_SIGHAND_EXPORTED");
  194. +  output_exportconf(s, o2, "task_work_add", "STAPCONF_TASK_WORK_ADD_EXPORTED");
  195. +  output_exportconf(s, o2, "task_work_cancel", "STAPCONF_TASK_WORK_CANCEL_EXPORTED");
  196. +  output_exportconf(s, o2, "wake_up_state", "STAPCONF_WAKE_UP_STATE_EXPORTED");
  197. +  output_exportconf(s, o2, "try_to_wake_up", "STAPCONF_TRY_TO_WAKE_UP_EXPORTED");
  198. +  output_exportconf(s, o2, "signal_wake_up_state", "STAPCONF_SIGNAL_WAKE_UP_STATE_EXPORTED");
  199. +  output_exportconf(s, o2, "signal_wake_up", "STAPCONF_SIGNAL_WAKE_UP_EXPORTED");
  200. +  output_exportconf(s, o2, "__lock_task_sighand", "STAPCONF___LOCK_TASK_SIGHAND_EXPORTED");
  201.  
  202.    output_autoconf(s, o, "autoconf-pagefault_disable.c", "STAPCONF_PAGEFAULT_DISABLE", NULL);
  203. -  output_exportconf(s, o, "kallsyms_lookup_name", "STAPCONF_KALLSYMS");
  204. +  output_exportconf(s, o2, "kallsyms_lookup_name", "STAPCONF_KALLSYMS");
  205.    output_autoconf(s, o, "autoconf-uidgid.c", "STAPCONF_LINUX_UIDGID_H", NULL);
  206. -  output_exportconf(s, o, "sigset_from_compat", "STAPCONF_SIGSET_FROM_COMPAT_EXPORTED");
  207. -  output_exportconf(s, o, "vzalloc", "STAPCONF_VZALLOC");
  208. -  output_exportconf(s, o, "vzalloc_node", "STAPCONF_VZALLOC_NODE");
  209. -  output_exportconf(s, o, "vmalloc_node", "STAPCONF_VMALLOC_NODE");
  210. +  output_exportconf(s, o2, "sigset_from_compat", "STAPCONF_SIGSET_FROM_COMPAT_EXPORTED");
  211. +  output_exportconf(s, o2, "vzalloc", "STAPCONF_VZALLOC");
  212. +  output_exportconf(s, o2, "vzalloc_node", "STAPCONF_VZALLOC_NODE");
  213. +  output_exportconf(s, o2, "vmalloc_node", "STAPCONF_VMALLOC_NODE");
  214.  
  215.    // RHBZ1233912 - s390 temporary workaround for non-atomic udelay()
  216. -  output_exportconf(s, o, "udelay_simple", "STAPCONF_UDELAY_SIMPLE_EXPORTED");
  217. +  output_exportconf(s, o2, "udelay_simple", "STAPCONF_UDELAY_SIMPLE_EXPORTED");
  218.    output_autoconf(s, o, "autoconf-udelay_simple.c", "STAPCONF_UDELAY_SIMPLE",
  219.           NULL);
  220.  
  221. @@ -478,7 +476,7 @@ compile_pass (systemtap_session& s)
  222.           "STAPCONF_MODULE_LAYOUT", NULL);
  223.    output_autoconf(s, o, "autoconf-mod_kallsyms.c",
  224.           "STAPCONF_MOD_KALLSYMS", NULL);
  225. -  output_exportconf(s, o, "get_user_pages_remote", "STAPCONF_GET_USER_PAGES_REMOTE");
  226. +  output_exportconf(s, o2, "get_user_pages_remote", "STAPCONF_GET_USER_PAGES_REMOTE");
  227.    output_autoconf(s, o, "autoconf-get_user_pages_remote-flags.c",
  228.           "STAPCONF_GET_USER_PAGES_REMOTE_FLAGS", NULL);
  229.    output_autoconf(s, o, "autoconf-get_user_pages_remote-flags_locked.c",
  230. @@ -492,10 +490,23 @@ compile_pass (systemtap_session& s)
  231.           "STAPCONF_STACK_TRACE_SAVE_REGS", NULL);
  232.  
  233.    // used by runtime/linux/netfilter.c
  234. -  output_exportconf(s, o, "nf_register_hook", "STAPCONF_NF_REGISTER_HOOK");
  235. +  output_exportconf(s, o2, "nf_register_hook", "STAPCONF_NF_REGISTER_HOOK");
  236.  
  237.    // used by tapset/linux/ioblock.stp
  238. -  output_exportconf(s, o, "disk_get_part", "STAPCONF_DISK_GET_PART");
  239. +  output_exportconf(s, o2, "disk_get_part", "STAPCONF_DISK_GET_PART");
  240. +
  241. +  o << ".PHONY: gen-stapconf" << endl;
  242. +  o << "gen-stapconf: stapconf_export.h";
  243. +  for (unsigned i=0; i<s.autoconf_cs.size(); i++)
  244. +    o << " " << s.tmpdir << "/" << s.autoconf_cs[i] << ".h";
  245. +  o << endl;
  246. +
  247. +  s.autoconf_cs.clear ();  // just to save a bit of memory
  248. +
  249. +  o << "\t";
  250. +  if (s.verbose < 4)
  251. +    o << "@";
  252. +  o << "cat $^ > $(STAPCONF_HEADER)" << endl;
  253.  
  254.    o << module_cflags << " += -include $(STAPCONF_HEADER)" << endl;
  255.  
  256. diff --git a/session.cxx b/session.cxx
  257. index 0d6b71626..088804454 100644
  258. --- a/session.cxx
  259. +++ b/session.cxx
  260. @@ -425,6 +425,8 @@ systemtap_session::systemtap_session (const systemtap_session& other,
  261.  
  262.    print_modidx = other.print_modidx;
  263.  
  264. +  autoconf_cs = other.autoconf_cs;
  265. +
  266.    create_tmp_dir();
  267.  }
  268.  
  269. diff --git a/session.h b/session.h
  270. index 07152a86b..1b2b6e30b 100644
  271. --- a/session.h
  272. +++ b/session.h
  273. @@ -448,6 +448,9 @@ public:
  274.    int suppressed_errors;
  275.    int warningerr_count; // see comment in systemtap_session::print_error
  276.  
  277. +  // autoconf C files
  278. +  std::vector<std::string> autoconf_cs;
  279. +
  280.    // Returns number of critical errors (not counting those part of warnings)
  281.    unsigned num_errors ()
  282.      {
Add Comment
Please, Sign In to add comment