mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	rtla: Real-Time Linux Analysis tool
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>
This commit is contained in:
		
							parent
							
								
									0878355b51
								
							
						
					
					
						commit
						79ce8f43ac
					
				
					 3 changed files with 184 additions and 0 deletions
				
			
		
							
								
								
									
										76
									
								
								tools/tracing/rtla/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								tools/tracing/rtla/Makefile
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -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)
 | 
				
			||||||
							
								
								
									
										36
									
								
								tools/tracing/rtla/README.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								tools/tracing/rtla/README.txt
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -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.
 | 
				
			||||||
							
								
								
									
										72
									
								
								tools/tracing/rtla/src/rtla.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								tools/tracing/rtla/src/rtla.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -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);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in a new issue