]> sourceware.org Git - systemtap.git/commitdiff
Add selective use of _stp_time_init/kill (PR9822)
authorJosh Stone <jistone@redhat.com>
Mon, 23 Feb 2009 22:22:38 +0000 (14:22 -0800)
committerJosh Stone <jistone@redhat.com>
Mon, 23 Feb 2009 22:22:38 +0000 (14:22 -0800)
Our gettimeofday runtime has frequent wakeups to stay in sync with
kernel time, but this is wasted effort if gettimeofday is not used in
the script.  This patch moves the calls to _stp_time_init and
_stp_time_kill into begin and end/error probes, which only get pulled in
if one of the gettimeofday variants is called.

runtime/time.c
runtime/transport/transport.c
tapset/timestamp.stp
tapset/timestamp_gtod.stp [new file with mode: 0644]

index ad7cef9de7ea640a2a129b55f766bbe4b6ff407b..58c23e57ee3999c2796be60c2bdcd2b032a26197 100644 (file)
@@ -223,6 +223,7 @@ _stp_kill_time(void)
 #endif
 
         _stp_free_percpu(stp_time);
+        stp_time = NULL;
     }
 }
 
@@ -232,6 +233,8 @@ _stp_init_time(void)
 {
     int ret = 0;
 
+    _stp_kill_time();
+
     stp_time = _stp_alloc_percpu(sizeof(stp_time_t));
     if (unlikely(stp_time == 0))
            return -1;
@@ -263,7 +266,7 @@ _stp_init_time(void)
         }
     }
 #endif
-   if (ret)
+    if (ret)
         _stp_kill_time();
     return ret;
 }
@@ -278,6 +281,9 @@ _stp_gettimeofday_ns(void)
     stp_time_t *time;
     int i = 0;
 
+    if (!stp_time)
+        return -1;
+
     preempt_disable();
     time = per_cpu_ptr(stp_time, smp_processor_id());
 
index 0755781e9fe3d9b68d1936c8a739b263c2edd87e..7fcebd420fb604cce2b7ee9bad8db568795ef2bd 100644 (file)
@@ -188,7 +188,6 @@ static void _stp_transport_close()
        _stp_unregister_ctl_channel();
        if (_stp_utt)
                utt_trace_remove(_stp_utt);
-       _stp_kill_time();  /* Go to a beach.  Drink a beer.  */
        _stp_print_cleanup();   /* free print buffers */
        _stp_mem_debug_done();
        dbug_trans(1, "---- CLOSED ----\n");
@@ -244,10 +243,6 @@ static int _stp_transport_init(void)
                dbug_trans(1, "Using %d subbufs of size %d\n", _stp_nsubbufs, _stp_subbuf_size);
        }
 
-       /* initialize timer code */
-       if (_stp_init_time())
-               return -1;
-
 #if !defined (STP_OLD_TRANSPORT) || defined (STP_BULKMODE)
        /* open utt (relayfs) channel to send data to userspace */
        _stp_utt = _stp_utt_open();
@@ -286,7 +281,6 @@ err1:
        if (_stp_utt)
                utt_trace_remove(_stp_utt);
 err0:
-       _stp_kill_time();
        return -1;
 }
 
index 29763cb9ae291069180c05871554fd2a56b507e6..ce8f7558c738d32520a54bf95be7382bc957995e 100644 (file)
@@ -7,10 +7,6 @@
 // Public License (GPL); either version 2, or (at your option) any
 // later version.
 
-%{
-#include <linux/time.h>
-%}
-
 /**
  * sfunction get_cycles - Processor cycle count.
  *
@@ -21,43 +17,4 @@ function get_cycles:long () %{ /* pure */
   THIS->__retvalue = (int64_t) c;
 %}
 
-
-/**
- * sfunction gettimeofday_ns - Number of nanoseconds since UNIX epoch.
- *
- *  Return the number of nanoseconds since the UNIX epoch.
- */
-function gettimeofday_ns:long () %{ /* pure */
-  /* NOTE: we can't use do_gettimeofday because we could be called from a
-   * context where xtime_lock is already held.  See bug #2525. */
-  THIS->__retvalue = _stp_gettimeofday_ns();
-%}
-
-/**
- * sfunction gettimeofday_us - Number of microseconds since UNIX epoch.
- *
- *  Return the number of microseconds since the UNIX epoch.
- */
-function gettimeofday_us:long () {
-  return gettimeofday_ns() / 1000;
-}
-
-/**
- * sfunction gettimeofday_ms - Number of milliseconds since UNIX epoch.
- *
- *  Return the number of milliseconds since the UNIX epoch.
- */
-function gettimeofday_ms:long () {
-  return gettimeofday_ns() / 1000000;
-}
-
-/**
- * sfunction gettimeofday_s - Number of seconds since UNIX epoch.
- *
- * Return the number of seconds since the UNIX epoch.
- */
-function gettimeofday_s:long () {
-  return gettimeofday_ns() / 1000000000;
-}
-
 // likewise jiffies, monotonic_clock ...
diff --git a/tapset/timestamp_gtod.stp b/tapset/timestamp_gtod.stp
new file mode 100644 (file)
index 0000000..43b127d
--- /dev/null
@@ -0,0 +1,68 @@
+// timestamp tapset -- gettimeofday variants
+// Copyright (C) 2005-2009 Red Hat Inc.
+// Copyright (C) 2006 Intel Corporation.
+//
+// This file is part of systemtap, and is free software.  You can
+// redistribute it and/or modify it under the terms of the GNU General
+// 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.  */
+%}
+
+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.
+ *
+ *  Return the number of nanoseconds since the UNIX epoch.
+ */
+function gettimeofday_ns:long () %{ /* pure */
+  /* NOTE: we can't use do_gettimeofday because we could be called from a
+   * context where xtime_lock is already held.  See bug #2525. */
+  THIS->__retvalue = _stp_gettimeofday_ns();
+  if (THIS->__retvalue < 0)
+    CONTEXT->last_error = "gettimeofday not initialized";
+%}
+
+/**
+ * sfunction gettimeofday_us - Number of microseconds since UNIX epoch.
+ *
+ *  Return the number of microseconds since the UNIX epoch.
+ */
+function gettimeofday_us:long () {
+  return gettimeofday_ns() / 1000;
+}
+
+/**
+ * sfunction gettimeofday_ms - Number of milliseconds since UNIX epoch.
+ *
+ *  Return the number of milliseconds since the UNIX epoch.
+ */
+function gettimeofday_ms:long () {
+  return gettimeofday_ns() / 1000000;
+}
+
+/**
+ * sfunction gettimeofday_s - Number of seconds since UNIX epoch.
+ *
+ * Return the number of seconds since the UNIX epoch.
+ */
+function gettimeofday_s:long () {
+  return gettimeofday_ns() / 1000000000;
+}
+
+// likewise jiffies, monotonic_clock ...
This page took 0.035409 seconds and 5 git commands to generate.