diff options
author | Josh Stone <jistone@redhat.com> | 2009-05-20 14:46:25 -0700 |
---|---|---|
committer | Josh Stone <jistone@redhat.com> | 2009-05-20 14:53:09 -0700 |
commit | 29e2616aeeb82605a6efe1dbc574b499781eafbe (patch) | |
tree | 99cf2ca2c3c10b2bd72733a5b10626e58779ad0c /tapset | |
parent | 7872a5b9d76dc78d8956de3d2a11757783121674 (diff) | |
download | systemtap-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.stp | 17 |
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. |