diff --git a/.bpftrace.metadata b/.bpftrace.metadata index 2b446c6..97a8f2e 100644 --- a/.bpftrace.metadata +++ b/.bpftrace.metadata @@ -1 +1 @@ -f35927be0719e7537e10cab1f4bee28705270ff8 SOURCES/bpftrace-0.9.2.tar.gz +1b1d4e5058e07f82904971e65733791b25ef5263 SOURCES/bpftrace-0.10.0.tar.gz diff --git a/.gitignore b/.gitignore index 1edb7c1..03fef87 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/bpftrace-0.9.2.tar.gz +SOURCES/bpftrace-0.10.0.tar.gz diff --git a/SOURCES/bpftrace-0.10.0-Add-s390x-register-support.patch b/SOURCES/bpftrace-0.10.0-Add-s390x-register-support.patch new file mode 100644 index 0000000..8b162b4 --- /dev/null +++ b/SOURCES/bpftrace-0.10.0-Add-s390x-register-support.patch @@ -0,0 +1,126 @@ +From 3516f05627b33cb2e6e74965650c6d6c043f78f9 Mon Sep 17 00:00:00 2001 +From: Sumanth Korikkar +Date: Mon, 6 Apr 2020 09:23:34 +0200 +Subject: [PATCH] bpftrace: Add s390x register support + +Add s390x specific registers. This is needed for bpftrace builtins like argX, +regs(), retval etc. This commit provides various functions to perform proper +offset calculation from the pt_regs context. The builtin functions of +bpftrace uses these offset functions to generate the proper bytecode for s390x + +Signed-off-by: Sumanth Korikkar +Acked-by: Ilya Leoshkevich +--- + src/arch/CMakeLists.txt | 3 ++ + src/arch/s390.cpp | 85 +++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 88 insertions(+) + create mode 100644 src/arch/s390.cpp + +diff --git a/src/arch/CMakeLists.txt b/src/arch/CMakeLists.txt +index 7156276..51707cb 100644 +--- a/src/arch/CMakeLists.txt ++++ b/src/arch/CMakeLists.txt +@@ -3,6 +3,9 @@ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64" OR + CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le") + add_library(arch ppc64.cpp) ++elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "s390" OR ++ CMAKE_SYSTEM_PROCESSOR STREQUAL "s390x") ++ add_library(arch s390.cpp) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + add_library(arch x86_64.cpp) + else() +diff --git a/src/arch/s390.cpp b/src/arch/s390.cpp +new file mode 100644 +index 0000000..a2278c8 +--- /dev/null ++++ b/src/arch/s390.cpp +@@ -0,0 +1,85 @@ ++#include "arch.h" ++ ++#include ++#include ++ ++#define REQ_REGISTERS 19 ++#define ARG_REGISTERS 5 ++ ++namespace bpftrace { ++namespace arch { ++ ++// clang-format off ++static std::array registers = { ++ // Breakpoint event address ++ "arg", ++ "pswmask", ++ // Instruction address ++ "pswaddr", ++ "r0", ++ "r1", ++ "r2", ++ "r3", ++ "r4", ++ "r5", ++ "r6", ++ "r7", ++ "r8", ++ "r9", ++ "r10", ++ "r11", ++ "r12", ++ "r13", ++ "r14", ++ "r15", ++}; ++ ++static std::array arg_registers = { ++ "r2", ++ "r3", ++ "r4", ++ "r5", ++ "r6", ++}; ++// clang-format on ++ ++int offset(std::string reg_name) ++{ ++ auto it = find(registers.begin(), registers.end(), reg_name); ++ if (it == registers.end()) ++ return -1; ++ return distance(registers.begin(), it); ++} ++ ++int max_arg() ++{ ++ return arg_registers.size() - 1; ++} ++ ++int arg_offset(int arg_num) ++{ ++ return offset(arg_registers.at(arg_num)); ++} ++ ++int ret_offset() ++{ ++ return offset("r2"); ++} ++ ++int pc_offset() ++{ ++ return offset("pswaddr"); ++} ++ ++int sp_offset() ++{ ++ return offset("r15"); ++} ++ ++std::string name() ++{ ++ return std::string("s390x"); ++} ++ ++} // namespace arch ++} // namespace bpftrace +-- +2.25.3 + diff --git a/SOURCES/bpftrace-0.10.0-Fix-KBUILD_MODNAME.patch b/SOURCES/bpftrace-0.10.0-Fix-KBUILD_MODNAME.patch new file mode 100644 index 0000000..420e7ba --- /dev/null +++ b/SOURCES/bpftrace-0.10.0-Fix-KBUILD_MODNAME.patch @@ -0,0 +1,27 @@ +From 042675755d1ec2446105af700cd9cfb1bace905c Mon Sep 17 00:00:00 2001 +From: Masanori Misono +Date: Wed, 27 May 2020 17:54:52 +0900 +Subject: [PATCH] Fix KBUILD_MODNAME + +Use "bpftrace" instead of '"bpftrace"'. Previously this causes build +error if included header files use KBUILD_MODNAME. +--- + src/utils.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/utils.cpp b/src/utils.cpp +index dc82689..cec77cf 100644 +--- a/src/utils.cpp ++++ b/src/utils.cpp +@@ -363,7 +363,7 @@ std::vector get_kernel_cflags( + cflags.push_back("-D__HAVE_BUILTIN_BSWAP16__"); + cflags.push_back("-D__HAVE_BUILTIN_BSWAP32__"); + cflags.push_back("-D__HAVE_BUILTIN_BSWAP64__"); +- cflags.push_back("-DKBUILD_MODNAME='\"bpftrace\"'"); ++ cflags.push_back("-DKBUILD_MODNAME=\"bpftrace\""); + + // If ARCH env variable is set, pass this along. + if (archenv) +-- +2.25.4 + diff --git a/SOURCES/bpftrace-0.10.0-RHEL-8-aarch64-fixes-statsnoop-and-opensnoop.patch b/SOURCES/bpftrace-0.10.0-RHEL-8-aarch64-fixes-statsnoop-and-opensnoop.patch new file mode 100644 index 0000000..3c1599f --- /dev/null +++ b/SOURCES/bpftrace-0.10.0-RHEL-8-aarch64-fixes-statsnoop-and-opensnoop.patch @@ -0,0 +1,64 @@ +From e9ebda9b3d14831df5e1c5174d21f322e084d074 Mon Sep 17 00:00:00 2001 +From: Jerome Marchand +Date: Thu, 11 Jun 2020 14:56:36 +0200 +Subject: [PATCH] RHEL-8: aarch64: fixes statsnoop and opensnoop + +On aarch64 the open syscall has been dropped. Only openat remains, +wich is called by libc open() function. + +The state of *stat* syscalls, is a mess. They are several generations +of the system calls, and not all arches provides all of them. For +instance, new(l)stat are missing from aarch64. + +The only way I can think of fixing thess is RHEL-8 only arch specific +patches. +--- + tools/opensnoop.bt | 2 -- + tools/statsnoop.bt | 8 ++------ + 2 files changed, 2 insertions(+), 8 deletions(-) + +diff --git a/tools/opensnoop.bt b/tools/opensnoop.bt +index a7de802..d99db93 100755 +--- a/tools/opensnoop.bt ++++ b/tools/opensnoop.bt +@@ -21,13 +21,11 @@ BEGIN + printf("%-6s %-16s %4s %3s %s\n", "PID", "COMM", "FD", "ERR", "PATH"); + } + +-tracepoint:syscalls:sys_enter_open, + tracepoint:syscalls:sys_enter_openat + { + @filename[tid] = args->filename; + } + +-tracepoint:syscalls:sys_exit_open, + tracepoint:syscalls:sys_exit_openat + /@filename[tid]/ + { +diff --git a/tools/statsnoop.bt b/tools/statsnoop.bt +index b2d529e..f612ea9 100755 +--- a/tools/statsnoop.bt ++++ b/tools/statsnoop.bt +@@ -30,17 +30,13 @@ tracepoint:syscalls:sys_enter_statfs + @filename[tid] = args->pathname; + } + +-tracepoint:syscalls:sys_enter_statx, +-tracepoint:syscalls:sys_enter_newstat, +-tracepoint:syscalls:sys_enter_newlstat ++tracepoint:syscalls:sys_enter_statx + { + @filename[tid] = args->filename; + } + + tracepoint:syscalls:sys_exit_statfs, +-tracepoint:syscalls:sys_exit_statx, +-tracepoint:syscalls:sys_exit_newstat, +-tracepoint:syscalls:sys_exit_newlstat ++tracepoint:syscalls:sys_exit_statx + /@filename[tid]/ + { + $ret = args->ret; +-- +2.25.4 + diff --git a/SOURCES/bpftrace-0.10.0-RHEL-8-fixes.patch b/SOURCES/bpftrace-0.10.0-RHEL-8-fixes.patch new file mode 100644 index 0000000..7c4becf --- /dev/null +++ b/SOURCES/bpftrace-0.10.0-RHEL-8-fixes.patch @@ -0,0 +1,56 @@ +From a09a2f06d6316801e89e7f676d0839910aea765d Mon Sep 17 00:00:00 2001 +From: Jerome Marchand +Date: Tue, 11 Jun 2019 16:41:59 +0200 +Subject: [PATCH] RHEL 8 fixes + +Fixes the following RHEL 8 specific issues: + - library path in gethostlatency and threadsnoop +--- + tools/gethostlatency.bt | 12 ++++++------ + tools/threadsnoop.bt | 2 +- + 2 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/tools/gethostlatency.bt b/tools/gethostlatency.bt +index a1ac1b2..ade1005 100755 +--- a/tools/gethostlatency.bt ++++ b/tools/gethostlatency.bt +@@ -26,17 +26,17 @@ BEGIN + "HOST"); + } + +-uprobe:/lib/x86_64-linux-gnu/libc.so.6:getaddrinfo, +-uprobe:/lib/x86_64-linux-gnu/libc.so.6:gethostbyname, +-uprobe:/lib/x86_64-linux-gnu/libc.so.6:gethostbyname2 ++uprobe:/lib64/libc.so.6:getaddrinfo, ++uprobe:/lib64/libc.so.6:gethostbyname, ++uprobe:/lib64/libc.so.6:gethostbyname2 + { + @start[tid] = nsecs; + @name[tid] = arg0; + } + +-uretprobe:/lib/x86_64-linux-gnu/libc.so.6:getaddrinfo, +-uretprobe:/lib/x86_64-linux-gnu/libc.so.6:gethostbyname, +-uretprobe:/lib/x86_64-linux-gnu/libc.so.6:gethostbyname2 ++uretprobe:/lib64/libc.so.6:getaddrinfo, ++uretprobe:/lib64/libc.so.6:gethostbyname, ++uretprobe:/lib64/libc.so.6:gethostbyname2 + /@start[tid]/ + { + $latms = (nsecs - @start[tid]) / 1000000; +diff --git a/tools/threadsnoop.bt b/tools/threadsnoop.bt +index e4d3875..c56b1ac 100755 +--- a/tools/threadsnoop.bt ++++ b/tools/threadsnoop.bt +@@ -18,7 +18,7 @@ BEGIN + printf("%-10s %-6s %-16s %s\n", "TIME(ms)", "PID", "COMM", "FUNC"); + } + +-uprobe:/lib/x86_64-linux-gnu/libpthread.so.0:pthread_create ++uprobe:/usr/lib64/libpthread.so:pthread_create + { + printf("%-10u %-6d %-16s %s\n", elapsed / 1000000, pid, comm, + usym(arg2)); +-- +2.25.4 + diff --git a/SOURCES/bpftrace-0.10.0-Remove-RLIMIT_AS-limit.patch b/SOURCES/bpftrace-0.10.0-Remove-RLIMIT_AS-limit.patch new file mode 100644 index 0000000..95c4f22 --- /dev/null +++ b/SOURCES/bpftrace-0.10.0-Remove-RLIMIT_AS-limit.patch @@ -0,0 +1,73 @@ +From 604c9d5619ca01a46c208a70b7beec3041ba77a9 Mon Sep 17 00:00:00 2001 +From: Daniel Xu +Date: Thu, 28 May 2020 23:12:47 -0700 +Subject: [PATCH] Remove RLIMIT_AS limit + +We haven't seen any OOM issues in a while so I suspect either our type +fixes in bpftrace or upstream llvm changes have resolved the issue. + +This closes #1355. +--- + src/CMakeLists.txt | 1 - + src/main.cpp | 26 -------------------------- + 2 files changed, 27 deletions(-) + +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index 4fa0418..ac040f4 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -99,7 +99,6 @@ if (BUILD_ASAN) + # target_link_options is supported in CMake 3.13 and newer + message("Please use CMake 3.13 or newer to enable ASAN") + endif() +- target_compile_definitions(bpftrace PRIVATE BUILD_ASAN) + target_compile_options(bpftrace PUBLIC "-fsanitize=address") + target_link_options(bpftrace PUBLIC "-fsanitize=address") + endif() +diff --git a/src/main.cpp b/src/main.cpp +index 4ff9d37..d92ea8d 100644 +--- a/src/main.cpp ++++ b/src/main.cpp +@@ -92,30 +92,6 @@ static void enforce_infinite_rlimit() { + "\"ulimit -l 8192\" to fix the problem" << std::endl; + } + +-#ifdef BUILD_ASAN +-static void cap_memory_limits() +-{ +-} +-#else +-static void cap_memory_limits() { +- struct rlimit rl = {}; +- int err; +- uint64_t memory_limit_bytes = 1 * 1024 * 1024 * 1024; +- +- // this is a safety measure for issue #528 "LLVM ERROR: out of memory", +- // and caps bpftrace memory to 1 Gbyte. This may be removed once the LLVM +- // issue has been fixed, and this is no longer deemed necessary. +- rl.rlim_max = memory_limit_bytes; +- rl.rlim_cur = rl.rlim_max; +- err = setrlimit(RLIMIT_AS, &rl); +- err += setrlimit(RLIMIT_RSS, &rl); +- if (err) +- std::cerr << std::strerror(err)<<": couldn't set RLIMIT_AS and " << +- "RLIMIT_RSS for bpftrace (these are a temporary precaution to stop " << +- "accidental large program loads, and are not required" << std::endl; +-} +-#endif // BUILD_ASAN +- + bool is_root() + { + if (geteuid() != 0) +@@ -425,8 +401,6 @@ int main(int argc, char *argv[]) + // rlimit? + enforce_infinite_rlimit(); + +- cap_memory_limits(); +- + // positional parameters + while (optind < argc) { + bpftrace.add_param(argv[optind]); +-- +2.25.4 + diff --git a/SOURCES/bpftrace-0.9.2-RHEL-8-fixes.patch b/SOURCES/bpftrace-0.9.2-RHEL-8-fixes.patch deleted file mode 100644 index b15f98a..0000000 --- a/SOURCES/bpftrace-0.9.2-RHEL-8-fixes.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 1dce61acfec57712f84cfdf2a8f4c69d27744b04 Mon Sep 17 00:00:00 2001 -From: Jerome Marchand -Date: Tue, 11 Jun 2019 16:41:59 +0200 -Subject: RHEL 8 fixes - -Fixes the following RHEL 8 specific issues: - - library path in gethostlatency - ---- - tools/gethostlatency.bt | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/tools/gethostlatency.bt b/tools/gethostlatency.bt -index a1ac1b2..ade1005 100755 ---- a/tools/gethostlatency.bt -+++ b/tools/gethostlatency.bt -@@ -26,17 +26,17 @@ BEGIN - "HOST"); - } - --uprobe:/lib/x86_64-linux-gnu/libc.so.6:getaddrinfo, --uprobe:/lib/x86_64-linux-gnu/libc.so.6:gethostbyname, --uprobe:/lib/x86_64-linux-gnu/libc.so.6:gethostbyname2 -+uprobe:/lib64/libc.so.6:getaddrinfo, -+uprobe:/lib64/libc.so.6:gethostbyname, -+uprobe:/lib64/libc.so.6:gethostbyname2 - { - @start[tid] = nsecs; - @name[tid] = arg0; - } - --uretprobe:/lib/x86_64-linux-gnu/libc.so.6:getaddrinfo, --uretprobe:/lib/x86_64-linux-gnu/libc.so.6:gethostbyname, --uretprobe:/lib/x86_64-linux-gnu/libc.so.6:gethostbyname2 -+uretprobe:/lib64/libc.so.6:getaddrinfo, -+uretprobe:/lib64/libc.so.6:gethostbyname, -+uretprobe:/lib64/libc.so.6:gethostbyname2 - /@start[tid]/ - { - $latms = (nsecs - @start[tid]) / 1000000; --- -2.20.1 - diff --git a/SPECS/bpftrace.spec b/SPECS/bpftrace.spec index d1aa05e..c18ce6c 100644 --- a/SPECS/bpftrace.spec +++ b/SPECS/bpftrace.spec @@ -1,14 +1,20 @@ %bcond_without llvm_static Name: bpftrace -Version: 0.9.2 -Release: 1%{?dist} +Version: 0.10.0 +Release: 4%{?dist} Summary: High-level tracing language for Linux eBPF License: ASL 2.0 URL: https://github.com/iovisor/bpftrace Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz Patch0: %{name}-%{version}-RHEL-8-fixes.patch +Patch1: %{name}-%{version}-Add-s390x-register-support.patch +Patch2: %{name}-%{version}-Remove-RLIMIT_AS-limit.patch +Patch3: %{name}-%{version}-Fix-KBUILD_MODNAME.patch +# WARNING: because of the arch-specific patch, no autosetup is used +# Remember to patch accordingly +Patch10: %{name}-%{version}-RHEL-8-aarch64-fixes-statsnoop-and-opensnoop.patch # Arches will be included as upstream support is added and dependencies are # satisfied in the respective arches @@ -39,8 +45,16 @@ and predecessor tracers such as DTrace and SystemTap %prep -%autosetup -p1 +%setup +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 + +%ifarch aarch64 +%patch10 -p1 +%endif %build %cmake . \ @@ -59,8 +73,8 @@ find %{buildroot}%{_datadir}/%{name}/tools -type f -exec \ sed -i -e '1s=^#!/usr/bin/env %{name}\([0-9.]\+\)\?$=#!%{_bindir}/%{name}=' {} \; # Move man pages to the right location -mkdir -p %{buildroot}%{_mandir} -mv %{buildroot}%{_prefix}/man/* %{buildroot}%{_mandir}/ +#mkdir -p %{buildroot}%{_mandir} +#mv %{buildroot}%{_prefix}/man/* %{buildroot}%{_mandir}/ %files @@ -74,9 +88,28 @@ mv %{buildroot}%{_prefix}/man/* %{buildroot}%{_mandir}/ %{_mandir}/man8/* %attr(0755,-,-) %{_datadir}/%{name}/tools/*.bt %{_datadir}/%{name}/tools/doc/*.txt - +# tcp_drop() is inlined on ppc64 +%ifarch %{power64} +%exclude %{_datadir}/%{name}/tools/tcpdrop.bt +%exclude %{_datadir}/%{name}/tools/doc/tcpdrop_example.txt +%exclude %{_mandir}/man8/tcpdrop.8.gz +%endif %changelog +* Thu Jun 11 2020 Jerome Marchand - 0.10.0-4 +- Fix KBUILD_MODNAME + +* Thu Jun 11 2020 Jerome Marchand - 0.10.0-3 +- Fix ENOMEM issue on arm64 machine with many cpus +- Fix statsnoop and opensnoop on aarch64 +- Drop tcpdrop on ppc64 + +* Tue May 05 2020 Jerome Marchand - 0.10.0-2 +- Fix libpthread path in threadsnoop + +* Wed Apr 22 2020 Jerome Marchand - 0.10.0-1 +- Rebase on bpftrace 0.10.0 + * Fri Nov 08 2019 Jerome Marchand - 0.9.2-1 - Rebase on bpftrace 0.9.2