summaryrefslogtreecommitdiffstats
path: root/tapset
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 /tapset
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 'tapset')
-rw-r--r--tapset/timestamp_gtod.stp17
1 files changed, 2 insertions, 15 deletions
diff --git a/tapset/timestamp_gtod.stp b/tapset/timestamp_gtod.stp
index 43b127dc..b916a3b1 100644
--- a/tapset/timestamp_gtod.stp
+++ b/tapset/timestamp_gtod.stp
@@ -7,23 +7,10 @@
// Public License (GPL); either version 2, or (at your option) any
// later version.
-function _gettimeofday_init:long() %{
- THIS->__retvalue = _stp_init_time(); /* Kick off the Big Bang. */
+%{
+#define STAP_NEED_GETTIMEOFDAY 1
%}
-probe begin(-0x8000000000000000) {
- if (_gettimeofday_init() != 0)
- error("couldn't initialize gettimeofday")
-}
-
-function _gettimeofday_kill() %{
- _stp_kill_time(); /* Go to a beach. Drink a beer. */
-%}
-
-probe end(0x7FFFFFFFFFFFFFFF), error(0x7FFFFFFFFFFFFFFF) {
- _gettimeofday_kill()
-}
-
/**
* sfunction gettimeofday_ns - Number of nanoseconds since UNIX epoch.