<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/20491">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">initial support for static userspace probes via systemtap<br><br>This adds a --enable-systemtap configure option, which will then<br>add static tracepoints to the generated libosmocore binary.<br><br>At this point, only two tracepoints are supported: stderr_start<br>and stderr_done.  They can be used to trace the amount of time<br>a libosmocore-using application spends in blocking calls to log<br>to stderr.<br><br>Change-Id: I7e1ab664241deb524c9582cbd1bec31af46c747e<br>---<br>M Makefile.am<br>M configure.ac<br>M src/Makefile.am<br>M src/logging.c<br>A src/probes.d<br>A tapset/Makefile.am<br>A tapset/libosmocore.stp<br>7 files changed, 103 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/91/20491/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Makefile.am b/Makefile.am</span><br><span>index f2a05a9..ab2aad9 100644</span><br><span>--- a/Makefile.am</span><br><span>+++ b/Makefile.am</span><br><span>@@ -1,7 +1,7 @@</span><br><span> ACLOCAL_AMFLAGS = -I m4</span><br><span> </span><br><span> AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include</span><br><span style="color: hsl(0, 100%, 40%);">-SUBDIRS = include src src/vty src/codec src/gsm src/coding src/gb src/ctrl src/sim src/pseudotalloc src/usb utils tests</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS = include src src/vty src/codec src/gsm src/coding src/gb src/ctrl src/sim src/pseudotalloc src/usb utils tapset tests</span><br><span> </span><br><span> pkgconfigdir = $(libdir)/pkgconfig</span><br><span> pkgconfig_DATA = libosmocore.pc libosmocodec.pc libosmovty.pc libosmogsm.pc \</span><br><span>diff --git a/configure.ac b/configure.ac</span><br><span>index b07a3bd..e26d8a8 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -392,6 +392,38 @@</span><br><span> AC_MSG_RESULT([$neon])</span><br><span> AM_CONDITIONAL(HAVE_NEON, [test "x$neon" != "xno"])</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# SystemTap support</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_CHECKING([whether to include systemtap tracing support])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE([systemtap],</span><br><span style="color: hsl(120, 100%, 40%);">+            [AS_HELP_STRING([--enable-systemtap],</span><br><span style="color: hsl(120, 100%, 40%);">+                         [Enable inclusion of systemtap trace support])],</span><br><span style="color: hsl(120, 100%, 40%);">+              [ENABLE_SYSTEMTAP="${enableval}"], [ENABLE_SYSTEMTAP='no'])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL([ENABLE_SYSTEMTAP], [test x$ENABLE_SYSTEMTAP = xyes])</span><br><span style="color: hsl(120, 100%, 40%);">+AC_MSG_RESULT(${ENABLE_SYSTEMTAP})</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if test "x${ENABLE_SYSTEMTAP}" = xyes; then</span><br><span style="color: hsl(120, 100%, 40%);">+  # Additional configuration for --enable-systemtap is HERE</span><br><span style="color: hsl(120, 100%, 40%);">+  AC_CHECK_PROGS(DTRACE, dtrace)</span><br><span style="color: hsl(120, 100%, 40%);">+  if test -z "$DTRACE"; then</span><br><span style="color: hsl(120, 100%, 40%);">+    AC_MSG_ERROR([dtrace not found])</span><br><span style="color: hsl(120, 100%, 40%);">+  fi</span><br><span style="color: hsl(120, 100%, 40%);">+  AC_CHECK_HEADER([sys/sdt.h], [SDT_H_FOUND='yes'],</span><br><span style="color: hsl(120, 100%, 40%);">+                [SDT_H_FOUND='no';</span><br><span style="color: hsl(120, 100%, 40%);">+                   AC_MSG_ERROR([systemtap support needs sys/sdt.h header])])</span><br><span style="color: hsl(120, 100%, 40%);">+  AC_DEFINE([HAVE_SYSTEMTAP], [1], [Define to 1 if using SystemTap probes.])</span><br><span style="color: hsl(120, 100%, 40%);">+  AC_ARG_WITH([tapset-install-dir],</span><br><span style="color: hsl(120, 100%, 40%);">+        [AS_HELP_STRING([--with-tapset-install-dir],</span><br><span style="color: hsl(120, 100%, 40%);">+             [The absolute path where the tapset dir will be installed])],</span><br><span style="color: hsl(120, 100%, 40%);">+              [if test "x${withval}" = x; then</span><br><span style="color: hsl(120, 100%, 40%);">+               ABS_TAPSET_DIR="\$(datadir)/systemtap/tapset"</span><br><span style="color: hsl(120, 100%, 40%);">+             else</span><br><span style="color: hsl(120, 100%, 40%);">+            ABS_TAPSET_DIR="${withval}"</span><br><span style="color: hsl(120, 100%, 40%);">+               fi], [ABS_TAPSET_DIR="\$(datadir)/systemtap/tapset"])</span><br><span style="color: hsl(120, 100%, 40%);">+  AC_SUBST(ABS_TAPSET_DIR)</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> OSMO_AC_CODE_COVERAGE</span><br><span> </span><br><span>@@ -446,6 +478,7 @@</span><br><span>      src/gb/Makefile</span><br><span>      src/ctrl/Makefile</span><br><span>    src/pseudotalloc/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+     tapset/Makefile</span><br><span>      tests/Makefile</span><br><span>       tests/atlocal</span><br><span>        utils/Makefile</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index 891b4a6..f03ce55 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -28,6 +28,7 @@</span><br><span>                   sockaddr_str.c \</span><br><span>                     use_count.c \</span><br><span>                        exec.c \</span><br><span style="color: hsl(120, 100%, 40%);">+                      probes.d \</span><br><span>                   $(NULL)</span><br><span> </span><br><span> if HAVE_SSSE3</span><br><span>@@ -71,5 +72,16 @@</span><br><span> libosmocore_la_SOURCES += serial.c</span><br><span> endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+if ENABLE_SYSTEMTAP</span><br><span style="color: hsl(120, 100%, 40%);">+probes.h: probes.d</span><br><span style="color: hsl(120, 100%, 40%);">+        $(DTRACE) -C -h -s $< -o $@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+probes.lo: probes.d</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBTOOL) --mode=compile $(AM_V_lt) --tag=CC env CFLAGS="$(CFLAGS)" $(DTRACE) -C -G -s $< -o $@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+BUILT_SOURCES += probes.h probes.lo</span><br><span style="color: hsl(120, 100%, 40%);">+libosmocore_la_LIBADD += probes.lo</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> crc%gen.c: crcXXgen.c.tpl</span><br><span>       $(AM_V_GEN)sed -e's/XX/$*/g' $< > $@</span><br><span>diff --git a/src/logging.c b/src/logging.c</span><br><span>index b20b031..f3833f1 100644</span><br><span>--- a/src/logging.c</span><br><span>+++ b/src/logging.c</span><br><span>@@ -45,6 +45,17 @@</span><br><span> #include <syslog.h></span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_SYSTEMTAP</span><br><span style="color: hsl(120, 100%, 40%);">+/* include the generated probes header and put markers in code */</span><br><span style="color: hsl(120, 100%, 40%);">+#include "probes.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRACE(probe) probe</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRACE_ENABLED(probe) probe ## _ENABLED()</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+/* Wrap the probe to allow it to be removed when no systemtap available */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRACE(probe)</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRACE_ENABLED(probe) (0)</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* HAVE_SYSTEMTAP */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #include <time.h></span><br><span> #include <sys/time.h></span><br><span> #include <sys/types.h></span><br><span>@@ -703,9 +714,11 @@</span><br><span> {</span><br><span>   va_list ap;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       TRACE(LIBOSMOCORE_LOG_START());</span><br><span>      va_start(ap, format);</span><br><span>        osmo_vlogp(subsys, level, file, line, cont, format, ap);</span><br><span>     va_end(ap);</span><br><span style="color: hsl(120, 100%, 40%);">+   TRACE(LIBOSMOCORE_LOG_DONE());</span><br><span> }</span><br><span> </span><br><span> /*! Register a new log target with the logging core</span><br><span>diff --git a/src/probes.d b/src/probes.d</span><br><span>new file mode 100644</span><br><span>index 0000000..c16eb1e</span><br><span>--- /dev/null</span><br><span>+++ b/src/probes.d</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+provider libosmocore {</span><br><span style="color: hsl(120, 100%, 40%);">+      probe log_start();</span><br><span style="color: hsl(120, 100%, 40%);">+    probe log_done();</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/tapset/Makefile.am b/tapset/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..a07a3b1</span><br><span>--- /dev/null</span><br><span>+++ b/tapset/Makefile.am</span><br><span>@@ -0,0 +1,22 @@</span><br><span style="color: hsl(120, 100%, 40%);">+.PHONY: clean-local install-data-hook uninstall-local</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = libosmocore.stp</span><br><span style="color: hsl(120, 100%, 40%);">+TAPSET_FILES = $(EXTRA_DIST)</span><br><span style="color: hsl(120, 100%, 40%);">+TAPSET_INSTALL_DIR = $(DESTDIR)@ABS_TAPSET_DIR@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if ENABLE_SYSTEMTAP</span><br><span style="color: hsl(120, 100%, 40%);">+all-local: $(TAPSET_FILES)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+clean-local:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+install-data-hook:</span><br><span style="color: hsl(120, 100%, 40%);">+     $(MKDIR_P) $(TAPSET_INSTALL_DIR)</span><br><span style="color: hsl(120, 100%, 40%);">+      $(INSTALL_DATA) $(TAPSET_FILES) $(TAPSET_INSTALL_DIR)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+uninstall-local:</span><br><span style="color: hsl(120, 100%, 40%);">+     @list='$(TAPSET_FILES)'; for p in $$list; do \</span><br><span style="color: hsl(120, 100%, 40%);">+          echo " rm -f '$(TAPSET_INSTALL_DIR)/$$p'"; \</span><br><span style="color: hsl(120, 100%, 40%);">+        rm -f "$(TAPSET_INSTALL_DIR)/$$p"; \</span><br><span style="color: hsl(120, 100%, 40%);">+      done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span>diff --git a/tapset/libosmocore.stp b/tapset/libosmocore.stp</span><br><span>new file mode 100644</span><br><span>index 0000000..10fa7b2</span><br><span>--- /dev/null</span><br><span>+++ b/tapset/libosmocore.stp</span><br><span>@@ -0,0 +1,18 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* libosmocore tapset</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of libosmocore.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Each probe defines the probe name and a full probestr which consist of the probe name and between</span><br><span style="color: hsl(120, 100%, 40%);">+ * brackets all argument names and values.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+probe libosmocore_stderr_start = process("libosmocore").mark("stderr_start")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ count = $arg1;</span><br><span style="color: hsl(120, 100%, 40%);">+ probestr = sprintf("%s(count=%d), $$name, count);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+probe libosmocore_stderr_done = process("libosmocore").mark("stderr_done")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ probestr = sprintf("%s", $$name);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/20491">change 20491</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/20491"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I7e1ab664241deb524c9582cbd1bec31af46c747e </div>
<div style="display:none"> Gerrit-Change-Number: 20491 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>