From 03a4ec63de7060914b01320f6e840e0bc2d0beda Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 21 Apr 2010 11:21:07 +0200 Subject: [PATCH] PR11514 Only use kallsyms_on_each_symbol speedup when available. * runtime/autoconf-kallsyms-on-each-symbol.c: New check. * buildrun.cxx (compile_pass): Add new check to output_autoconf. * tapsets.cxx (kprobe_derived_probe_group::emit_module_decls): Only declare kprobe_resolve when STAPCONF_KALLSYMS_ON_EACH_SYMBOL defined. (kprobe_derived_probe_group::emit_module_init): Check whether to invoke kallsyms_on_each_symbol optimization. --- buildrun.cxx | 1 + runtime/autoconf-kallsyms-on-each-symbol.c | 5 +++++ tapsets.cxx | 13 +++++++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 runtime/autoconf-kallsyms-on-each-symbol.c diff --git a/buildrun.cxx b/buildrun.cxx index 89fa01777..c4703978b 100644 --- a/buildrun.cxx +++ b/buildrun.cxx @@ -193,6 +193,7 @@ compile_pass (systemtap_session& s) output_autoconf(s, o, "autoconf-asm-syscall.c", "STAPCONF_ASM_SYSCALL_H", NULL); output_autoconf(s, o, "autoconf-ring_buffer-flags.c", "STAPCONF_RING_BUFFER_FLAGS", NULL); + output_autoconf(s, o, "autoconf-kallsyms-on-each-symbol.c", "STAPCONF_KALLSYMS_ON_EACH_SYMBOL", NULL); o << module_cflags << " += -include $(STAPCONF_HEADER)" << endl; diff --git a/runtime/autoconf-kallsyms-on-each-symbol.c b/runtime/autoconf-kallsyms-on-each-symbol.c new file mode 100644 index 000000000..c0005e185 --- /dev/null +++ b/runtime/autoconf-kallsyms-on-each-symbol.c @@ -0,0 +1,5 @@ +#include + +void foo (void) { + (void) kallsyms_on_each_symbol(NULL, NULL); +} diff --git a/tapsets.cxx b/tapsets.cxx index d624042b2..e1151e547 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -5477,6 +5477,7 @@ kprobe_derived_probe_group::emit_module_decls (systemtap_session& s) s.op->newline() << "return 0;"; s.op->newline(-1) << "}"; + s.op->newline() << "#ifdef STAPCONF_KALLSYMS_ON_EACH_SYMBOL"; s.op->newline() << "static int kprobe_resolve(void *data, const char *name,"; s.op->newline() << " struct module *owner,"; s.op->newline() << " unsigned long val) {"; @@ -5489,28 +5490,36 @@ kprobe_derived_probe_group::emit_module_decls (systemtap_session& s) s.op->newline(-3) << "}"; s.op->newline() << "return 0;"; s.op->newline(-1) << "}"; + s.op->newline() << "#endif"; } void kprobe_derived_probe_group::emit_module_init (systemtap_session& s) { + s.op->newline() << "#ifdef STAPCONF_KALLSYMS_ON_EACH_SYMBOL"; s.op->newline() << "kallsyms_on_each_symbol(kprobe_resolve, NULL);"; + s.op->newline() << "#endif"; s.op->newline() << "for (i=0; i<" << probes_by_module.size() << "; i++) {"; s.op->newline(1) << "struct stap_dwarfless_probe *sdp = & stap_dwarfless_probes[i];"; s.op->newline() << "struct stap_dwarfless_kprobe *kp = & stap_dwarfless_kprobes[i];"; s.op->newline() << "void *addr = (void *) sdp->address;"; + s.op->newline() << "const char *symbol_name = addr ? NULL : sdp->symbol_string;"; + + s.op->newline() << "#ifdef STAPCONF_KALLSYMS_ON_EACH_SYMBOL"; s.op->newline() << "if (! addr) {"; s.op->newline(1) << "sdp->registered_p = 0;"; s.op->newline() << "if (!sdp->optional_p)"; s.op->newline(1) << "_stp_warn (\"probe %s registration error (symbol not found)\", probe_point);"; s.op->newline(-1) << "continue;"; s.op->newline(-1) << "}"; + s.op->newline() << "#endif"; + s.op->newline() << "probe_point = sdp->pp;"; // for error messages s.op->newline() << "if (sdp->return_p) {"; s.op->newline(1) << "kp->u.krp.kp.addr = addr;"; - s.op->newline() << "kp->u.krp.kp.symbol_name = NULL;"; + s.op->newline() << "kp->u.krp.kp.symbol_name = (char *) symbol_name;"; s.op->newline() << "if (sdp->maxactive_p) {"; s.op->newline(1) << "kp->u.krp.maxactive = sdp->maxactive_val;"; s.op->newline(-1) << "} else {"; @@ -5534,7 +5543,7 @@ kprobe_derived_probe_group::emit_module_init (systemtap_session& s) s.op->newline(-1) << "} else {"; // to ensure safeness of bspcache, always use aggr_kprobe on ia64 s.op->newline(1) << "kp->u.kp.addr = addr;"; - s.op->newline() << "kp->u.kp.symbol_name = NULL;"; + s.op->newline() << "kp->u.kp.symbol_name = (char *) symbol_name;"; s.op->newline() << "kp->u.kp.pre_handler = &enter_kprobe2_probe;"; s.op->newline() << "#ifdef __ia64__"; s.op->newline() << "kp->dummy.pre_handler = NULL;"; -- 2.43.5