Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- commit 11f5859f159e1648fd9ea83ec81f75f137fa6ed4
- Author: Yichun Zhang (agentzh) <yichun@openresty.com>
- Date: Sat Nov 2 14:41:54 2019 -0700
- optimize: made the stapconf_xxx.h file generation process parallellable on a multi-core system.
- A simple stap script's Pass-3 real time reduces from 7.7s to 2.1s when the
- stapconf_xxx.h file does not hit the cache.
- diff --git a/buildrun.cxx b/buildrun.cxx
- index a6cb066b4..505842036 100644
- --- a/buildrun.cxx
- +++ b/buildrun.cxx
- @@ -165,6 +165,8 @@ static void
- output_autoconf(systemtap_session& s, ofstream& o, const char *autoconf_c,
- const char *deftrue, const char *deffalse)
- {
- + s.autoconf_cs.push_back (autoconf_c);
- + o << endl << s.tmpdir << "/" << autoconf_c << ".h:" << endl;
- o << "\t";
- if (s.verbose < 4)
- o << "@";
- @@ -183,12 +185,8 @@ output_autoconf(systemtap_session& s, ofstream& o, const char *autoconf_c,
- void output_exportconf(systemtap_session& s, ofstream& o, const char *symbol,
- const char *deftrue)
- {
- - o << "\t";
- - if (s.verbose < 4)
- - o << "@";
- if (s.kernel_exports.find(symbol) != s.kernel_exports.end())
- - o << "echo \"#define " << deftrue << " 1\"";
- - o << ">> $@" << endl;
- + o << "#define " << deftrue << " 1" << endl;
- }
- @@ -196,13 +194,9 @@ void output_dual_exportconf(systemtap_session& s, ofstream& o,
- const char *symbol1, const char *symbol2,
- const char *deftrue)
- {
- - o << "\t";
- - if (s.verbose < 4)
- - o << "@";
- if (s.kernel_exports.find(symbol1) != s.kernel_exports.end()
- && s.kernel_exports.find(symbol2) != s.kernel_exports.end())
- - o << "echo \"#define " << deftrue << " 1\"";
- - o << ">> $@" << endl;
- + o << "#define " << deftrue << " 1" << endl;
- }
- @@ -210,13 +204,9 @@ void output_either_exportconf(systemtap_session& s, ofstream& o,
- const char *symbol1, const char *symbol2,
- const char *deftrue)
- {
- - o << "\t";
- - if (s.verbose < 4)
- - o << "@";
- if (s.kernel_exports.find(symbol1) != s.kernel_exports.end()
- || s.kernel_exports.find(symbol2) != s.kernel_exports.end())
- - o << "echo \"#define " << deftrue << " 1\"";
- - o << ">> $@" << endl;
- + o << "#define " << deftrue << " 1" << endl;
- }
- @@ -281,6 +271,9 @@ compile_pass (systemtap_session& s)
- string makefile_nm = s.tmpdir + "/Makefile";
- ofstream o (makefile_nm.c_str());
- + string stap_export_nm = s.tmpdir + "/stapconf_export.h";
- + ofstream o2 (stap_export_nm.c_str());
- +
- // Create makefile
- // Clever hacks copied from vmware modules
- @@ -332,32 +325,37 @@ compile_pass (systemtap_session& s)
- // since such headers are cleansed of _KERNEL_ pieces that we need
- o << "STAPCONF_HEADER := " << s.tmpdir << "/" << s.stapconf_name << endl;
- + o << ".DELETE_ON_ERROR: $(STAPCONF_HEADER)" << endl;
- o << "$(STAPCONF_HEADER):" << endl;
- - o << "\t@> $@" << endl;
- + o << "\t";
- + if (s.verbose < 4)
- + o << "@";
- + o << "$(MAKE) -f \"$(firstword $(MAKEFILE_LIST))\" gen-stapconf" << endl;
- +
- output_autoconf(s, o, "autoconf-hrtimer-rel.c", "STAPCONF_HRTIMER_REL", NULL);
- - output_exportconf(s, o, "hrtimer_get_res", "STAPCONF_HRTIMER_GET_RES");
- + output_exportconf(s, o2, "hrtimer_get_res", "STAPCONF_HRTIMER_GET_RES");
- output_autoconf(s, o, "autoconf-generated-compile.c", "STAPCONF_GENERATED_COMPILE", NULL);
- output_autoconf(s, o, "autoconf-hrtimer-getset-expires.c", "STAPCONF_HRTIMER_GETSET_EXPIRES", NULL);
- output_autoconf(s, o, "autoconf-inode-private.c", "STAPCONF_INODE_PRIVATE", NULL);
- output_autoconf(s, o, "autoconf-inode-rwsem.c", "STAPCONF_INODE_RWSEM", NULL);
- output_autoconf(s, o, "autoconf-constant-tsc.c", "STAPCONF_CONSTANT_TSC", NULL);
- output_autoconf(s, o, "autoconf-ktime-get-real.c", "STAPCONF_KTIME_GET_REAL", NULL);
- - output_exportconf(s, o, "ktime_get_real_fast_ns", "STAPCONF_KTIME_GET_REAL_FAST_NS");
- + output_exportconf(s, o2, "ktime_get_real_fast_ns", "STAPCONF_KTIME_GET_REAL_FAST_NS");
- output_autoconf(s, o, "autoconf-x86-uniregs.c", "STAPCONF_X86_UNIREGS", NULL);
- output_autoconf(s, o, "autoconf-nameidata.c", "STAPCONF_NAMEIDATA_CLEANUP", NULL);
- - output_dual_exportconf(s, o, "unregister_kprobes", "unregister_kretprobes", "STAPCONF_UNREGISTER_KPROBES");
- + output_dual_exportconf(s, o2, "unregister_kprobes", "unregister_kretprobes", "STAPCONF_UNREGISTER_KPROBES");
- output_autoconf(s, o, "autoconf-kprobe-symbol-name.c", "STAPCONF_KPROBE_SYMBOL_NAME", NULL);
- output_autoconf(s, o, "autoconf-real-parent.c", "STAPCONF_REAL_PARENT", NULL);
- output_autoconf(s, o, "autoconf-uaccess.c", "STAPCONF_LINUX_UACCESS_H", NULL);
- output_autoconf(s, o, "autoconf-oneachcpu-retry.c", "STAPCONF_ONEACHCPU_RETRY", NULL);
- output_autoconf(s, o, "autoconf-dpath-path.c", "STAPCONF_DPATH_PATH", NULL);
- - output_exportconf(s, o, "synchronize_kernel", "STAPCONF_SYNCHRONIZE_KERNEL");
- - output_exportconf(s, o, "synchronize_rcu", "STAPCONF_SYNCHRONIZE_RCU");
- - output_exportconf(s, o, "synchronize_sched", "STAPCONF_SYNCHRONIZE_SCHED");
- + output_exportconf(s, o2, "synchronize_kernel", "STAPCONF_SYNCHRONIZE_KERNEL");
- + output_exportconf(s, o2, "synchronize_rcu", "STAPCONF_SYNCHRONIZE_RCU");
- + output_exportconf(s, o2, "synchronize_sched", "STAPCONF_SYNCHRONIZE_SCHED");
- output_autoconf(s, o, "autoconf-task-uid.c", "STAPCONF_TASK_UID", NULL);
- output_autoconf(s, o, "autoconf-from_kuid_munged.c", "STAPCONF_FROM_KUID_MUNGED", NULL);
- - output_exportconf(s, o, "get_mm_exe_file", "STAPCONF_GET_MM_EXE_FILE");
- - output_dual_exportconf(s, o, "alloc_vm_area", "free_vm_area", "STAPCONF_VM_AREA");
- + output_exportconf(s, o2, "get_mm_exe_file", "STAPCONF_GET_MM_EXE_FILE");
- + output_dual_exportconf(s, o2, "alloc_vm_area", "free_vm_area", "STAPCONF_VM_AREA");
- output_autoconf(s, o, "autoconf-procfs-owner.c", "STAPCONF_PROCFS_OWNER", NULL);
- output_autoconf(s, o, "autoconf-alloc-percpu-align.c", "STAPCONF_ALLOC_PERCPU_ALIGN", NULL);
- output_autoconf(s, o, "autoconf-x86-fs.c", "STAPCONF_X86_FS", NULL);
- @@ -369,15 +367,15 @@ compile_pass (systemtap_session& s)
- output_autoconf(s, o, "autoconf-utrace-regset.c", "STAPCONF_UTRACE_REGSET", NULL);
- output_autoconf(s, o, "autoconf-uprobe-get-pc.c", "STAPCONF_UPROBE_GET_PC", NULL);
- output_autoconf(s, o, "autoconf-hlist-4args.c", "STAPCONF_HLIST_4ARGS", NULL);
- - output_exportconf(s, o, "tsc_khz", "STAPCONF_TSC_KHZ");
- - output_exportconf(s, o, "cpu_khz", "STAPCONF_CPU_KHZ");
- - output_exportconf(s, o, "__module_text_address", "STAPCONF_MODULE_TEXT_ADDRESS");
- - output_exportconf(s, o, "add_timer_on", "STAPCONF_ADD_TIMER_ON");
- + output_exportconf(s, o2, "tsc_khz", "STAPCONF_TSC_KHZ");
- + output_exportconf(s, o2, "cpu_khz", "STAPCONF_CPU_KHZ");
- + output_exportconf(s, o2, "__module_text_address", "STAPCONF_MODULE_TEXT_ADDRESS");
- + output_exportconf(s, o2, "add_timer_on", "STAPCONF_ADD_TIMER_ON");
- - output_dual_exportconf(s, o, "probe_kernel_read", "probe_kernel_write", "STAPCONF_PROBE_KERNEL");
- + output_dual_exportconf(s, o2, "probe_kernel_read", "probe_kernel_write", "STAPCONF_PROBE_KERNEL");
- output_autoconf(s, o, "autoconf-hw_breakpoint_context.c",
- "STAPCONF_HW_BREAKPOINT_CONTEXT", NULL);
- - output_exportconf(s, o, "save_stack_trace_regs", "STAPCONF_SAVE_STACK_TRACE_REGS_EXPORTED");
- + output_exportconf(s, o2, "save_stack_trace_regs", "STAPCONF_SAVE_STACK_TRACE_REGS_EXPORTED");
- output_autoconf(s, o, "autoconf-save-stack-trace.c",
- "STAPCONF_KERNEL_STACKTRACE", NULL);
- output_autoconf(s, o, "autoconf-save-stack-trace-no-bp.c",
- @@ -405,12 +403,12 @@ compile_pass (systemtap_session& s)
- "STAPCONF_PERF_COUNTER_CONTEXT", NULL);
- output_autoconf(s, o, "perf_probe_handler_nmi.c",
- "STAPCONF_PERF_HANDLER_NMI", NULL);
- - output_exportconf(s, o, "path_lookup", "STAPCONF_PATH_LOOKUP");
- - output_exportconf(s, o, "kern_path_parent", "STAPCONF_KERN_PATH_PARENT");
- - output_exportconf(s, o, "vfs_path_lookup", "STAPCONF_VFS_PATH_LOOKUP");
- - output_exportconf(s, o, "kern_path", "STAPCONF_KERN_PATH");
- - output_exportconf(s, o, "proc_create_data", "STAPCONF_PROC_CREATE_DATA");
- - output_exportconf(s, o, "PDE_DATA", "STAPCONF_PDE_DATA");
- + output_exportconf(s, o2, "path_lookup", "STAPCONF_PATH_LOOKUP");
- + output_exportconf(s, o2, "kern_path_parent", "STAPCONF_KERN_PATH_PARENT");
- + output_exportconf(s, o2, "vfs_path_lookup", "STAPCONF_VFS_PATH_LOOKUP");
- + output_exportconf(s, o2, "kern_path", "STAPCONF_KERN_PATH");
- + output_exportconf(s, o2, "proc_create_data", "STAPCONF_PROC_CREATE_DATA");
- + output_exportconf(s, o2, "PDE_DATA", "STAPCONF_PDE_DATA");
- output_autoconf(s, o, "autoconf-module-sect-attrs.c", "STAPCONF_MODULE_SECT_ATTRS", NULL);
- output_autoconf(s, o, "autoconf-utrace-via-tracepoints.c", "STAPCONF_UTRACE_VIA_TRACEPOINTS", NULL);
- @@ -436,38 +434,38 @@ compile_pass (systemtap_session& s)
- output_autoconf(s, o, "autoconf-local-clock.c", "STAPCONF_LOCAL_CLOCK", NULL);
- // used by runtime/uprobe-inode.c
- - output_either_exportconf(s, o, "uprobe_register", "register_uprobe",
- + output_either_exportconf(s, o2, "uprobe_register", "register_uprobe",
- "STAPCONF_UPROBE_REGISTER_EXPORTED");
- - output_either_exportconf(s, o, "uprobe_unregister", "unregister_uprobe",
- + output_either_exportconf(s, o2, "uprobe_unregister", "unregister_uprobe",
- "STAPCONF_UPROBE_UNREGISTER_EXPORTED");
- output_autoconf(s, o, "autoconf-old-inode-uprobes.c", "STAPCONF_OLD_INODE_UPROBES", NULL);
- output_autoconf(s, o, "autoconf-inode-uretprobes.c", "STAPCONF_INODE_URETPROBES", NULL);
- // used by tapsets.cxx inode uprobe generated code
- - output_exportconf(s, o, "uprobe_get_swbp_addr", "STAPCONF_UPROBE_GET_SWBP_ADDR_EXPORTED");
- + output_exportconf(s, o2, "uprobe_get_swbp_addr", "STAPCONF_UPROBE_GET_SWBP_ADDR_EXPORTED");
- // used by runtime/loc2c-runtime.h
- - output_exportconf(s, o, "task_user_regset_view", "STAPCONF_TASK_USER_REGSET_VIEW_EXPORTED");
- + output_exportconf(s, o2, "task_user_regset_view", "STAPCONF_TASK_USER_REGSET_VIEW_EXPORTED");
- // used by runtime/stp_utrace.c
- - output_exportconf(s, o, "task_work_add", "STAPCONF_TASK_WORK_ADD_EXPORTED");
- - output_exportconf(s, o, "task_work_cancel", "STAPCONF_TASK_WORK_CANCEL_EXPORTED");
- - output_exportconf(s, o, "wake_up_state", "STAPCONF_WAKE_UP_STATE_EXPORTED");
- - output_exportconf(s, o, "try_to_wake_up", "STAPCONF_TRY_TO_WAKE_UP_EXPORTED");
- - output_exportconf(s, o, "signal_wake_up_state", "STAPCONF_SIGNAL_WAKE_UP_STATE_EXPORTED");
- - output_exportconf(s, o, "signal_wake_up", "STAPCONF_SIGNAL_WAKE_UP_EXPORTED");
- - output_exportconf(s, o, "__lock_task_sighand", "STAPCONF___LOCK_TASK_SIGHAND_EXPORTED");
- + output_exportconf(s, o2, "task_work_add", "STAPCONF_TASK_WORK_ADD_EXPORTED");
- + output_exportconf(s, o2, "task_work_cancel", "STAPCONF_TASK_WORK_CANCEL_EXPORTED");
- + output_exportconf(s, o2, "wake_up_state", "STAPCONF_WAKE_UP_STATE_EXPORTED");
- + output_exportconf(s, o2, "try_to_wake_up", "STAPCONF_TRY_TO_WAKE_UP_EXPORTED");
- + output_exportconf(s, o2, "signal_wake_up_state", "STAPCONF_SIGNAL_WAKE_UP_STATE_EXPORTED");
- + output_exportconf(s, o2, "signal_wake_up", "STAPCONF_SIGNAL_WAKE_UP_EXPORTED");
- + output_exportconf(s, o2, "__lock_task_sighand", "STAPCONF___LOCK_TASK_SIGHAND_EXPORTED");
- output_autoconf(s, o, "autoconf-pagefault_disable.c", "STAPCONF_PAGEFAULT_DISABLE", NULL);
- - output_exportconf(s, o, "kallsyms_lookup_name", "STAPCONF_KALLSYMS");
- + output_exportconf(s, o2, "kallsyms_lookup_name", "STAPCONF_KALLSYMS");
- output_autoconf(s, o, "autoconf-uidgid.c", "STAPCONF_LINUX_UIDGID_H", NULL);
- - output_exportconf(s, o, "sigset_from_compat", "STAPCONF_SIGSET_FROM_COMPAT_EXPORTED");
- - output_exportconf(s, o, "vzalloc", "STAPCONF_VZALLOC");
- - output_exportconf(s, o, "vzalloc_node", "STAPCONF_VZALLOC_NODE");
- - output_exportconf(s, o, "vmalloc_node", "STAPCONF_VMALLOC_NODE");
- + output_exportconf(s, o2, "sigset_from_compat", "STAPCONF_SIGSET_FROM_COMPAT_EXPORTED");
- + output_exportconf(s, o2, "vzalloc", "STAPCONF_VZALLOC");
- + output_exportconf(s, o2, "vzalloc_node", "STAPCONF_VZALLOC_NODE");
- + output_exportconf(s, o2, "vmalloc_node", "STAPCONF_VMALLOC_NODE");
- // RHBZ1233912 - s390 temporary workaround for non-atomic udelay()
- - output_exportconf(s, o, "udelay_simple", "STAPCONF_UDELAY_SIMPLE_EXPORTED");
- + output_exportconf(s, o2, "udelay_simple", "STAPCONF_UDELAY_SIMPLE_EXPORTED");
- output_autoconf(s, o, "autoconf-udelay_simple.c", "STAPCONF_UDELAY_SIMPLE",
- NULL);
- @@ -478,7 +476,7 @@ compile_pass (systemtap_session& s)
- "STAPCONF_MODULE_LAYOUT", NULL);
- output_autoconf(s, o, "autoconf-mod_kallsyms.c",
- "STAPCONF_MOD_KALLSYMS", NULL);
- - output_exportconf(s, o, "get_user_pages_remote", "STAPCONF_GET_USER_PAGES_REMOTE");
- + output_exportconf(s, o2, "get_user_pages_remote", "STAPCONF_GET_USER_PAGES_REMOTE");
- output_autoconf(s, o, "autoconf-get_user_pages_remote-flags.c",
- "STAPCONF_GET_USER_PAGES_REMOTE_FLAGS", NULL);
- output_autoconf(s, o, "autoconf-get_user_pages_remote-flags_locked.c",
- @@ -492,10 +490,23 @@ compile_pass (systemtap_session& s)
- "STAPCONF_STACK_TRACE_SAVE_REGS", NULL);
- // used by runtime/linux/netfilter.c
- - output_exportconf(s, o, "nf_register_hook", "STAPCONF_NF_REGISTER_HOOK");
- + output_exportconf(s, o2, "nf_register_hook", "STAPCONF_NF_REGISTER_HOOK");
- // used by tapset/linux/ioblock.stp
- - output_exportconf(s, o, "disk_get_part", "STAPCONF_DISK_GET_PART");
- + output_exportconf(s, o2, "disk_get_part", "STAPCONF_DISK_GET_PART");
- +
- + o << ".PHONY: gen-stapconf" << endl;
- + o << "gen-stapconf: stapconf_export.h";
- + for (unsigned i=0; i<s.autoconf_cs.size(); i++)
- + o << " " << s.tmpdir << "/" << s.autoconf_cs[i] << ".h";
- + o << endl;
- +
- + s.autoconf_cs.clear (); // just to save a bit of memory
- +
- + o << "\t";
- + if (s.verbose < 4)
- + o << "@";
- + o << "cat $^ > $(STAPCONF_HEADER)" << endl;
- o << module_cflags << " += -include $(STAPCONF_HEADER)" << endl;
- diff --git a/session.cxx b/session.cxx
- index 0d6b71626..088804454 100644
- --- a/session.cxx
- +++ b/session.cxx
- @@ -425,6 +425,8 @@ systemtap_session::systemtap_session (const systemtap_session& other,
- print_modidx = other.print_modidx;
- + autoconf_cs = other.autoconf_cs;
- +
- create_tmp_dir();
- }
- diff --git a/session.h b/session.h
- index 07152a86b..1b2b6e30b 100644
- --- a/session.h
- +++ b/session.h
- @@ -448,6 +448,9 @@ public:
- int suppressed_errors;
- int warningerr_count; // see comment in systemtap_session::print_error
- + // autoconf C files
- + std::vector<std::string> autoconf_cs;
- +
- // Returns number of critical errors (not counting those part of warnings)
- unsigned num_errors ()
- {
Add Comment
Please, Sign In to add comment