diff options
author | Harald Welte <laforge@osmocom.org> | 2020-09-26 17:10:29 +0200 |
---|---|---|
committer | Harald Welte <laforge@osmocom.org> | 2020-09-26 19:40:41 +0200 |
commit | a3ee406b6ec642435a107c5c1b2130e9d32c9fb3 (patch) | |
tree | da2343f5b543dd6b3bff20d31970c4e1ec82d5df /libosmocore-usdt.patch |
Diffstat (limited to 'libosmocore-usdt.patch')
-rw-r--r-- | libosmocore-usdt.patch | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/libosmocore-usdt.patch b/libosmocore-usdt.patch new file mode 100644 index 0000000..97cf3c2 --- /dev/null +++ b/libosmocore-usdt.patch @@ -0,0 +1,246 @@ +From d08b4443ea1e5cd64a394832c4af685e06110fcc Mon Sep 17 00:00:00 2001 +From: Harald Welte <laforge@osmocom.org> +Date: Sat, 26 Sep 2020 11:51:32 +0200 +Subject: [PATCH] initial support for static userspace probes via systemtap + +This adds a --enable-systemtap configure option, which will then +add static tracepoints to the generated libosmocore binary. + +At this point, only two tracepoints are supported: stderr_start +and stderr_done. They can be used to trace the amount of time +a libosmocore-using application spends in blocking calls to log +to stderr. + +Change-Id: I7e1ab664241deb524c9582cbd1bec31af46c747e +--- + Makefile.am | 2 +- + configure.ac | 33 +++++++++++++++++++++++++++++++++ + src/Makefile.am | 12 ++++++++++++ + src/logging.c | 23 ++++++++++++++++++++++- + src/probes.d | 7 +++++++ + tapset/Makefile.am | 22 ++++++++++++++++++++++ + tapset/libosmocore.stp | 18 ++++++++++++++++++ + 7 files changed, 115 insertions(+), 2 deletions(-) + create mode 100644 src/probes.d + create mode 100644 tapset/Makefile.am + create mode 100644 tapset/libosmocore.stp + +diff --git a/Makefile.am b/Makefile.am +index f2a05a96..ab2aad92 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -1,7 +1,7 @@ + ACLOCAL_AMFLAGS = -I m4 + + AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include +-SUBDIRS = include src src/vty src/codec src/gsm src/coding src/gb src/ctrl src/sim src/pseudotalloc src/usb utils tests ++SUBDIRS = include src src/vty src/codec src/gsm src/coding src/gb src/ctrl src/sim src/pseudotalloc src/usb utils tapset tests + + pkgconfigdir = $(libdir)/pkgconfig + pkgconfig_DATA = libosmocore.pc libosmocodec.pc libosmovty.pc libosmogsm.pc \ +diff --git a/configure.ac b/configure.ac +index b07a3bd6..e26d8a8b 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -392,6 +392,38 @@ AC_MSG_CHECKING([whether to enable ARM NEON instructions support]) + AC_MSG_RESULT([$neon]) + AM_CONDITIONAL(HAVE_NEON, [test "x$neon" != "xno"]) + ++# ++# SystemTap support ++# ++AC_MSG_CHECKING([whether to include systemtap tracing support]) ++AC_ARG_ENABLE([systemtap], ++ [AS_HELP_STRING([--enable-systemtap], ++ [Enable inclusion of systemtap trace support])], ++ [ENABLE_SYSTEMTAP="${enableval}"], [ENABLE_SYSTEMTAP='no']) ++AM_CONDITIONAL([ENABLE_SYSTEMTAP], [test x$ENABLE_SYSTEMTAP = xyes]) ++AC_MSG_RESULT(${ENABLE_SYSTEMTAP}) ++ ++if test "x${ENABLE_SYSTEMTAP}" = xyes; then ++ # Additional configuration for --enable-systemtap is HERE ++ AC_CHECK_PROGS(DTRACE, dtrace) ++ if test -z "$DTRACE"; then ++ AC_MSG_ERROR([dtrace not found]) ++ fi ++ AC_CHECK_HEADER([sys/sdt.h], [SDT_H_FOUND='yes'], ++ [SDT_H_FOUND='no'; ++ AC_MSG_ERROR([systemtap support needs sys/sdt.h header])]) ++ AC_DEFINE([HAVE_SYSTEMTAP], [1], [Define to 1 if using SystemTap probes.]) ++ AC_ARG_WITH([tapset-install-dir], ++ [AS_HELP_STRING([--with-tapset-install-dir], ++ [The absolute path where the tapset dir will be installed])], ++ [if test "x${withval}" = x; then ++ ABS_TAPSET_DIR="\$(datadir)/systemtap/tapset" ++ else ++ ABS_TAPSET_DIR="${withval}" ++ fi], [ABS_TAPSET_DIR="\$(datadir)/systemtap/tapset"]) ++ AC_SUBST(ABS_TAPSET_DIR) ++fi ++ + + OSMO_AC_CODE_COVERAGE + +@@ -446,6 +478,7 @@ AC_OUTPUT( + src/gb/Makefile + src/ctrl/Makefile + src/pseudotalloc/Makefile ++ tapset/Makefile + tests/Makefile + tests/atlocal + utils/Makefile +diff --git a/src/Makefile.am b/src/Makefile.am +index 891b4a6f..f03ce559 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -28,6 +28,7 @@ libosmocore_la_SOURCES = context.c timer.c timer_gettimeofday.c timer_clockgetti + sockaddr_str.c \ + use_count.c \ + exec.c \ ++ probes.d \ + $(NULL) + + if HAVE_SSSE3 +@@ -71,5 +72,16 @@ if ENABLE_SERIAL + libosmocore_la_SOURCES += serial.c + endif + ++if ENABLE_SYSTEMTAP ++probes.h: probes.d ++ $(DTRACE) -C -h -s $< -o $@ ++ ++probes.lo: probes.d ++ $(LIBTOOL) --mode=compile $(AM_V_lt) --tag=CC env CFLAGS="$(CFLAGS)" $(DTRACE) -C -G -s $< -o $@ ++ ++BUILT_SOURCES += probes.h probes.lo ++libosmocore_la_LIBADD += probes.lo ++endif ++ + crc%gen.c: crcXXgen.c.tpl + $(AM_V_GEN)sed -e's/XX/$*/g' $< > $@ +diff --git a/src/logging.c b/src/logging.c +index 212b0b99..b480f0b5 100644 +--- a/src/logging.c ++++ b/src/logging.c +@@ -44,6 +44,17 @@ + #include <syslog.h> + #endif + ++#ifdef HAVE_SYSTEMTAP ++/* include the generated probes header and put markers in code */ ++#include "probes.h" ++#define TRACE(probe) probe ++#define TRACE_ENABLED(probe) probe ## _ENABLED() ++#else ++/* Wrap the probe to allow it to be removed when no systemtap available */ ++#define TRACE(probe) ++#define TRACE_ENABLED(probe) (0) ++#endif /* HAVE_SYSTEMTAP */ ++ + #include <time.h> + #include <sys/time.h> + #include <errno.h> +@@ -642,9 +653,11 @@ void logp2(int subsys, unsigned int level, const char *file, int line, int cont, + { + va_list ap; + ++ LIBOSMOCORE_LOG_START(); + va_start(ap, format); + osmo_vlogp(subsys, level, file, line, cont, format, ap); + va_end(ap); ++ LIBOSMOCORE_LOG_DONE(); + } + + /*! Register a new log target with the logging core +@@ -831,6 +844,14 @@ void log_set_category_filter(struct log_target *target, int category, + } + + #if (!EMBEDDED) ++static void _stderr_output(struct log_target *target, unsigned int level, ++ const char *log) ++{ ++ LIBOSMOCORE_STDERR_START(strlen(log)); ++ fprintf(target->tgt_file.out, "%s", log); ++ fflush(target->tgt_file.out); ++ LIBOSMOCORE_STDERR_DONE(); ++} + static void _file_output(struct log_target *target, unsigned int level, + const char *log) + { +@@ -898,7 +919,7 @@ struct log_target *log_target_create_stderr(void) + + target->type = LOG_TGT_TYPE_STDERR; + target->tgt_file.out = stderr; +- target->output = _file_output; ++ target->output = _stderr_output; + return target; + #else + return NULL; +diff --git a/src/probes.d b/src/probes.d +new file mode 100644 +index 00000000..12840577 +--- /dev/null ++++ b/src/probes.d +@@ -0,0 +1,7 @@ ++provider libosmocore { ++ probe stderr_start(int); /* (int number of octets) */ ++ probe stderr_done() ++ ++ probe log_start(); ++ probe log_done() ++}; +diff --git a/tapset/Makefile.am b/tapset/Makefile.am +new file mode 100644 +index 00000000..a07a3b1d +--- /dev/null ++++ b/tapset/Makefile.am +@@ -0,0 +1,22 @@ ++.PHONY: clean-local install-data-hook uninstall-local ++ ++EXTRA_DIST = libosmocore.stp ++TAPSET_FILES = $(EXTRA_DIST) ++TAPSET_INSTALL_DIR = $(DESTDIR)@ABS_TAPSET_DIR@ ++ ++if ENABLE_SYSTEMTAP ++all-local: $(TAPSET_FILES) ++ ++clean-local: ++ ++install-data-hook: ++ $(MKDIR_P) $(TAPSET_INSTALL_DIR) ++ $(INSTALL_DATA) $(TAPSET_FILES) $(TAPSET_INSTALL_DIR) ++ ++uninstall-local: ++ @list='$(TAPSET_FILES)'; for p in $$list; do \ ++ echo " rm -f '$(TAPSET_INSTALL_DIR)/$$p'"; \ ++ rm -f "$(TAPSET_INSTALL_DIR)/$$p"; \ ++ done ++ ++endif +diff --git a/tapset/libosmocore.stp b/tapset/libosmocore.stp +new file mode 100644 +index 00000000..10fa7b24 +--- /dev/null ++++ b/tapset/libosmocore.stp +@@ -0,0 +1,18 @@ ++/* libosmocore tapset ++ * ++ * This file is part of libosmocore. ++ * ++ * Each probe defines the probe name and a full probestr which consist of the probe name and between ++ * brackets all argument names and values. ++ */ ++ ++probe libosmocore_stderr_start = process("libosmocore").mark("stderr_start") ++{ ++ count = $arg1; ++ probestr = sprintf("%s(count=%d), $$name, count); ++} ++ ++probe libosmocore_stderr_done = process("libosmocore").mark("stderr_done") ++{ ++ probestr = sprintf("%s", $$name); ++} +-- +2.28.0 + |