rtla: Real-Time Linux Analysis tool
authorDaniel Bristot de Oliveira <bristot@kernel.org>
Fri, 10 Dec 2021 18:11:20 +0000 (19:11 +0100)
committerSteven Rostedt <rostedt@goodmis.org>
Thu, 13 Jan 2022 22:02:42 +0000 (17:02 -0500)
The rtla is a meta-tool that includes a set of commands that aims
to analyze the real-time properties of Linux. But instead of testing
Linux as a black box, rtla leverages kernel tracing capabilities to
provide precise information about the properties and root causes of
unexpected results.

rtla --help works and provide information about the available options.

This is just the "main" and the Makefile, no function yet.

Link: https://lkml.kernel.org/r/bf9118ed43a09e6c054c9a491cbe7411ad1acd89.1639158831.git.bristot@kernel.org
Cc: Tao Zhou <tao.zhou@linux.dev>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Tom Zanussi <zanussi@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Clark Williams <williams@redhat.com>
Cc: John Kacur <jkacur@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
Cc: linux-rt-users@vger.kernel.org
Cc: linux-trace-devel@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
tools/tracing/rtla/Makefile [new file with mode: 0644]
tools/tracing/rtla/README.txt [new file with mode: 0644]
tools/tracing/rtla/src/rtla.c [new file with mode: 0644]

diff --git a/tools/tracing/rtla/Makefile b/tools/tracing/rtla/Makefile
new file mode 100644 (file)
index 0000000..56b1bdd
--- /dev/null
@@ -0,0 +1,76 @@
+NAME   :=      rtla
+VERSION        :=      0.5
+
+# From libtracefs:
+# Makefiles suck: This macro sets a default value of $(2) for the
+# variable named by $(1), unless the variable has been set by
+# environment or command line. This is necessary for CC and AR
+# because make sets default values, so the simpler ?= approach
+# won't work as expected.
+define allow-override
+  $(if $(or $(findstring environment,$(origin $(1))),\
+            $(findstring command line,$(origin $(1)))),,\
+    $(eval $(1) = $(2)))
+endef
+
+# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
+$(call allow-override,CC,$(CROSS_COMPILE)gcc)
+$(call allow-override,AR,$(CROSS_COMPILE)ar)
+$(call allow-override,STRIP,$(CROSS_COMPILE)strip)
+$(call allow-override,PKG_CONFIG,pkg-config)
+$(call allow-override,LD_SO_CONF_PATH,/etc/ld.so.conf.d/)
+$(call allow-override,LDCONFIG,ldconfig)
+
+INSTALL        =       install
+FOPTS  :=      -flto=auto -ffat-lto-objects -fexceptions -fstack-protector-strong \
+               -fasynchronous-unwind-tables -fstack-clash-protection
+WOPTS  :=      -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -Wno-maybe-uninitialized
+
+TRACEFS_HEADERS        := $$($(PKG_CONFIG) --cflags libtracefs)
+
+CFLAGS :=      -O -g -DVERSION=\"$(VERSION)\" $(FOPTS) $(MOPTS) $(WOPTS) $(TRACEFS_HEADERS)
+LDFLAGS        :=      -ggdb
+LIBS   :=      $$($(PKG_CONFIG) --libs libtracefs) -lprocps
+
+SRC    :=      $(wildcard src/*.c)
+HDR    :=      $(wildcard src/*.h)
+OBJ    :=      $(SRC:.c=.o)
+DIRS   :=      src
+FILES  :=      Makefile README.txt
+CEXT   :=      bz2
+TARBALL        :=      $(NAME)-$(VERSION).tar.$(CEXT)
+TAROPTS        :=      -cvjf $(TARBALL)
+BINDIR :=      /usr/bin
+DATADIR        :=      /usr/share
+DOCDIR :=      $(DATADIR)/doc
+MANDIR :=      $(DATADIR)/man
+LICDIR :=      $(DATADIR)/licenses
+
+.PHONY:        all
+all:   rtla
+
+rtla: $(OBJ)
+       $(CC) -o rtla $(LDFLAGS) $(OBJ) $(LIBS)
+
+static: $(OBJ)
+       $(CC) -o rtla-static $(LDFLAGS) --static $(OBJ) $(LIBS) -lpthread -ldl
+
+.PHONY: install
+install:
+       $(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)
+       $(INSTALL) rtla -m 755 $(DESTDIR)$(BINDIR)
+       $(STRIP) $(DESTDIR)$(BINDIR)/rtla
+
+.PHONY: clean tarball
+clean:
+       @test ! -f rtla || rm rtla
+       @test ! -f rtla-static || rm rtla-static
+       @test ! -f src/rtla.o || rm src/rtla.o
+       @test ! -f $(TARBALL) || rm -f $(TARBALL)
+       @rm -rf *~ $(OBJ) *.tar.$(CEXT)
+
+tarball:  clean
+       rm -rf $(NAME)-$(VERSION) && mkdir $(NAME)-$(VERSION)
+       cp -r $(DIRS) $(FILES) $(NAME)-$(VERSION)
+       tar $(TAROPTS) --exclude='*~' $(NAME)-$(VERSION)
+       rm -rf $(NAME)-$(VERSION)
diff --git a/tools/tracing/rtla/README.txt b/tools/tracing/rtla/README.txt
new file mode 100644 (file)
index 0000000..6c88446
--- /dev/null
@@ -0,0 +1,36 @@
+RTLA: Real-Time Linux Analysis tools
+
+The rtla is a meta-tool that includes a set of commands that
+aims to analyze the real-time properties of Linux. But, instead of
+testing Linux as a black box, rtla leverages kernel tracing
+capabilities to provide precise information about the properties
+and root causes of unexpected results.
+
+Installing RTLA
+
+RTLA depends on some libraries and tools. More precisely, it depends on the
+following libraries:
+
+ - libtracefs
+ - libtraceevent
+ - procps
+
+It also depends on python3-docutils to compile man pages.
+
+For development, we suggest the following steps for compiling rtla:
+
+  $ git clone git://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git
+  $ cd libtraceevent/
+  $ make
+  $ sudo make install
+  $ cd ..
+  $ git clone git://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git
+  $ cd libtracefs/
+  $ make
+  $ sudo make install
+  $ cd ..
+  $ cd $rtla_src
+  $ make
+  $ sudo make install
+
+For further information, please refer to the rtla man page.
diff --git a/tools/tracing/rtla/src/rtla.c b/tools/tracing/rtla/src/rtla.c
new file mode 100644 (file)
index 0000000..5ae2664
--- /dev/null
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2021 Red Hat Inc, Daniel Bristot de Oliveira <bristot@kernel.org>
+ */
+
+#include <getopt.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+/*
+ * rtla_usage - print rtla usage
+ */
+static void rtla_usage(void)
+{
+       int i;
+
+       static const char *msg[] = {
+               "",
+               "rtla version " VERSION,
+               "",
+               "  usage: rtla COMMAND ...",
+               "",
+               "  commands:",
+               "",
+               NULL,
+       };
+
+       for (i = 0; msg[i]; i++)
+               fprintf(stderr, "%s\n", msg[i]);
+       exit(1);
+}
+
+/*
+ * run_command - try to run a rtla tool command
+ *
+ * It returns 0 if it fails. The tool's main will generally not
+ * return as they should call exit().
+ */
+int run_command(int argc, char **argv, int start_position)
+{
+       return 0;
+}
+
+int main(int argc, char *argv[])
+{
+       int retval;
+
+       /* is it an alias? */
+       retval = run_command(argc, argv, 0);
+       if (retval)
+               exit(0);
+
+       if (argc < 2)
+               goto usage;
+
+       if (strcmp(argv[1], "-h") == 0) {
+               rtla_usage();
+               exit(0);
+       } else if (strcmp(argv[1], "--help") == 0) {
+               rtla_usage();
+               exit(0);
+       }
+
+       retval = run_command(argc, argv, 1);
+       if (retval)
+               exit(0);
+
+usage:
+       rtla_usage();
+       exit(1);
+}