mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-11 13:04:03 +08:00
dada03db9b
Daniel Wagner reported to me that readproc.h got deprecated. Also,
while the procps-ng library was available on Fedora, it was not available
on RHEL, which is a piece of evidence that it was not that used.
rtla uses procps-ng only to find the PID of the tracers' workload.
I used the procps-ng library to avoid reinventing the wheel. But in this
case, reinventing the wheel took me less time than the time we already
took trying to work around problems.
Implement a function that reads /proc/ entries, checking if:
- the entry is a directory
- the directory name is composed only of digits (PID)
- the directory contains the comm file
- the comm file contains a comm that matches the tracers'
workload prefix.
- then return true; otherwise, return false.
And use it instead of procps-ng.
Link: https://lkml.kernel.org/r/e8276e122ee9eb2c5a0ba8e673fb6488b924b825.1652423574.git.bristot@kernel.org
Cc: John Kacur <jkacur@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Tao Zhou <tao.zhou@linux.dev>
Fixes: b1696371d8
("rtla: Helper functions for rtla")
Reported-by: Daniel Wagner <dwagner@suse.de>
Reviewed-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
141 lines
4.7 KiB
Makefile
141 lines
4.7 KiB
Makefile
NAME := rtla
|
|
# Follow the kernel version
|
|
VERSION := $(shell cat VERSION 2> /dev/null || make -sC ../../.. kernelversion)
|
|
|
|
# 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
|
|
MKDIR = mkdir
|
|
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)
|
|
|
|
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
|
|
SRCTREE := $(or $(BUILD_SRC),$(CURDIR))
|
|
|
|
# If running from the tarball, man pages are stored in the Documentation
|
|
# dir. If running from the kernel source, man pages are stored in
|
|
# Documentation/tools/rtla/.
|
|
ifneq ($(wildcard Documentation/.*),)
|
|
DOCSRC = Documentation/
|
|
else
|
|
DOCSRC = $(SRCTREE)/../../../Documentation/tools/rtla/
|
|
endif
|
|
|
|
LIBTRACEEVENT_MIN_VERSION = 1.5
|
|
LIBTRACEFS_MIN_VERSION = 1.3
|
|
|
|
TEST_LIBTRACEEVENT = $(shell sh -c "$(PKG_CONFIG) --atleast-version $(LIBTRACEEVENT_MIN_VERSION) libtraceevent > /dev/null 2>&1 || echo n")
|
|
ifeq ("$(TEST_LIBTRACEEVENT)", "n")
|
|
.PHONY: warning_traceevent
|
|
warning_traceevent:
|
|
@echo "********************************************"
|
|
@echo "** NOTICE: libtraceevent version $(LIBTRACEEVENT_MIN_VERSION) or higher not found"
|
|
@echo "**"
|
|
@echo "** Consider installing the latest libtraceevent from your"
|
|
@echo "** distribution, e.g., 'dnf install libtraceevent' on Fedora,"
|
|
@echo "** or from source:"
|
|
@echo "**"
|
|
@echo "** https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/ "
|
|
@echo "**"
|
|
@echo "********************************************"
|
|
endif
|
|
|
|
TEST_LIBTRACEFS = $(shell sh -c "$(PKG_CONFIG) --atleast-version $(LIBTRACEFS_MIN_VERSION) libtracefs > /dev/null 2>&1 || echo n")
|
|
ifeq ("$(TEST_LIBTRACEFS)", "n")
|
|
.PHONY: warning_tracefs
|
|
warning_tracefs:
|
|
@echo "********************************************"
|
|
@echo "** NOTICE: libtracefs version $(LIBTRACEFS_MIN_VERSION) or higher not found"
|
|
@echo "**"
|
|
@echo "** Consider installing the latest libtracefs from your"
|
|
@echo "** distribution, e.g., 'dnf install libtracefs' on Fedora,"
|
|
@echo "** or from source:"
|
|
@echo "**"
|
|
@echo "** https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/ "
|
|
@echo "**"
|
|
@echo "********************************************"
|
|
endif
|
|
|
|
.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: doc_install
|
|
$(MKDIR) -p $(DESTDIR)$(BINDIR)
|
|
$(INSTALL) rtla -m 755 $(DESTDIR)$(BINDIR)
|
|
$(STRIP) $(DESTDIR)$(BINDIR)/rtla
|
|
@test ! -f $(DESTDIR)$(BINDIR)/osnoise || rm $(DESTDIR)$(BINDIR)/osnoise
|
|
ln -s $(DESTDIR)$(BINDIR)/rtla $(DESTDIR)$(BINDIR)/osnoise
|
|
@test ! -f $(DESTDIR)$(BINDIR)/timerlat || rm $(DESTDIR)$(BINDIR)/timerlat
|
|
ln -s $(DESTDIR)$(BINDIR)/rtla $(DESTDIR)$(BINDIR)/timerlat
|
|
|
|
.PHONY: clean tarball
|
|
clean: doc_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)
|
|
echo $(VERSION) > $(NAME)-$(VERSION)/VERSION
|
|
cp -r $(DIRS) $(FILES) $(NAME)-$(VERSION)
|
|
mkdir $(NAME)-$(VERSION)/Documentation/
|
|
cp -rp $(SRCTREE)/../../../Documentation/tools/rtla/* $(NAME)-$(VERSION)/Documentation/
|
|
tar $(TAROPTS) --exclude='*~' $(NAME)-$(VERSION)
|
|
rm -rf $(NAME)-$(VERSION)
|
|
|
|
.PHONY: doc doc_clean doc_install
|
|
doc:
|
|
$(MAKE) -C $(DOCSRC)
|
|
|
|
doc_clean:
|
|
$(MAKE) -C $(DOCSRC) clean
|
|
|
|
doc_install:
|
|
$(MAKE) -C $(DOCSRC) install
|