diff --git a/Makefile.am b/Makefile.am index f2a05a960..ab2aad921 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 2077570f1..2a6a18073 100644 --- a/configure.ac +++ b/configure.ac @@ -433,6 +433,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 @@ -487,6 +519,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 dd31db886..a2566a330 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -29,6 +29,7 @@ libosmocore_la_SOURCES = context.c timer.c timer_gettimeofday.c timer_clockgetti use_count.c \ exec.c \ it_q.c \ + probes.d \ $(NULL) if HAVE_SSSE3 @@ -82,5 +83,16 @@ libosmocore_la_SOURCES += mnl.c libosmocore_la_LIBADD += $(LIBMNL_LIBS) 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 60dba64c7..a40008e93 100644 --- a/src/logging.c +++ b/src/logging.c @@ -44,6 +44,17 @@ #include #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 #include #include @@ -670,9 +681,11 @@ void logp2(int subsys, unsigned int level, const char *file, int line, int cont, { va_list ap; + TRACE(LIBOSMOCORE_LOG_START()); va_start(ap, format); osmo_vlogp(subsys, level, file, line, cont, format, ap); va_end(ap); + TRACE(LIBOSMOCORE_LOG_DONE()); } /*! Register a new log target with the logging core diff --git a/src/probes.d b/src/probes.d new file mode 100644 index 000000000..c16eb1ee9 --- /dev/null +++ b/src/probes.d @@ -0,0 +1,4 @@ +provider libosmocore { + probe log_start(); + probe log_done(); +}; diff --git a/tapset/Makefile.am b/tapset/Makefile.am new file mode 100644 index 000000000..a07a3b1d8 --- /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 000000000..0ec3c423c --- /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_log_start = process("libosmocore").mark("log_start") +{ + count = $arg1; + probestr = sprintf("%s(count=%d), $$name, count); +} + +probe libosmocore_log_done = process("libosmocore").mark("log_done") +{ + probestr = sprintf("%s", $$name); +}