summaryrefslogtreecommitdiffstats
path: root/translate.cxx
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2009-05-20 14:46:25 -0700
committerJosh Stone <jistone@redhat.com>2009-05-20 14:53:09 -0700
commit29e2616aeeb82605a6efe1dbc574b499781eafbe (patch)
tree99cf2ca2c3c10b2bd72733a5b10626e58779ad0c /translate.cxx
parent7872a5b9d76dc78d8956de3d2a11757783121674 (diff)
downloadsystemtap-steved-29e2616aeeb82605a6efe1dbc574b499781eafbe.tar.gz
systemtap-steved-29e2616aeeb82605a6efe1dbc574b499781eafbe.tar.xz
systemtap-steved-29e2616aeeb82605a6efe1dbc574b499781eafbe.zip
PR10177: init/kill time in sleepy context only
Previously, _stp_init_time and _stp_kill_time were being called from begin/end/error probes, which will run with preemption disabled. The BUG reported on RT kernels showed that cpufreq_unregister_notifier can end up sleeping, which violates our preemption block. This patch moves the init/kill into systemtap_module_init/exit, where it is safe to sleep. The code maintains a new predicate with the define STAP_NEED_GETTIMEOFDAY, so we don't still incur any timer overhead if it's not used.
Diffstat (limited to 'translate.cxx')
-rw-r--r--translate.cxx14
1 files changed, 14 insertions, 0 deletions
diff --git a/translate.cxx b/translate.cxx
index 62c71aeb..9f45f5d1 100644
--- a/translate.cxx
+++ b/translate.cxx
@@ -1133,6 +1133,15 @@ c_unparser::emit_module_init ()
o->newline(-1) << "}";
o->newline() << "if (rc) goto out;";
+ // initialize gettimeofday (if needed)
+ o->newline() << "#ifdef STAP_NEED_GETTIMEOFDAY";
+ o->newline() << "rc = _stp_init_time();"; // Kick off the Big Bang.
+ o->newline() << "if (rc) {";
+ o->newline(1) << "_stp_error (\"couldn't initialize gettimeofday\");";
+ o->newline() << "goto out;";
+ o->newline(-1) << "}";
+ o->newline() << "#endif";
+
o->newline() << "(void) probe_point;";
o->newline() << "(void) i;";
o->newline() << "(void) j;";
@@ -1359,6 +1368,11 @@ c_unparser::emit_module_exit ()
o->newline() << "#endif";
}
+ // teardown gettimeofday (if needed)
+ o->newline() << "#ifdef STAP_NEED_GETTIMEOFDAY";
+ o->newline() << " _stp_kill_time();"; // Go to a beach. Drink a beer.
+ o->newline() << "#endif";
+
// print final error/skipped counts if non-zero
o->newline() << "if (atomic_read (& skipped_count) || "
<< "atomic_read (& error_count) || "