From b60bd66c70db4435b63160bee48c1dd245e6204c Mon Sep 17 00:00:00 2001 From: Sergey Avseyev Date: Thu, 22 Feb 2018 12:12:09 +0300 Subject: [PATCH 1/7] Backport fix for removed timers in kernel 4.15 (#1546563) --- rhbz1546563.patch | 273 ++++++++++++++++++++++++++++++++++++++++++++++ systemtap.spec | 10 +- 2 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 rhbz1546563.patch diff --git a/rhbz1546563.patch b/rhbz1546563.patch new file mode 100644 index 0000000..4e4030b --- /dev/null +++ b/rhbz1546563.patch @@ -0,0 +1,273 @@ +From fbb26e17a4c026f05a497fc5d584516bad3b6950 Mon Sep 17 00:00:00 2001 +From: David Smith +Date: Wed, 6 Dec 2017 14:37:42 -0600 +Subject: [PATCH] Fix PR22551 by updating the use of timers for the 4.15 + kernel. + +* runtime/linux/timer_compatibility.h: New file. +* runtime/time.c: Update timer callback function parameter type. Update + timer initialization. +* runtime/transport/relay_v2.c: Ditto. +* runtime/transport/transport.c: Ditto. +* tapset-timers.cxx (timer_derived_probe_group::emit_module_decls): + Ditto. Handle old and new timer callback interface. +* runtime/linux/runtime.h: Include timer_compatibility.h instead of timer.h. +* tapset/linux/scsi.stp: Ditto. +--- + runtime/linux/runtime.h | 2 +- + runtime/linux/timer_compatibility.h | 76 +++++++++++++++++++++++++++++++++++++ + runtime/time.c | 7 ++-- + runtime/transport/relay_v2.c | 8 ++-- + runtime/transport/transport.c | 13 +++---- + tapset-timers.cxx | 14 +++++-- + tapset/linux/scsi.stp | 2 +- + 7 files changed, 100 insertions(+), 22 deletions(-) + create mode 100644 runtime/linux/timer_compatibility.h + +diff --git a/runtime/linux/runtime.h b/runtime/linux/runtime.h +index 9c585a2..df9b74c 100644 +--- a/runtime/linux/runtime.h ++++ b/runtime/linux/runtime.h +@@ -34,7 +34,7 @@ + #include + #include + #include +-#include ++#include "timer_compatibility.h" + #include + #include + #include +diff --git a/runtime/linux/timer_compatibility.h b/runtime/linux/timer_compatibility.h +new file mode 100644 +index 0000000..ac03de9 +--- /dev/null ++++ b/runtime/linux/timer_compatibility.h +@@ -0,0 +1,76 @@ ++/* ++ * linux/timer.h compatibility defines and inlines ++ * Copyright (C) 2017 Red Hat Inc. ++ * ++ * This file is part of systemtap, and is free software. You can ++ * redistribute it and/or modify it under the terms of the GNU General ++ * Public License (GPL); either version 2, or (at your option) any ++ * later version. ++ */ ++ ++#ifndef _TIMER_COMPATIBILITY_H_ ++#define _TIMER_COMPATIBILITY_H_ ++ ++#include ++ ++/* ++ * Starting with the 4.15 kernel, the timer interface ++ * changed. Originally, you'd do something like: ++ * ++ * static void timer_func(unsigned long val); ++ * ++ * init_timer(&timer); ++ * timer.expires = jiffies + STP_RELAY_TIMER_INTERVAL; ++ * timer.function = timer_func; ++ * timer.data = 0; ++ * add_timer(&timer); ++ * ++ * The 'data' parameter would get passed to the callback ++ * function. Starting with 4.15, you'd do something like this: ++ * ++ * static void timer_func(struct timer_list *val); ++ * ++ * timer_setup(&timer, timer_func, 0); ++ * timer.expires = jiffies + STP_RELAY_TIMER_INTERVAL; ++ * add_timer(&timer); ++ * ++ * With the new code, the timer that caused the callback gets passed ++ * to the timer callback function. The 'data' field has been removed. ++ * ++ * So, we're going to use the new interface. To hide the differences ++ * between the callback function parameter type, we'll define a new ++ * type, 'stp_timer_callback_parameter_t'. ++ * ++ * If code needs to figure out the difference between the old and new ++ * interface, it should test the TIMER_TRACE_FLAGMASK define (which ++ * only exists in the new interface). ++ */ ++ ++#if defined(TIMER_TRACE_FLAGMASK) ++/* This is the >= 4.15 kernel interface. */ ++ ++typedef struct timer_list * stp_timer_callback_parameter_t; ++ ++#else ++/* This is the < 4.15 kernel interface. */ ++ ++typedef unsigned long stp_timer_callback_parameter_t; ++ ++/** ++ * timer_setup - prepare a timer for first use ++ * @timer: the timer in question ++ * @callback: the function to call when timer expires ++ * @flags: any TIMER_* flags (note that anything other than 0 is an ++ * error, since this compatibility function can't support any ++ * of the TIMER_* flags) ++ */ ++#define timer_setup(timer, callback, flags) \ ++ { \ ++ init_timer((timer)); \ ++ (timer)->function = callback; \ ++ (timer)->data = 0; \ ++ BUILD_BUG_ON_ZERO((flags) != 0); \ ++ } ++#endif ++ ++#endif /* _TIMER_COMPATIBILITY_H_ */ +diff --git a/runtime/time.c b/runtime/time.c +index 2e666d5..91ceafa 100644 +--- a/runtime/time.c ++++ b/runtime/time.c +@@ -168,10 +168,10 @@ __stp_time_smp_callback(void *val) + + /* The timer callback is in a softIRQ -- interrupts enabled. */ + static void +-__stp_time_timer_callback(unsigned long val) ++__stp_time_timer_callback(stp_timer_callback_parameter_t unused) + { + stp_time_t *time =__stp_time_local_update(); +- (void) val; ++ (void) unused; + + /* PR6481: make sure IRQs are enabled before resetting the timer + (IRQs are disabled and then reenabled in +@@ -200,9 +200,8 @@ __stp_init_time(void *info) + time->freq = __stp_get_freq(); + __stp_time_local_update(); + +- init_timer(&time->timer); ++ timer_setup(&time->timer, __stp_time_timer_callback, 0); + time->timer.expires = jiffies + STP_TIME_SYNC_INTERVAL; +- time->timer.function = __stp_time_timer_callback; + + #ifndef STAPCONF_ADD_TIMER_ON + add_timer(&time->timer); +diff --git a/runtime/transport/relay_v2.c b/runtime/transport/relay_v2.c +index f81d75d..135951a 100644 +--- a/runtime/transport/relay_v2.c ++++ b/runtime/transport/relay_v2.c +@@ -30,7 +30,7 @@ + #include + #include + #include +-#include ++#include "../linux/timer_compatibility.h" + #include "../uidgid_compatibility.h" + #include "relay_compat.h" + +@@ -120,7 +120,7 @@ static void __stp_relay_wakeup_readers(struct rchan_buf *buf) + wake_up_interruptible(&buf->read_wait); + } + +-static void __stp_relay_wakeup_timer(unsigned long val) ++static void __stp_relay_wakeup_timer(stp_timer_callback_parameter_t unused) + { + #ifdef STP_BULKMODE + int i; +@@ -151,10 +151,8 @@ static void __stp_relay_wakeup_timer(unsigned long val) + static void __stp_relay_timer_init(void) + { + atomic_set(&_stp_relay_data.wakeup, 0); +- init_timer(&_stp_relay_data.timer); ++ timer_setup(&_stp_relay_data.timer, __stp_relay_wakeup_timer, 0); + _stp_relay_data.timer.expires = jiffies + STP_RELAY_TIMER_INTERVAL; +- _stp_relay_data.timer.function = __stp_relay_wakeup_timer; +- _stp_relay_data.timer.data = 0; + add_timer(&_stp_relay_data.timer); + smp_mb(); + } +diff --git a/runtime/transport/transport.c b/runtime/transport/transport.c +index 3400f22..320fd18 100644 +--- a/runtime/transport/transport.c ++++ b/runtime/transport/transport.c +@@ -311,7 +311,7 @@ static void _stp_detach(void) + } + + +-static void _stp_ctl_work_callback(unsigned long val); ++static void _stp_ctl_work_callback(stp_timer_callback_parameter_t unused); + + /* + * Called when stapio opens the control channel. +@@ -320,13 +320,12 @@ static void _stp_attach(void) + { + dbug_trans(1, "attach\n"); + _stp_pid = current->pid; +- if (_stp_namespaces_pid < 1) +- _stp_namespaces_pid = _stp_pid; ++ if (_stp_namespaces_pid < 1) ++ _stp_namespaces_pid = _stp_pid; + _stp_transport_data_fs_overwrite(0); +- init_timer(&_stp_ctl_work_timer); ++ ++ timer_setup(&_stp_ctl_work_timer, _stp_ctl_work_callback, 0); + _stp_ctl_work_timer.expires = jiffies + STP_CTL_TIMER_INTERVAL; +- _stp_ctl_work_timer.function = _stp_ctl_work_callback; +- _stp_ctl_work_timer.data= 0; + add_timer(&_stp_ctl_work_timer); + } + +@@ -341,7 +340,7 @@ static void _stp_attach(void) + * notified. Reschedules itself if someone is still attached + * to the cmd channel. + */ +-static void _stp_ctl_work_callback(unsigned long val) ++static void _stp_ctl_work_callback(stp_timer_callback_parameter_t unused) + { + int do_io = 0; + unsigned long flags; +diff --git a/tapset-timers.cxx b/tapset-timers.cxx +index 1a40bcd..0ab4d69 100644 +--- a/tapset-timers.cxx ++++ b/tapset-timers.cxx +@@ -122,9 +122,13 @@ timer_derived_probe_group::emit_module_decls (systemtap_session& s) + s.op->newline(-1) << "};"; + s.op->newline(); + +- s.op->newline() << "static void enter_timer_probe (unsigned long val) {"; ++ s.op->newline() << "static void enter_timer_probe (stp_timer_callback_parameter_t val) {"; ++ s.op->newline() << "#if defined(TIMER_TRACE_FLAGMASK)"; ++ s.op->newline(1) << "struct stap_timer_probe* stp = container_of(val, struct stap_timer_probe, timer_list);"; ++ s.op->newline(-1) << "#else"; + s.op->newline(1) << "struct stap_timer_probe* stp = & stap_timer_probes [val];"; +- s.op->newline() << "if ((atomic_read (session_state()) == STAP_SESSION_STARTING) ||"; ++ s.op->newline(-1) << "#endif"; ++ s.op->newline(1) << "if ((atomic_read (session_state()) == STAP_SESSION_STARTING) ||"; + s.op->newline() << " (atomic_read (session_state()) == STAP_SESSION_RUNNING))"; + s.op->newline(1) << "mod_timer (& stp->timer_list, jiffies + "; + emit_interval (s.op); +@@ -148,9 +152,11 @@ timer_derived_probe_group::emit_module_init (systemtap_session& s) + s.op->newline() << "for (i=0; i<" << probes.size() << "; i++) {"; + s.op->newline(1) << "struct stap_timer_probe* stp = & stap_timer_probes [i];"; + s.op->newline() << "probe_point = stp->probe->pp;"; +- s.op->newline() << "init_timer (& stp->timer_list);"; +- s.op->newline() << "stp->timer_list.function = & enter_timer_probe;"; ++ ++ s.op->newline() << "timer_setup (& stp->timer_list, enter_timer_probe, 0);"; ++ s.op->newline() << "#if !defined(TIMER_TRACE_FLAGMASK)"; + s.op->newline() << "stp->timer_list.data = i;"; // NB: important! ++ s.op->newline() << "#endif"; + // copy timer renew calculations from above :-( + s.op->newline() << "stp->timer_list.expires = jiffies + "; + emit_interval (s.op); +diff --git a/tapset/linux/scsi.stp b/tapset/linux/scsi.stp +index 44f686c..3577942 100644 +--- a/tapset/linux/scsi.stp ++++ b/tapset/linux/scsi.stp +@@ -14,7 +14,7 @@ + #include + #include + #include +-#include ++#include "linux/timer_compatibility.h" + #include + %} + +-- +2.9.3 + diff --git a/systemtap.spec b/systemtap.spec index fd53194..73ec13c 100644 --- a/systemtap.spec +++ b/systemtap.spec @@ -74,11 +74,15 @@ Name: systemtap Version: 3.2 -Release: 2%{?dist} +Release: 3%{?dist} # for version, see also configure.ac Patch10: rhbz1504009.patch +# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1546563 +# upstream: https://sourceware.org/bugzilla/show_bug.cgi?id=22551 +Patch11: rhbz1546563.patch + # Packaging abstract: # # systemtap empty req:-client req:-devel @@ -481,6 +485,7 @@ cd .. %endif %patch10 -p1 +%patch11 -p1 %build @@ -1161,6 +1166,9 @@ done # PRERELEASE %changelog +* Thu Feb 22 2018 Sergey Avseyev - 3.2-3 +- rhbz1546563 (backport fix for removed timers in kernel 4.15) + * Fri Oct 20 2017 Frank Ch. Eigler - 3.2-2 - rhbz1504009 (dtrace -G -o /dev/null) From a1381b8649149ae5aa340a220535bfc61e1fa272 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 17 Apr 2018 17:13:18 +0200 Subject: [PATCH 2/7] 3.2-9 - Add unwind-fallback.patch. --- systemtap.spec | 11 +- unwind-fallback.patch | 249 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 259 insertions(+), 1 deletion(-) create mode 100644 unwind-fallback.patch diff --git a/systemtap.spec b/systemtap.spec index 73ec13c..8ba9656 100644 --- a/systemtap.spec +++ b/systemtap.spec @@ -74,7 +74,7 @@ Name: systemtap Version: 3.2 -Release: 3%{?dist} +Release: 9%{?dist} # for version, see also configure.ac Patch10: rhbz1504009.patch @@ -83,6 +83,10 @@ Patch10: rhbz1504009.patch # upstream: https://sourceware.org/bugzilla/show_bug.cgi?id=22551 Patch11: rhbz1546563.patch +# Partial fix for backstrace issues. Add a new kernel fallback unwinder. +# upstream: commit 553b6df07c9b7ab30ed468a6a4374cbdf73d1c0d +Patch13: unwind-fallback.patch + # Packaging abstract: # # systemtap empty req:-client req:-devel @@ -487,6 +491,8 @@ cd .. %patch10 -p1 %patch11 -p1 +%patch13 -p1 + %build %if %{with_bundled_elfutils} @@ -1166,6 +1172,9 @@ done # PRERELEASE %changelog +* Tue Apr 17 2018 Mark Wielaard - 3.2-9 +- Add unwind-fallback.patch. + * Thu Feb 22 2018 Sergey Avseyev - 3.2-3 - rhbz1546563 (backport fix for removed timers in kernel 4.15) diff --git a/unwind-fallback.patch b/unwind-fallback.patch new file mode 100644 index 0000000..bb57607 --- /dev/null +++ b/unwind-fallback.patch @@ -0,0 +1,249 @@ +From 553b6df07c9b7ab30ed468a6a4374cbdf73d1c0d Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Tue, 17 Apr 2018 14:36:13 +0200 +Subject: [PATCH] linux runtime: Add support for new kernel unwind fallback. + +In newer kernels dump_trace got replaced by a new unwind infrastructure. +Add a new autoconf-unwind-stack-trace.c to detect whether we can use it. +Extend the runtime/stack.c _stp_stack_print_fallback with a new pt_regs* +argument. Update all callers and add dbug_unwind output to show which +fallback unwinder we are selecting (or if we are just giving up). +Rename the struct unwind_state in unwind.c and unwind.h to uw_state +because the old name now conflicts with the one used in the kernel. +--- + buildrun.cxx | 2 ++ + runtime/linux/autoconf-unwind-stack-trace.c | 16 +++++++++ + runtime/stack.c | 50 ++++++++++++++++++++++++++--- + runtime/unwind.c | 14 ++++---- + runtime/unwind/unwind.h | 4 +-- + 5 files changed, 72 insertions(+), 14 deletions(-) + create mode 100644 runtime/linux/autoconf-unwind-stack-trace.c + +diff --git a/buildrun.cxx b/buildrun.cxx +index 403fa71..59b9e88 100644 +--- a/buildrun.cxx ++++ b/buildrun.cxx +@@ -365,6 +365,8 @@ compile_pass (systemtap_session& s) + "STAPCONF_KERNEL_STACKTRACE", NULL); + output_autoconf(s, o, "autoconf-save-stack-trace-no-bp.c", + "STAPCONF_KERNEL_STACKTRACE_NO_BP", NULL); ++ output_autoconf(s, o, "autoconf-unwind-stack-trace.c", ++ "STAPCONF_KERNEL_UNWIND_STACK", NULL); + output_autoconf(s, o, "autoconf-asm-syscall.c", + "STAPCONF_ASM_SYSCALL_H", NULL); + output_autoconf(s, o, "autoconf-ring_buffer-flags.c", "STAPCONF_RING_BUFFER_FLAGS", NULL); +diff --git a/runtime/linux/autoconf-unwind-stack-trace.c b/runtime/linux/autoconf-unwind-stack-trace.c +new file mode 100644 +index 0000000..2ec399e +--- /dev/null ++++ b/runtime/linux/autoconf-unwind-stack-trace.c +@@ -0,0 +1,16 @@ ++#include ++#include ++ ++void unwind_stack_trace (void) ++{ ++ struct unwind_state state; ++ unwind_start (&state, current, 0, 0); ++ while (! unwind_done (&state)) ++ { ++ unsigned long addr = unwind_get_return_address (&state); ++ if (addr == 0) ++ break; ++ unwind_next_frame (&state); ++ } ++} ++ +diff --git a/runtime/stack.c b/runtime/stack.c +index c9d2c0c..43f98ef 100644 +--- a/runtime/stack.c ++++ b/runtime/stack.c +@@ -43,7 +43,11 @@ + #include + #endif + +-static void _stp_stack_print_fallback(unsigned long, int, int, int); ++#if defined(STAPCONF_KERNEL_UNWIND_STACK) ++#include ++#endif ++ ++static void _stp_stack_print_fallback(unsigned long, struct pt_regs*, int, int, int); + + #ifdef STP_USE_DWARF_UNWINDER + #ifdef STAPCONF_LINUX_UACCESS_H +@@ -128,7 +132,7 @@ static const struct stacktrace_ops print_stack_ops = { + }; + + /* Used for kernel backtrace printing when other mechanisms fail. */ +-static void _stp_stack_print_fallback(unsigned long stack, ++static void _stp_stack_print_fallback(unsigned long stack, struct pt_regs *regs, + int sym_flags, int levels, int skip) + { + struct print_stack_data print_data; +@@ -136,20 +140,55 @@ static void _stp_stack_print_fallback(unsigned long stack, + print_data.levels = levels; + print_data.skip = skip; + #if defined(STAPCONF_KERNEL_STACKTRACE) ++ dbug_unwind(1, "fallback kernel stacktrace\n"); + dump_trace(current, NULL, (long *)stack, 0, &print_stack_ops, + &print_data); + #else + /* STAPCONF_KERNEL_STACKTRACE_NO_BP */ ++ dbug_unwind(1, "fallback kernel stacktrace (no bp)\n"); + dump_trace(current, NULL, (long *)stack, &print_stack_ops, + &print_data); + #endif + } + #else +-static void _stp_stack_print_fallback(unsigned long s, int v, int l, int k) { ++#if defined(STAPCONF_KERNEL_UNWIND_STACK) ++static void _stp_stack_print_fallback(unsigned long sp, struct pt_regs *regs, ++ int sym_flags, ++ int levels, int skip) { ++ struct unwind_state state; ++ unwind_start (&state, current, regs, (unsigned long *) sp); ++ dbug_unwind(1, "fallback kernel stacktrace (unwind)\n"); ++ while (levels > 0 && ! unwind_done (&state)) ++ { ++ if (skip == 0) ++ { ++ unsigned long addr = unwind_get_return_address (&state); ++ /* When we have frame pointers, the unwind addresses can be ++ (mostly) trusted, otherwise it is all guesswork. */ ++#ifdef CONFIG_FRAME_POINTER ++ _stp_print_addr(addr, sym_flags, NULL); ++#else ++ _stp_print_addr(addr, sym_flags | _STP_SYM_INEXACT, NULL); ++#endif ++ if (addr == 0) ++ break; ++ levels--; ++ } ++ else ++ { ++ dbug_unwind(1, "skipping frame\n"); ++ skip--; ++ } ++ unwind_next_frame(&state); ++ } ++} ++#else /* no new unwind */ ++static void _stp_stack_print_fallback(unsigned long s, struct pt_regs *r, int v, int l, int k) { + /* Don't guess, just give up. */ ++ dbug_unwind(1, "no fallback kernel stacktrace (giving up)\n"); + _stp_print_addr(0, v | _STP_SYM_INEXACT, NULL); + } +- ++#endif /* new unwind */ + #endif /* defined(STAPCONF_KERNEL_STACKTRACE) || defined(STAPCONF_KERNEL_STACKTRACE_NO_BP) */ + + +@@ -382,6 +421,7 @@ static void _stp_stack_kernel_print(struct context *c, int sym_flags) + if (l == 0) { + remaining = MAXBACKTRACE - n; + _stp_stack_print_fallback(UNW_SP(&c->uwcontext_kernel.info), ++ &c->uwcontext_kernel.info.regs, + sym_flags, remaining, 0); + break; + } else { +@@ -408,7 +448,7 @@ static void _stp_stack_kernel_print(struct context *c, int sym_flags) + sp = 0; + skip = 5; /* yes, that many framework frames. */ + #endif +- _stp_stack_print_fallback(sp, sym_flags, ++ _stp_stack_print_fallback(sp, NULL, sym_flags, + MAXBACKTRACE, skip); + #else + if (sym_flags & _STP_SYM_SYMBOL) +diff --git a/runtime/unwind.c b/runtime/unwind.c +index ec7cd58..3a2d991 100644 +--- a/runtime/unwind.c ++++ b/runtime/unwind.c +@@ -235,7 +235,7 @@ static int parse_fde_cie(const u32 *fde, const u32 *cie, + + #define REG_STATE state->reg[state->stackDepth] + +-static int advance_loc(unsigned long delta, struct unwind_state *state) ++static int advance_loc(unsigned long delta, struct uw_state *state) + { + state->loc += delta * state->codeAlign; + dbug_unwind(1, "state->loc=%lx\n", state->loc); +@@ -244,7 +244,7 @@ static int advance_loc(unsigned long delta, struct unwind_state *state) + + /* Set Same or Nowhere rule for register. */ + static void set_no_state_rule(uleb128_t reg, enum item_location where, +- struct unwind_state *state) ++ struct uw_state *state) + { + dbug_unwind(1, "reg=%lx, where=%d\n", reg, where); + if (reg < ARRAY_SIZE(REG_STATE.regs)) { +@@ -254,7 +254,7 @@ static void set_no_state_rule(uleb128_t reg, enum item_location where, + + /* Memory or Value rule */ + static void set_offset_rule(uleb128_t reg, enum item_location where, +- sleb128_t svalue, struct unwind_state *state) ++ sleb128_t svalue, struct uw_state *state) + { + dbug_unwind(1, "reg=%lx, where=%d, svalue=%lx\n", reg, where, svalue); + if (reg < ARRAY_SIZE(REG_STATE.regs)) { +@@ -265,7 +265,7 @@ static void set_offset_rule(uleb128_t reg, enum item_location where, + + /* Register rule. */ + static void set_register_rule(uleb128_t reg, uleb128_t value, +- struct unwind_state *state) ++ struct uw_state *state) + { + dbug_unwind(1, "reg=%lx, value=%lx\n", reg, value); + if (reg < ARRAY_SIZE(REG_STATE.regs)) { +@@ -277,7 +277,7 @@ static void set_register_rule(uleb128_t reg, uleb128_t value, + /* Expr or ValExpr rule. */ + static void set_expr_rule(uleb128_t reg, enum item_location where, + const u8 **expr, const u8 *end, +- struct unwind_state *state) ++ struct uw_state *state) + { + const u8 *const start = *expr; + uleb128_t len = get_uleb128(expr, end); +@@ -296,7 +296,7 @@ static void set_expr_rule(uleb128_t reg, enum item_location where, + #define MAX_CFI 512 + + static int processCFI(const u8 *start, const u8 *end, unsigned long targetLoc, +- signed ptrType, int user, struct unwind_state *state, int compat_task) ++ signed ptrType, int user, struct uw_state *state, int compat_task) + { + union { + const u8 *p8; +@@ -1169,7 +1169,7 @@ static int unwind_frame(struct unwind_context *context, + unsigned i; + signed ptrType = -1, call_frame = 1; + uleb128_t retAddrReg = 0; +- struct unwind_state *state = &context->state; ++ struct uw_state *state = &context->state; + unsigned long addr; + + if (unlikely(table_len == 0)) { +diff --git a/runtime/unwind/unwind.h b/runtime/unwind/unwind.h +index 9d66732..b3ff786 100644 +--- a/runtime/unwind/unwind.h ++++ b/runtime/unwind/unwind.h +@@ -492,7 +492,7 @@ struct unwind_reg_state { + unsigned cfa_is_expr:1; + }; + +-struct unwind_state { ++struct uw_state { + uleb128_t loc; + uleb128_t codeAlign; + sleb128_t dataAlign; +@@ -503,7 +503,7 @@ struct unwind_state { + + struct unwind_context { + struct unwind_frame_info info; +- struct unwind_state state; ++ struct uw_state state; + }; + + static const struct cfa badCFA = { ARRAY_SIZE(reg_info), 1 }; +-- +1.8.3.1 + From c6a588ad5d62e4bdf4287e1faf448b32f32ae721 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 18 Apr 2018 16:57:44 +0200 Subject: [PATCH 3/7] 3.2-10 - Add unwind-fallback.patch - rhbz1566422.patch --- rhbz1566422.patch | 46 ++++++++++++++++++++++++++++++++++++++++++++++ systemtap.spec | 20 +++++++++++++++++--- unwind-ksalr.patch | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 rhbz1566422.patch create mode 100644 unwind-ksalr.patch diff --git a/rhbz1566422.patch b/rhbz1566422.patch new file mode 100644 index 0000000..494e4c9 --- /dev/null +++ b/rhbz1566422.patch @@ -0,0 +1,46 @@ +commit db9c9d6e30c6cfd7b85475b5c79ee2cc51201934 +Author: Serhei Makarov +Date: Tue Apr 17 11:35:00 2018 -0400 + + RHBZ1566422 - fix spurious Build-id mismatch when probing reinserted kernel module + + Code for newer kernels did not clear the address of the notes-section + when a probed module was unloaded. This caused spurious Build-id mismatch + when the module was reinserted as new addresses are not computed for + dynamically loaded modules (see also: PR23068) and the Build-id check + was trying to read the notes section at the no-longer-valid old address. + + * runtime/sym.c (_stp_module_notifier): clear addresses on + MODULE_STATE_GOING in newer kernels (>=3.10) too. + * runtime/transport/symbols.c (_stp_kmodule_update_address): fix logic + error and clear notes section addr when reloc=NULL (aka. 'all'). + +diff --git a/runtime/sym.c b/runtime/sym.c +index c11a35a..b6e0fd6 100644 +--- a/runtime/sym.c ++++ b/runtime/sym.c +@@ -1045,7 +1045,7 @@ static void _stp_kmodule_update_address(const char* module, + if (strcmp (_stp_modules[mi]->name, module)) + continue; + +- if (reloc && !strcmp (note_sectname, reloc)) { ++ if (!reloc || !strcmp (note_sectname, reloc)) { + dbug_sym(1, "module %s special section %s address %#lx\n", + _stp_modules[mi]->name, + note_sectname, +diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c +index 64c2aeb..076c562 100644 +--- a/runtime/transport/symbols.c ++++ b/runtime/transport/symbols.c +@@ -167,6 +167,11 @@ static int _stp_module_notifier (struct notifier_block * nb, + /* Verify build-id. */ + _stp_kmodule_check (mod->name); + } ++ else if (val == MODULE_STATE_GOING) { ++ /* Unregister all sections. */ ++ dbug_sym(2, "unregister sections\n"); ++ _stp_kmodule_update_address(mod->name, NULL, 0); ++ } + else if (val != MODULE_STATE_GOING) { + return NOTIFY_DONE; + } diff --git a/systemtap.spec b/systemtap.spec index 8ba9656..07ed111 100644 --- a/systemtap.spec +++ b/systemtap.spec @@ -74,7 +74,7 @@ Name: systemtap Version: 3.2 -Release: 9%{?dist} +Release: 10%{?dist} # for version, see also configure.ac Patch10: rhbz1504009.patch @@ -83,9 +83,17 @@ Patch10: rhbz1504009.patch # upstream: https://sourceware.org/bugzilla/show_bug.cgi?id=22551 Patch11: rhbz1546563.patch -# Partial fix for backstrace issues. Add a new kernel fallback unwinder. +# Add a new kernel fallback unwinder. # upstream: commit 553b6df07c9b7ab30ed468a6a4374cbdf73d1c0d Patch13: unwind-fallback.patch +# And make the kernel DWARF unwinder work with ksalr. +# upstream: commit 17ee540dd61113fe4f557f191db3480db875cca1 +Patch14: unwind-ksalr.patch + +# Build-id mismatch with (re)inserted/removed kernel module probe +# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1566422 +# upstream: db9c9d6e30c6cfd7b85475b5c79ee2cc51201934 +Patch15: rhbz1566422.patch # Packaging abstract: # @@ -253,7 +261,7 @@ URL: http://sourceware.org/systemtap/ # kernel variant (kernel-PAE, kernel-debug, etc.) devel package # installed. Requires: kernel-devel-uname-r -%{?fedora:Suggests: kernel-devel} +#%{?fedora:Suggests: kernel-devel} Requires: gcc make # Suggest: kernel-debuginfo @@ -492,6 +500,8 @@ cd .. %patch11 -p1 %patch13 -p1 +%patch14 -p1 +%patch15 -p1 %build @@ -1172,6 +1182,10 @@ done # PRERELEASE %changelog +* Wed Apr 18 2018 Mark Wielaard - 3.2-10 +- Add unwind-fallback.patch +- rhbz1566422.patch + * Tue Apr 17 2018 Mark Wielaard - 3.2-9 - Add unwind-fallback.patch. diff --git a/unwind-ksalr.patch b/unwind-ksalr.patch new file mode 100644 index 0000000..6ed43ee --- /dev/null +++ b/unwind-ksalr.patch @@ -0,0 +1,32 @@ +commit 17ee540dd61113fe4f557f191db3480db875cca1 +Author: Mark Wielaard +Date: Wed Apr 18 15:00:24 2018 +0200 + + Make kernel DWARF unwinder work with ksalr. + + The .debug_frame loaded from disk is already relocated against the + expected load offset of the kernel, but the actual static (load) + address might be different (with kaslr). So adjust the startLoc + for that difference when reading any address from the unwind table. + +diff --git a/runtime/unwind.c b/runtime/unwind.c +index 3a2d991..4c360d2 100644 +--- a/runtime/unwind.c ++++ b/runtime/unwind.c +@@ -724,10 +724,15 @@ adjustStartLoc (unsigned long startLoc, + dbug_unwind(2, "adjustStartLoc=%lx, ptrType=%s, m=%s, s=%s eh=%d\n", + startLoc, _stp_eh_enc_name(ptrType), m->path, s->name, is_ehframe); + if (startLoc == 0 +- || strcmp (m->name, "kernel") == 0 + || (strcmp (s->name, ".absolute") == 0 && !is_ehframe)) + return startLoc; + ++ /* The .debug_frame loaded from disk is already relocated against the ++ expected load offset of the kernel, but the actual static (load) ++ address might be different (with kaslr). */ ++ if (strcmp (m->name, "kernel") == 0) ++ return startLoc - s->sec_load_offset + s->static_addr; ++ + /* eh_frame data has been loaded in the kernel, so readjust offset. */ + if (is_ehframe) { + dbug_unwind(2, "eh_frame=%lx, eh_frame_addr=%lx\n", (unsigned long) m->eh_frame, m->eh_frame_addr); From 0d3a3a4eeeadb1e95f94e2ed2adef3d91e2eabd8 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 19 Apr 2018 00:53:27 +0200 Subject: [PATCH 4/7] 3.2-11 - Add rhbz1549063.patch (/bin/env -> /usr/bin/env) - Add rhbz1566745.patch (4.15 kernel tapset updates) - Enable accidentially disabled Suggests: kernel-devel again. --- rhbz1549063.patch | 32 ++++++++++++ rhbz1566745.patch | 125 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 rhbz1549063.patch create mode 100644 rhbz1566745.patch diff --git a/rhbz1549063.patch b/rhbz1549063.patch new file mode 100644 index 0000000..55a56f7 --- /dev/null +++ b/rhbz1549063.patch @@ -0,0 +1,32 @@ +commit d6492e78bd50e923963e3c7aa235100a208f4775 +Author: Mark Wielaard +Date: Mon Feb 26 11:31:44 2018 +0100 + + testsuite: Use /usr/bin/env everywhere. + + bz5274.stp and bz5274.a.stp where still using /bin/env instead of + /usr/bin/env like every other testsuite file. + + The latest coreutils in rawhide dropped old /bin/* provides. + https://bugzilla.redhat.com/show_bug.cgi?id=1549063 + +diff --git a/testsuite/systemtap.base/bz5274.a.stp b/testsuite/systemtap.base/bz5274.a.stp +index 1d3aefc..e6365e4 100755 +--- a/testsuite/systemtap.base/bz5274.a.stp ++++ b/testsuite/systemtap.base/bz5274.a.stp +@@ -1,4 +1,4 @@ +-#! /bin/env stap ++#! /usr/bin/env stap + probe process("./bz5274").function("funcb").call, + process("./bz5274").function("funcc").call, + process("./bz5274").function("funcd").call +diff --git a/testsuite/systemtap.base/bz5274.stp b/testsuite/systemtap.base/bz5274.stp +index b3e26d8..2f62cbc 100755 +--- a/testsuite/systemtap.base/bz5274.stp ++++ b/testsuite/systemtap.base/bz5274.stp +@@ -1,4 +1,4 @@ +-#! /bin/env stap ++#! /usr/bin/env stap + probe process("./bz5274").function("*").call { + printf("%s Entering %s\n", pp(), thread_indent(1)) + } diff --git a/rhbz1566745.patch b/rhbz1566745.patch new file mode 100644 index 0000000..bf3744f --- /dev/null +++ b/rhbz1566745.patch @@ -0,0 +1,125 @@ +commit 0f8139eb4bd06a19714608b5f246fc24fcafde6e +Author: David Smith +Date: Thu Dec 7 16:07:39 2017 -0600 + + Updated several tapsets for the 4.15 kernel. + + * tapset/linux/linuxmib.stp: Update the 'DelayedACKs' probes to handle + a missing '$data' parameter. + * tapset/linux/memory.stp: Handle missing '__GFP_COLD' flag. + * tapset/linux/nfsd.stp: Update the 'nfsd.proc4.rename' probe to handle + upstream changes. + * tapset/linux/signal.stp: Update the 'signal.pending' probe to handle a + missing '$sigsestsize' parameter. + +diff --git a/tapset/linux/linuxmib.stp b/tapset/linux/linuxmib.stp +index ef09929..63ec248 100644 +--- a/tapset/linux/linuxmib.stp ++++ b/tapset/linux/linuxmib.stp +@@ -1,6 +1,6 @@ + /* + * Copyright (C) 2009 IBM Corp. +- * Copyright (C) 2010 Red Hat Inc. ++ * Copyright (C) 2010-2017 Red Hat Inc. + * + * This file is part of systemtap, and is free software. You can + * redistribute it and/or modify it under the terms of the GNU General +@@ -39,14 +39,18 @@ probe _linuxmib.DelayedACKs.A = kernel.function("tcp_send_ack") + + probe _linuxmib.DelayedACKs.B = kernel.function("tcp_delack_timer") + { +- sk=$data ++ sk=@choose_defined($data, ++ &@container_of($t, "inet_connection_sock", ++ icsk_delack_timer)->icsk_inet->sk) + indelack_timer[sk]=1 + op=0 + } + + probe _linuxmib.DelayedACKs.C = kernel.function("tcp_delack_timer").return + { +- sk=@entry($data) ++ sk=@entry(@choose_defined($data, ++ &@container_of($t, "inet_connection_sock", ++ icsk_delack_timer)->icsk_inet->sk)) + indelack_timer[sk]=0; + op=0 + } +diff --git a/tapset/linux/memory.stp b/tapset/linux/memory.stp +index b968fe3..169d0f1 100644 +--- a/tapset/linux/memory.stp ++++ b/tapset/linux/memory.stp +@@ -1,7 +1,7 @@ + // memory/vm related tapset + // Copyright (C) 2005, 2006 IBM Corp. + // Copyright (C) 2006 Intel Corporation. +-// Copyright (C) 2014 Red Hat Inc. ++// Copyright (C) 2014-2017 Red Hat Inc. + // + // This file is part of systemtap, and is free software. You can + // redistribute it and/or modify it under the terms of the GNU General +@@ -368,7 +368,9 @@ probe vm.oom_kill = kernel.function("oom_kill_process") !, + __GFP_BITMASKS(__GFP_HIGH) + __GFP_BITMASKS(__GFP_IO) + __GFP_BITMASKS(__GFP_FS) ++#ifdef __GFP_COLD + __GFP_BITMASKS(__GFP_COLD) ++#endif + __GFP_BITMASKS(__GFP_NOWARN) + #ifdef __GFP_RETRY_MAYFAIL + __GFP_BITMASKS(__GFP_RETRY_MAYFAIL) +diff --git a/tapset/linux/nfsd.stp b/tapset/linux/nfsd.stp +index 3df1600..5a70e84 100644 +--- a/tapset/linux/nfsd.stp ++++ b/tapset/linux/nfsd.stp +@@ -1262,18 +1262,26 @@ probe nfsd.proc4.rename = kernel.function("nfsd4_rename").call !, + fh = & @nfsd4_compound_state($cstate)->save_fh + tfh = & @nfsd4_compound_state($cstate)->current_fh + +- filelen = $rename->rn_snamelen +- filename = kernel_string_n($rename->rn_sname, $rename->rn_snamelen) +- tlen = $rename->rn_tnamelen +- tname = kernel_string_n($rename->rn_tname, $rename->rn_tnamelen) ++ if (@defined($rename)) { ++ filelen = $rename->rn_snamelen ++ filename = kernel_string_n($rename->rn_sname, ++ $rename->rn_snamelen) ++ tlen = $rename->rn_tnamelen ++ tname = kernel_string_n($rename->rn_tname, $rename->rn_tnamelen) ++ } else { ++ filelen = $u->rename->rn_snamelen ++ filename = kernel_string_n($u->rename->rn_sname, ++ $u->rename->rn_snamelen) ++ tlen = $u->rename->rn_tnamelen ++ tname = kernel_string_n($u->rename->rn_tname, ++ $u->rename->rn_tnamelen) ++ } + + uid = __rqstp_uid($rqstp) + gid = __rqstp_gid($rqstp) + + name = "nfsd.proc4.rename" +- argstr = sprintf("%s to %s", +- kernel_string_n($rename->rn_sname, $rename->rn_snamelen), +- kernel_string_n($rename->rn_tname, $rename->rn_tnamelen)) ++ argstr = sprintf("%s to %s", filename, tname) + } + + probe nfsd.proc4.rename.return = +diff --git a/tapset/linux/signal.stp b/tapset/linux/signal.stp +index 9a94bad..4f9f9f9 100644 +--- a/tapset/linux/signal.stp ++++ b/tapset/linux/signal.stp +@@ -613,7 +613,11 @@ probe signal.pending = kernel.function("do_sigpending").call !, + { + name = "pending" + sigset_add=@choose_defined($set, $uset) +- sigset_size=$sigsetsize ++ ++ # Note that this isn't 100% correct if $sigsetsize doesn't ++ # exist (in the case of newer do_sigpending() calls). Instead, ++ # we're returning the default size of a sigset_t. ++ sigset_size=@choose_defined($sigsetsize, @cast_sizeof("sigset_t")) + } + + /** From b67c63adc5709322254a53ab77b5a39069e64989 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 19 Apr 2018 00:56:03 +0200 Subject: [PATCH 5/7] 3.2-11 spec update. --- systemtap.spec | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/systemtap.spec b/systemtap.spec index 07ed111..9907a65 100644 --- a/systemtap.spec +++ b/systemtap.spec @@ -74,7 +74,7 @@ Name: systemtap Version: 3.2 -Release: 10%{?dist} +Release: 11%{?dist} # for version, see also configure.ac Patch10: rhbz1504009.patch @@ -95,6 +95,16 @@ Patch14: unwind-ksalr.patch # upstream: db9c9d6e30c6cfd7b85475b5c79ee2cc51201934 Patch15: rhbz1566422.patch +# systemtap depends on removed /bin/env +# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1549063 +# upstream: commit d6492e78bd50e923963e3c7aa235100a208f4775 +Patch16: rhbz1549063.patch + +# 4.15 kernel updates (__GFP_COLD undeclared) +# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1549063 +# upstream: commit 0f8139eb4bd06a19714608b5f246fc24fcafde6e +Patch17: rhbz1566745.patch + # Packaging abstract: # # systemtap empty req:-client req:-devel @@ -261,7 +271,7 @@ URL: http://sourceware.org/systemtap/ # kernel variant (kernel-PAE, kernel-debug, etc.) devel package # installed. Requires: kernel-devel-uname-r -#%{?fedora:Suggests: kernel-devel} +%{?fedora:Suggests: kernel-devel} Requires: gcc make # Suggest: kernel-debuginfo @@ -502,6 +512,8 @@ cd .. %patch13 -p1 %patch14 -p1 %patch15 -p1 +%patch16 -p1 +%patch17 -p1 %build @@ -1182,6 +1194,11 @@ done # PRERELEASE %changelog +* Thu Apr 19 2018 Mark Wielaard - 3.2-11 +- Add rhbz1549063.patch (/bin/env -> /usr/bin/env) +- Add rhbz1566745.patch (4.15 kernel tapset updates) +- Enable accidentially disabled Suggests: kernel-devel again. + * Wed Apr 18 2018 Mark Wielaard - 3.2-10 - Add unwind-fallback.patch - rhbz1566422.patch From 3df356ef9a1ccf19981bcf6e286d235113726ca9 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Fri, 8 Jun 2018 18:46:04 -0400 Subject: [PATCH 6/7] upstream release 3.3 --- rhbz1504009.patch | 49 -------- rhbz1546563.patch | 273 ------------------------------------------ rhbz1549063.patch | 32 ----- rhbz1566422.patch | 46 ------- rhbz1566745.patch | 125 ------------------- sources | 2 +- systemtap.spec | 125 ++++++++----------- unwind-fallback.patch | 249 -------------------------------------- unwind-ksalr.patch | 32 ----- 9 files changed, 52 insertions(+), 881 deletions(-) delete mode 100644 rhbz1504009.patch delete mode 100644 rhbz1546563.patch delete mode 100644 rhbz1549063.patch delete mode 100644 rhbz1566422.patch delete mode 100644 rhbz1566745.patch delete mode 100644 unwind-fallback.patch delete mode 100644 unwind-ksalr.patch diff --git a/rhbz1504009.patch b/rhbz1504009.patch deleted file mode 100644 index 7643891..0000000 --- a/rhbz1504009.patch +++ /dev/null @@ -1,49 +0,0 @@ -commit 9f81f10b0caf6dfc49c4b7ceb7902f45d37b532a (HEAD -> master, origin/master, origin/HEAD) -Author: Frank Ch. Eigler -Date: Fri Oct 20 10:01:58 2017 -0400 - - rhbz1504009: let dtrace -G -o /dev/null run, as in autoconf - - commit c245153ca193c471a8c broke the ability of dtrace to be tested in - autoconf "-G -o /dev/null" usage, because its output file name was too - simple a function of the input name, and normal users can't write to - /dev/null.dtrace-temp.c . Now we back down to mkstemp, like before, - upon a failure of the simple concatenated name. - -diff --git a/dtrace.in b/dtrace.in -index 2e2e002a5c56..25efc253b708 100644 ---- a/dtrace.in -+++ b/dtrace.in -@@ -410,8 +410,12 @@ from tempfile import mkstemp - else: - print("header: " + fname) - -- fname = filename + ".dtrace-temp.c" -- fdesc = open(fname, mode='w') -+ try: # for reproducible-builds purposes, prefer a fixed path name pattern -+ fname = filename + ".dtrace-temp.c" -+ fdesc = open(fname, mode='w') -+ except: # but that doesn't work for -o /dev/null - see rhbz1504009 -+ (ignore,fname) = mkstemp(suffix=".c") -+ fdesc = open(fname, mode='w') - providers.semaphore_write(fdesc) - fdesc.close() - cc1 = os.environ.get("CC", "gcc") -diff --git a/testsuite/systemtap.base/dtrace.exp b/testsuite/systemtap.base/dtrace.exp -index fa6b3ec3f6d3..7c60f09d70b8 100644 ---- a/testsuite/systemtap.base/dtrace.exp -+++ b/testsuite/systemtap.base/dtrace.exp -@@ -83,6 +83,13 @@ if {[file exists /tmp/XXX.o]} then { - } - exec rm -f /tmp/XXX.o - -+verbose -log "$dtrace -G -s $dpath -o /dev/null" -+if [as_non_root "$python $dtrace -G -s $dpath -o /dev/null"] { -+ fail "$test -G -o /dev/null" -+} else { -+ pass "$test -G -o /dev/null" -+} -+ - verbose -log "$dtrace -G -s $dpath -o /tmp/XXX" - catch {exec $python $dtrace -G -s $dpath -o /tmp/XXX} res - if {[file exists /tmp/XXX]} then { diff --git a/rhbz1546563.patch b/rhbz1546563.patch deleted file mode 100644 index 4e4030b..0000000 --- a/rhbz1546563.patch +++ /dev/null @@ -1,273 +0,0 @@ -From fbb26e17a4c026f05a497fc5d584516bad3b6950 Mon Sep 17 00:00:00 2001 -From: David Smith -Date: Wed, 6 Dec 2017 14:37:42 -0600 -Subject: [PATCH] Fix PR22551 by updating the use of timers for the 4.15 - kernel. - -* runtime/linux/timer_compatibility.h: New file. -* runtime/time.c: Update timer callback function parameter type. Update - timer initialization. -* runtime/transport/relay_v2.c: Ditto. -* runtime/transport/transport.c: Ditto. -* tapset-timers.cxx (timer_derived_probe_group::emit_module_decls): - Ditto. Handle old and new timer callback interface. -* runtime/linux/runtime.h: Include timer_compatibility.h instead of timer.h. -* tapset/linux/scsi.stp: Ditto. ---- - runtime/linux/runtime.h | 2 +- - runtime/linux/timer_compatibility.h | 76 +++++++++++++++++++++++++++++++++++++ - runtime/time.c | 7 ++-- - runtime/transport/relay_v2.c | 8 ++-- - runtime/transport/transport.c | 13 +++---- - tapset-timers.cxx | 14 +++++-- - tapset/linux/scsi.stp | 2 +- - 7 files changed, 100 insertions(+), 22 deletions(-) - create mode 100644 runtime/linux/timer_compatibility.h - -diff --git a/runtime/linux/runtime.h b/runtime/linux/runtime.h -index 9c585a2..df9b74c 100644 ---- a/runtime/linux/runtime.h -+++ b/runtime/linux/runtime.h -@@ -34,7 +34,7 @@ - #include - #include - #include --#include -+#include "timer_compatibility.h" - #include - #include - #include -diff --git a/runtime/linux/timer_compatibility.h b/runtime/linux/timer_compatibility.h -new file mode 100644 -index 0000000..ac03de9 ---- /dev/null -+++ b/runtime/linux/timer_compatibility.h -@@ -0,0 +1,76 @@ -+/* -+ * linux/timer.h compatibility defines and inlines -+ * Copyright (C) 2017 Red Hat Inc. -+ * -+ * This file is part of systemtap, and is free software. You can -+ * redistribute it and/or modify it under the terms of the GNU General -+ * Public License (GPL); either version 2, or (at your option) any -+ * later version. -+ */ -+ -+#ifndef _TIMER_COMPATIBILITY_H_ -+#define _TIMER_COMPATIBILITY_H_ -+ -+#include -+ -+/* -+ * Starting with the 4.15 kernel, the timer interface -+ * changed. Originally, you'd do something like: -+ * -+ * static void timer_func(unsigned long val); -+ * -+ * init_timer(&timer); -+ * timer.expires = jiffies + STP_RELAY_TIMER_INTERVAL; -+ * timer.function = timer_func; -+ * timer.data = 0; -+ * add_timer(&timer); -+ * -+ * The 'data' parameter would get passed to the callback -+ * function. Starting with 4.15, you'd do something like this: -+ * -+ * static void timer_func(struct timer_list *val); -+ * -+ * timer_setup(&timer, timer_func, 0); -+ * timer.expires = jiffies + STP_RELAY_TIMER_INTERVAL; -+ * add_timer(&timer); -+ * -+ * With the new code, the timer that caused the callback gets passed -+ * to the timer callback function. The 'data' field has been removed. -+ * -+ * So, we're going to use the new interface. To hide the differences -+ * between the callback function parameter type, we'll define a new -+ * type, 'stp_timer_callback_parameter_t'. -+ * -+ * If code needs to figure out the difference between the old and new -+ * interface, it should test the TIMER_TRACE_FLAGMASK define (which -+ * only exists in the new interface). -+ */ -+ -+#if defined(TIMER_TRACE_FLAGMASK) -+/* This is the >= 4.15 kernel interface. */ -+ -+typedef struct timer_list * stp_timer_callback_parameter_t; -+ -+#else -+/* This is the < 4.15 kernel interface. */ -+ -+typedef unsigned long stp_timer_callback_parameter_t; -+ -+/** -+ * timer_setup - prepare a timer for first use -+ * @timer: the timer in question -+ * @callback: the function to call when timer expires -+ * @flags: any TIMER_* flags (note that anything other than 0 is an -+ * error, since this compatibility function can't support any -+ * of the TIMER_* flags) -+ */ -+#define timer_setup(timer, callback, flags) \ -+ { \ -+ init_timer((timer)); \ -+ (timer)->function = callback; \ -+ (timer)->data = 0; \ -+ BUILD_BUG_ON_ZERO((flags) != 0); \ -+ } -+#endif -+ -+#endif /* _TIMER_COMPATIBILITY_H_ */ -diff --git a/runtime/time.c b/runtime/time.c -index 2e666d5..91ceafa 100644 ---- a/runtime/time.c -+++ b/runtime/time.c -@@ -168,10 +168,10 @@ __stp_time_smp_callback(void *val) - - /* The timer callback is in a softIRQ -- interrupts enabled. */ - static void --__stp_time_timer_callback(unsigned long val) -+__stp_time_timer_callback(stp_timer_callback_parameter_t unused) - { - stp_time_t *time =__stp_time_local_update(); -- (void) val; -+ (void) unused; - - /* PR6481: make sure IRQs are enabled before resetting the timer - (IRQs are disabled and then reenabled in -@@ -200,9 +200,8 @@ __stp_init_time(void *info) - time->freq = __stp_get_freq(); - __stp_time_local_update(); - -- init_timer(&time->timer); -+ timer_setup(&time->timer, __stp_time_timer_callback, 0); - time->timer.expires = jiffies + STP_TIME_SYNC_INTERVAL; -- time->timer.function = __stp_time_timer_callback; - - #ifndef STAPCONF_ADD_TIMER_ON - add_timer(&time->timer); -diff --git a/runtime/transport/relay_v2.c b/runtime/transport/relay_v2.c -index f81d75d..135951a 100644 ---- a/runtime/transport/relay_v2.c -+++ b/runtime/transport/relay_v2.c -@@ -30,7 +30,7 @@ - #include - #include - #include --#include -+#include "../linux/timer_compatibility.h" - #include "../uidgid_compatibility.h" - #include "relay_compat.h" - -@@ -120,7 +120,7 @@ static void __stp_relay_wakeup_readers(struct rchan_buf *buf) - wake_up_interruptible(&buf->read_wait); - } - --static void __stp_relay_wakeup_timer(unsigned long val) -+static void __stp_relay_wakeup_timer(stp_timer_callback_parameter_t unused) - { - #ifdef STP_BULKMODE - int i; -@@ -151,10 +151,8 @@ static void __stp_relay_wakeup_timer(unsigned long val) - static void __stp_relay_timer_init(void) - { - atomic_set(&_stp_relay_data.wakeup, 0); -- init_timer(&_stp_relay_data.timer); -+ timer_setup(&_stp_relay_data.timer, __stp_relay_wakeup_timer, 0); - _stp_relay_data.timer.expires = jiffies + STP_RELAY_TIMER_INTERVAL; -- _stp_relay_data.timer.function = __stp_relay_wakeup_timer; -- _stp_relay_data.timer.data = 0; - add_timer(&_stp_relay_data.timer); - smp_mb(); - } -diff --git a/runtime/transport/transport.c b/runtime/transport/transport.c -index 3400f22..320fd18 100644 ---- a/runtime/transport/transport.c -+++ b/runtime/transport/transport.c -@@ -311,7 +311,7 @@ static void _stp_detach(void) - } - - --static void _stp_ctl_work_callback(unsigned long val); -+static void _stp_ctl_work_callback(stp_timer_callback_parameter_t unused); - - /* - * Called when stapio opens the control channel. -@@ -320,13 +320,12 @@ static void _stp_attach(void) - { - dbug_trans(1, "attach\n"); - _stp_pid = current->pid; -- if (_stp_namespaces_pid < 1) -- _stp_namespaces_pid = _stp_pid; -+ if (_stp_namespaces_pid < 1) -+ _stp_namespaces_pid = _stp_pid; - _stp_transport_data_fs_overwrite(0); -- init_timer(&_stp_ctl_work_timer); -+ -+ timer_setup(&_stp_ctl_work_timer, _stp_ctl_work_callback, 0); - _stp_ctl_work_timer.expires = jiffies + STP_CTL_TIMER_INTERVAL; -- _stp_ctl_work_timer.function = _stp_ctl_work_callback; -- _stp_ctl_work_timer.data= 0; - add_timer(&_stp_ctl_work_timer); - } - -@@ -341,7 +340,7 @@ static void _stp_attach(void) - * notified. Reschedules itself if someone is still attached - * to the cmd channel. - */ --static void _stp_ctl_work_callback(unsigned long val) -+static void _stp_ctl_work_callback(stp_timer_callback_parameter_t unused) - { - int do_io = 0; - unsigned long flags; -diff --git a/tapset-timers.cxx b/tapset-timers.cxx -index 1a40bcd..0ab4d69 100644 ---- a/tapset-timers.cxx -+++ b/tapset-timers.cxx -@@ -122,9 +122,13 @@ timer_derived_probe_group::emit_module_decls (systemtap_session& s) - s.op->newline(-1) << "};"; - s.op->newline(); - -- s.op->newline() << "static void enter_timer_probe (unsigned long val) {"; -+ s.op->newline() << "static void enter_timer_probe (stp_timer_callback_parameter_t val) {"; -+ s.op->newline() << "#if defined(TIMER_TRACE_FLAGMASK)"; -+ s.op->newline(1) << "struct stap_timer_probe* stp = container_of(val, struct stap_timer_probe, timer_list);"; -+ s.op->newline(-1) << "#else"; - s.op->newline(1) << "struct stap_timer_probe* stp = & stap_timer_probes [val];"; -- s.op->newline() << "if ((atomic_read (session_state()) == STAP_SESSION_STARTING) ||"; -+ s.op->newline(-1) << "#endif"; -+ s.op->newline(1) << "if ((atomic_read (session_state()) == STAP_SESSION_STARTING) ||"; - s.op->newline() << " (atomic_read (session_state()) == STAP_SESSION_RUNNING))"; - s.op->newline(1) << "mod_timer (& stp->timer_list, jiffies + "; - emit_interval (s.op); -@@ -148,9 +152,11 @@ timer_derived_probe_group::emit_module_init (systemtap_session& s) - s.op->newline() << "for (i=0; i<" << probes.size() << "; i++) {"; - s.op->newline(1) << "struct stap_timer_probe* stp = & stap_timer_probes [i];"; - s.op->newline() << "probe_point = stp->probe->pp;"; -- s.op->newline() << "init_timer (& stp->timer_list);"; -- s.op->newline() << "stp->timer_list.function = & enter_timer_probe;"; -+ -+ s.op->newline() << "timer_setup (& stp->timer_list, enter_timer_probe, 0);"; -+ s.op->newline() << "#if !defined(TIMER_TRACE_FLAGMASK)"; - s.op->newline() << "stp->timer_list.data = i;"; // NB: important! -+ s.op->newline() << "#endif"; - // copy timer renew calculations from above :-( - s.op->newline() << "stp->timer_list.expires = jiffies + "; - emit_interval (s.op); -diff --git a/tapset/linux/scsi.stp b/tapset/linux/scsi.stp -index 44f686c..3577942 100644 ---- a/tapset/linux/scsi.stp -+++ b/tapset/linux/scsi.stp -@@ -14,7 +14,7 @@ - #include - #include - #include --#include -+#include "linux/timer_compatibility.h" - #include - %} - --- -2.9.3 - diff --git a/rhbz1549063.patch b/rhbz1549063.patch deleted file mode 100644 index 55a56f7..0000000 --- a/rhbz1549063.patch +++ /dev/null @@ -1,32 +0,0 @@ -commit d6492e78bd50e923963e3c7aa235100a208f4775 -Author: Mark Wielaard -Date: Mon Feb 26 11:31:44 2018 +0100 - - testsuite: Use /usr/bin/env everywhere. - - bz5274.stp and bz5274.a.stp where still using /bin/env instead of - /usr/bin/env like every other testsuite file. - - The latest coreutils in rawhide dropped old /bin/* provides. - https://bugzilla.redhat.com/show_bug.cgi?id=1549063 - -diff --git a/testsuite/systemtap.base/bz5274.a.stp b/testsuite/systemtap.base/bz5274.a.stp -index 1d3aefc..e6365e4 100755 ---- a/testsuite/systemtap.base/bz5274.a.stp -+++ b/testsuite/systemtap.base/bz5274.a.stp -@@ -1,4 +1,4 @@ --#! /bin/env stap -+#! /usr/bin/env stap - probe process("./bz5274").function("funcb").call, - process("./bz5274").function("funcc").call, - process("./bz5274").function("funcd").call -diff --git a/testsuite/systemtap.base/bz5274.stp b/testsuite/systemtap.base/bz5274.stp -index b3e26d8..2f62cbc 100755 ---- a/testsuite/systemtap.base/bz5274.stp -+++ b/testsuite/systemtap.base/bz5274.stp -@@ -1,4 +1,4 @@ --#! /bin/env stap -+#! /usr/bin/env stap - probe process("./bz5274").function("*").call { - printf("%s Entering %s\n", pp(), thread_indent(1)) - } diff --git a/rhbz1566422.patch b/rhbz1566422.patch deleted file mode 100644 index 494e4c9..0000000 --- a/rhbz1566422.patch +++ /dev/null @@ -1,46 +0,0 @@ -commit db9c9d6e30c6cfd7b85475b5c79ee2cc51201934 -Author: Serhei Makarov -Date: Tue Apr 17 11:35:00 2018 -0400 - - RHBZ1566422 - fix spurious Build-id mismatch when probing reinserted kernel module - - Code for newer kernels did not clear the address of the notes-section - when a probed module was unloaded. This caused spurious Build-id mismatch - when the module was reinserted as new addresses are not computed for - dynamically loaded modules (see also: PR23068) and the Build-id check - was trying to read the notes section at the no-longer-valid old address. - - * runtime/sym.c (_stp_module_notifier): clear addresses on - MODULE_STATE_GOING in newer kernels (>=3.10) too. - * runtime/transport/symbols.c (_stp_kmodule_update_address): fix logic - error and clear notes section addr when reloc=NULL (aka. 'all'). - -diff --git a/runtime/sym.c b/runtime/sym.c -index c11a35a..b6e0fd6 100644 ---- a/runtime/sym.c -+++ b/runtime/sym.c -@@ -1045,7 +1045,7 @@ static void _stp_kmodule_update_address(const char* module, - if (strcmp (_stp_modules[mi]->name, module)) - continue; - -- if (reloc && !strcmp (note_sectname, reloc)) { -+ if (!reloc || !strcmp (note_sectname, reloc)) { - dbug_sym(1, "module %s special section %s address %#lx\n", - _stp_modules[mi]->name, - note_sectname, -diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c -index 64c2aeb..076c562 100644 ---- a/runtime/transport/symbols.c -+++ b/runtime/transport/symbols.c -@@ -167,6 +167,11 @@ static int _stp_module_notifier (struct notifier_block * nb, - /* Verify build-id. */ - _stp_kmodule_check (mod->name); - } -+ else if (val == MODULE_STATE_GOING) { -+ /* Unregister all sections. */ -+ dbug_sym(2, "unregister sections\n"); -+ _stp_kmodule_update_address(mod->name, NULL, 0); -+ } - else if (val != MODULE_STATE_GOING) { - return NOTIFY_DONE; - } diff --git a/rhbz1566745.patch b/rhbz1566745.patch deleted file mode 100644 index bf3744f..0000000 --- a/rhbz1566745.patch +++ /dev/null @@ -1,125 +0,0 @@ -commit 0f8139eb4bd06a19714608b5f246fc24fcafde6e -Author: David Smith -Date: Thu Dec 7 16:07:39 2017 -0600 - - Updated several tapsets for the 4.15 kernel. - - * tapset/linux/linuxmib.stp: Update the 'DelayedACKs' probes to handle - a missing '$data' parameter. - * tapset/linux/memory.stp: Handle missing '__GFP_COLD' flag. - * tapset/linux/nfsd.stp: Update the 'nfsd.proc4.rename' probe to handle - upstream changes. - * tapset/linux/signal.stp: Update the 'signal.pending' probe to handle a - missing '$sigsestsize' parameter. - -diff --git a/tapset/linux/linuxmib.stp b/tapset/linux/linuxmib.stp -index ef09929..63ec248 100644 ---- a/tapset/linux/linuxmib.stp -+++ b/tapset/linux/linuxmib.stp -@@ -1,6 +1,6 @@ - /* - * Copyright (C) 2009 IBM Corp. -- * Copyright (C) 2010 Red Hat Inc. -+ * Copyright (C) 2010-2017 Red Hat Inc. - * - * This file is part of systemtap, and is free software. You can - * redistribute it and/or modify it under the terms of the GNU General -@@ -39,14 +39,18 @@ probe _linuxmib.DelayedACKs.A = kernel.function("tcp_send_ack") - - probe _linuxmib.DelayedACKs.B = kernel.function("tcp_delack_timer") - { -- sk=$data -+ sk=@choose_defined($data, -+ &@container_of($t, "inet_connection_sock", -+ icsk_delack_timer)->icsk_inet->sk) - indelack_timer[sk]=1 - op=0 - } - - probe _linuxmib.DelayedACKs.C = kernel.function("tcp_delack_timer").return - { -- sk=@entry($data) -+ sk=@entry(@choose_defined($data, -+ &@container_of($t, "inet_connection_sock", -+ icsk_delack_timer)->icsk_inet->sk)) - indelack_timer[sk]=0; - op=0 - } -diff --git a/tapset/linux/memory.stp b/tapset/linux/memory.stp -index b968fe3..169d0f1 100644 ---- a/tapset/linux/memory.stp -+++ b/tapset/linux/memory.stp -@@ -1,7 +1,7 @@ - // memory/vm related tapset - // Copyright (C) 2005, 2006 IBM Corp. - // Copyright (C) 2006 Intel Corporation. --// Copyright (C) 2014 Red Hat Inc. -+// Copyright (C) 2014-2017 Red Hat Inc. - // - // This file is part of systemtap, and is free software. You can - // redistribute it and/or modify it under the terms of the GNU General -@@ -368,7 +368,9 @@ probe vm.oom_kill = kernel.function("oom_kill_process") !, - __GFP_BITMASKS(__GFP_HIGH) - __GFP_BITMASKS(__GFP_IO) - __GFP_BITMASKS(__GFP_FS) -+#ifdef __GFP_COLD - __GFP_BITMASKS(__GFP_COLD) -+#endif - __GFP_BITMASKS(__GFP_NOWARN) - #ifdef __GFP_RETRY_MAYFAIL - __GFP_BITMASKS(__GFP_RETRY_MAYFAIL) -diff --git a/tapset/linux/nfsd.stp b/tapset/linux/nfsd.stp -index 3df1600..5a70e84 100644 ---- a/tapset/linux/nfsd.stp -+++ b/tapset/linux/nfsd.stp -@@ -1262,18 +1262,26 @@ probe nfsd.proc4.rename = kernel.function("nfsd4_rename").call !, - fh = & @nfsd4_compound_state($cstate)->save_fh - tfh = & @nfsd4_compound_state($cstate)->current_fh - -- filelen = $rename->rn_snamelen -- filename = kernel_string_n($rename->rn_sname, $rename->rn_snamelen) -- tlen = $rename->rn_tnamelen -- tname = kernel_string_n($rename->rn_tname, $rename->rn_tnamelen) -+ if (@defined($rename)) { -+ filelen = $rename->rn_snamelen -+ filename = kernel_string_n($rename->rn_sname, -+ $rename->rn_snamelen) -+ tlen = $rename->rn_tnamelen -+ tname = kernel_string_n($rename->rn_tname, $rename->rn_tnamelen) -+ } else { -+ filelen = $u->rename->rn_snamelen -+ filename = kernel_string_n($u->rename->rn_sname, -+ $u->rename->rn_snamelen) -+ tlen = $u->rename->rn_tnamelen -+ tname = kernel_string_n($u->rename->rn_tname, -+ $u->rename->rn_tnamelen) -+ } - - uid = __rqstp_uid($rqstp) - gid = __rqstp_gid($rqstp) - - name = "nfsd.proc4.rename" -- argstr = sprintf("%s to %s", -- kernel_string_n($rename->rn_sname, $rename->rn_snamelen), -- kernel_string_n($rename->rn_tname, $rename->rn_tnamelen)) -+ argstr = sprintf("%s to %s", filename, tname) - } - - probe nfsd.proc4.rename.return = -diff --git a/tapset/linux/signal.stp b/tapset/linux/signal.stp -index 9a94bad..4f9f9f9 100644 ---- a/tapset/linux/signal.stp -+++ b/tapset/linux/signal.stp -@@ -613,7 +613,11 @@ probe signal.pending = kernel.function("do_sigpending").call !, - { - name = "pending" - sigset_add=@choose_defined($set, $uset) -- sigset_size=$sigsetsize -+ -+ # Note that this isn't 100% correct if $sigsetsize doesn't -+ # exist (in the case of newer do_sigpending() calls). Instead, -+ # we're returning the default size of a sigset_t. -+ sigset_size=@choose_defined($sigsetsize, @cast_sizeof("sigset_t")) - } - - /** diff --git a/sources b/sources index eabc5df..80e8943 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (systemtap-3.2.tar.gz) = 6036ed1b5189fd3fcfdeeaa526a3539ac632d0b687a063b5e3424e8f613bfc2c8d079742b0262b547128e97e30e4beb61898b23761657aee519e61346ac92e94 +SHA512 (systemtap-3.3.tar.gz) = b75a4591bdc021645c15cb8f2b8991f46fdffb29b1d132745bafe4291aee5e1892ea9a63c8e98f011a4fee68decd99aa4401dc2f70e163e801cd140ad4cd6b6e diff --git a/systemtap.spec b/systemtap.spec index 9907a65..94d8769 100644 --- a/systemtap.spec +++ b/systemtap.spec @@ -1,5 +1,6 @@ %{!?with_sqlite: %global with_sqlite 0%{?fedora} >= 17 || 0%{?rhel} >= 7} -%{!?with_docs: %global with_docs 1} +# prefer prebuilt docs +%{!?with_docs: %global with_docs 0} %{!?with_htmldocs: %global with_htmldocs 0} %{!?with_monitor: %global with_monitor 1} # crash is not available @@ -33,9 +34,9 @@ %{!?with_openssl: %global with_openssl 0} %endif %{!?with_pyparsing: %global with_pyparsing 0%{?fedora} >= 18 || 0%{?rhel} >= 7} -%{!?with_python3: %global with_python3 0%{?fedora} >= 23} -%{!?with_python2_probes: %global with_python2_probes 1} -%{!?with_python3_probes: %global with_python3_probes 0%{?fedora} >= 23} +%{!?with_python3: %global with_python3 0%{?fedora} >= 23 || 0%{?rhel} > 7} +%{!?with_python2_probes: %global with_python2_probes (0%{?fedora} <= 28 && 0%{?rhel} <= 7)} +%{!?with_python3_probes: %global with_python3_probes (0%{?fedora} >= 23 || 0%{?rhel} > 7)} %{!?with_httpd: %global with_httpd 0} %ifarch ppc64le aarch64 @@ -66,44 +67,26 @@ %define dracutstap %{_prefix}/share/dracut/modules.d/99stap %endif -%if 0%{?rhel} >= 6 +%if 0%{?rhel} == 6 || 0%{?rhel} == 7 %define dracutbindir /sbin %else %define dracutbindir %{_bindir} %endif +%if 0%{?rhel} == 6 + %{!?_rpmmacrodir: %define _rpmmacrodir /etc/rpm/} +%else + %{!?_rpmmacrodir: %define _rpmmacrodir %{_rpmconfigdir}/macros.d} +%endif + +# To avoid testsuite/*/*.stp has shebang which doesn't start with '/' +%undefine __brp_mangle_shebangs + Name: systemtap -Version: 3.2 -Release: 11%{?dist} +Version: 3.3 +Release: 1%{?dist} # for version, see also configure.ac -Patch10: rhbz1504009.patch - -# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1546563 -# upstream: https://sourceware.org/bugzilla/show_bug.cgi?id=22551 -Patch11: rhbz1546563.patch - -# Add a new kernel fallback unwinder. -# upstream: commit 553b6df07c9b7ab30ed468a6a4374cbdf73d1c0d -Patch13: unwind-fallback.patch -# And make the kernel DWARF unwinder work with ksalr. -# upstream: commit 17ee540dd61113fe4f557f191db3480db875cca1 -Patch14: unwind-ksalr.patch - -# Build-id mismatch with (re)inserted/removed kernel module probe -# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1566422 -# upstream: db9c9d6e30c6cfd7b85475b5c79ee2cc51201934 -Patch15: rhbz1566422.patch - -# systemtap depends on removed /bin/env -# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1549063 -# upstream: commit d6492e78bd50e923963e3c7aa235100a208f4775 -Patch16: rhbz1549063.patch - -# 4.15 kernel updates (__GFP_COLD undeclared) -# redhat: https://bugzilla.redhat.com/show_bug.cgi?id=1549063 -# upstream: commit 0f8139eb4bd06a19714608b5f246fc24fcafde6e -Patch17: rhbz1566745.patch # Packaging abstract: # @@ -139,7 +122,6 @@ URL: http://sourceware.org/systemtap/ Source: ftp://sourceware.org/pub/systemtap/releases/systemtap-%{version}.tar.gz # Build* -BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: gcc-c++ BuildRequires: gettext-devel BuildRequires: pkgconfig(nss) @@ -207,9 +189,13 @@ BuildRequires: readline-devel BuildRequires: pkgconfig(ncurses) %endif %if %{with_python2_probes} -BuildRequires: python-devel +BuildRequires: python2-devel +%if 0%{?fedora} >= 1 +BuildRequires: python2-setuptools +%else BuildRequires: python-setuptools %endif +%endif %if %{with_python3_probes} BuildRequires: python3-devel BuildRequires: python3-setuptools @@ -238,10 +224,7 @@ Group: Development/System License: GPLv2+ URL: http://sourceware.org/systemtap/ Requires: systemtap-devel = %{version}-%{release} -# On RHEL[45], /bin/mktemp comes from the 'mktemp' package. On newer -# distributions, /bin/mktemp comes from the 'coreutils' package. To -# avoid a specific RHEL[45] Requires, we'll do a file-based require. -Requires: nss /bin/mktemp +Requires: nss coreutils Requires: zip unzip Requires(pre): shadow-utils Requires(post): chkconfig @@ -344,7 +327,11 @@ URL: http://sourceware.org/systemtap/ %if %{with_python3} Requires: python3-pyparsing %else +%if 0%{?rhel} >= 7 Requires: pyparsing +%else +Requires: python2-pyparsing +%endif %endif %endif @@ -420,7 +407,7 @@ License: GPLv2+ URL: http://sourceware.org/systemtap/ Requires: systemtap-runtime = %{version}-%{release} Requires: byteman > 2.0 -Requires: net-tools +Requires: iproute %description runtime-java This package includes support files needed to run systemtap scripts @@ -449,6 +436,11 @@ License: GPLv2+ URL: http://sourceware.org/systemtap/ Requires: systemtap-runtime = %{version}-%{release} +%if ! (%{with_python2_probes}) +# Provide an clean upgrade path when the python2 package is removed +Obsoletes: %{name}-runtime-python2 < %{version}-%{release} +%endif + %description runtime-python3 This package includes support files needed to run systemtap scripts that probe python 3 processes. @@ -506,15 +498,6 @@ find . \( -name configure -o -name config.h.in \) -print | xargs touch cd .. %endif -%patch10 -p1 -%patch11 -p1 - -%patch13 -p1 -%patch14 -p1 -%patch15 -p1 -%patch16 -p1 -%patch17 -p1 - %build %if %{with_bundled_elfutils} @@ -567,7 +550,7 @@ cd .. %global docs_config --enable-docs --disable-htmldocs %endif %else -%global docs_config --disable-docs +%global docs_config --enable-docs=prebuilt %endif # Enable pie as configure defaults to disabling it @@ -658,19 +641,21 @@ install -c -m 755 stap-prep $RPM_BUILD_ROOT%{_bindir}/stap-prep # Copy over the testsuite cp -rp testsuite $RPM_BUILD_ROOT%{_datadir}/systemtap -%if %{with_docs} # We want the manuals in the special doc dir, not the generic doc install dir. # We build it in place and then move it away so it doesn't get installed # twice. rpm can specify itself where the (versioned) docs go with the # %doc directive. mkdir docs.installed mv $RPM_BUILD_ROOT%{_datadir}/doc/systemtap/*.pdf docs.installed/ +%if %{with_docs} %if %{with_htmldocs} mv $RPM_BUILD_ROOT%{_datadir}/doc/systemtap/tapsets docs.installed/ mv $RPM_BUILD_ROOT%{_datadir}/doc/systemtap/SystemTap_Beginners_Guide docs.installed/ %endif %endif +install -D -m 644 macros.systemtap $RPM_BUILD_ROOT%{_rpmmacrodir}/macros.systemtap + mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/stap-server mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/stap-server mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/stap-server/.systemtap @@ -738,9 +723,6 @@ done touch $RPM_BUILD_ROOT%{dracutstap}/params.conf %endif -%clean -rm -rf ${RPM_BUILD_ROOT} - %pre runtime getent group stapusr >/dev/null || groupadd -g 156 -r stapusr 2>/dev/null || groupadd -r stapusr getent group stapsys >/dev/null || groupadd -g 157 -r stapsys 2>/dev/null || groupadd -r stapsys @@ -753,6 +735,15 @@ getent passwd stap-server >/dev/null || \ useradd -c "Systemtap Compile Server" -u 155 -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server 2>/dev/null || \ useradd -c "Systemtap Compile Server" -g stap-server -d %{_localstatedir}/lib/stap-server -r -s /sbin/nologin stap-server +%pre testsuite +getent passwd stapusr >/dev/null || \ + useradd -c "Systemtap 'stapusr' User" -g stapusr -r -s /sbin/nologin stapusr +getent passwd stapsys >/dev/null || \ + useradd -c "Systemtap 'stapsys' User" -g stapsys -G stapusr -r -s /sbin/nologin stapsys +getent passwd stapdev >/dev/null || \ + useradd -c "Systemtap 'stapdev' User" -g stapdev -G stapusr -r -s /sbin/nologin stapdev +exit 0 + %post server # We have some duplication between the %files listings for the @@ -1089,8 +1080,8 @@ done %{_datadir}/systemtap/examples %{!?_licensedir:%global license %%doc} %license COPYING -%if %{with_docs} %doc docs.installed/*.pdf +%if %{with_docs} %if %{with_htmldocs} %doc docs.installed/tapsets/*.html %doc docs.installed/SystemTap_Beginners_Guide @@ -1135,6 +1126,7 @@ done %{_includedir}/sys/sdt.h %{_includedir}/sys/sdt-config.h %{_mandir}/man1/dtrace.1* +%{_rpmmacrodir}/macros.systemtap %doc README AUTHORS NEWS %{!?_licensedir:%global license %%doc} %license COPYING @@ -1194,23 +1186,8 @@ done # PRERELEASE %changelog -* Thu Apr 19 2018 Mark Wielaard - 3.2-11 -- Add rhbz1549063.patch (/bin/env -> /usr/bin/env) -- Add rhbz1566745.patch (4.15 kernel tapset updates) -- Enable accidentially disabled Suggests: kernel-devel again. - -* Wed Apr 18 2018 Mark Wielaard - 3.2-10 -- Add unwind-fallback.patch -- rhbz1566422.patch - -* Tue Apr 17 2018 Mark Wielaard - 3.2-9 -- Add unwind-fallback.patch. - -* Thu Feb 22 2018 Sergey Avseyev - 3.2-3 -- rhbz1546563 (backport fix for removed timers in kernel 4.15) - -* Fri Oct 20 2017 Frank Ch. Eigler - 3.2-2 -- rhbz1504009 (dtrace -G -o /dev/null) +* Thu Jun 07 2018 Frank Ch. Eigler - 3.3-1 +- Upstream release. * Wed Oct 18 2017 Frank Ch. Eigler - 3.2-1 - Upstream release. @@ -1234,7 +1211,7 @@ done - Upstream release. * Mon Jul 07 2014 Josh Stone -- Flip with_dyninst to an %ifarch whitelist. +- Flip with_dyninst to an %%ifarch whitelist. * Wed Apr 30 2014 Jonathan Lebon - 2.5-1 - Upstream release. diff --git a/unwind-fallback.patch b/unwind-fallback.patch deleted file mode 100644 index bb57607..0000000 --- a/unwind-fallback.patch +++ /dev/null @@ -1,249 +0,0 @@ -From 553b6df07c9b7ab30ed468a6a4374cbdf73d1c0d Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Tue, 17 Apr 2018 14:36:13 +0200 -Subject: [PATCH] linux runtime: Add support for new kernel unwind fallback. - -In newer kernels dump_trace got replaced by a new unwind infrastructure. -Add a new autoconf-unwind-stack-trace.c to detect whether we can use it. -Extend the runtime/stack.c _stp_stack_print_fallback with a new pt_regs* -argument. Update all callers and add dbug_unwind output to show which -fallback unwinder we are selecting (or if we are just giving up). -Rename the struct unwind_state in unwind.c and unwind.h to uw_state -because the old name now conflicts with the one used in the kernel. ---- - buildrun.cxx | 2 ++ - runtime/linux/autoconf-unwind-stack-trace.c | 16 +++++++++ - runtime/stack.c | 50 ++++++++++++++++++++++++++--- - runtime/unwind.c | 14 ++++---- - runtime/unwind/unwind.h | 4 +-- - 5 files changed, 72 insertions(+), 14 deletions(-) - create mode 100644 runtime/linux/autoconf-unwind-stack-trace.c - -diff --git a/buildrun.cxx b/buildrun.cxx -index 403fa71..59b9e88 100644 ---- a/buildrun.cxx -+++ b/buildrun.cxx -@@ -365,6 +365,8 @@ compile_pass (systemtap_session& s) - "STAPCONF_KERNEL_STACKTRACE", NULL); - output_autoconf(s, o, "autoconf-save-stack-trace-no-bp.c", - "STAPCONF_KERNEL_STACKTRACE_NO_BP", NULL); -+ output_autoconf(s, o, "autoconf-unwind-stack-trace.c", -+ "STAPCONF_KERNEL_UNWIND_STACK", NULL); - output_autoconf(s, o, "autoconf-asm-syscall.c", - "STAPCONF_ASM_SYSCALL_H", NULL); - output_autoconf(s, o, "autoconf-ring_buffer-flags.c", "STAPCONF_RING_BUFFER_FLAGS", NULL); -diff --git a/runtime/linux/autoconf-unwind-stack-trace.c b/runtime/linux/autoconf-unwind-stack-trace.c -new file mode 100644 -index 0000000..2ec399e ---- /dev/null -+++ b/runtime/linux/autoconf-unwind-stack-trace.c -@@ -0,0 +1,16 @@ -+#include -+#include -+ -+void unwind_stack_trace (void) -+{ -+ struct unwind_state state; -+ unwind_start (&state, current, 0, 0); -+ while (! unwind_done (&state)) -+ { -+ unsigned long addr = unwind_get_return_address (&state); -+ if (addr == 0) -+ break; -+ unwind_next_frame (&state); -+ } -+} -+ -diff --git a/runtime/stack.c b/runtime/stack.c -index c9d2c0c..43f98ef 100644 ---- a/runtime/stack.c -+++ b/runtime/stack.c -@@ -43,7 +43,11 @@ - #include - #endif - --static void _stp_stack_print_fallback(unsigned long, int, int, int); -+#if defined(STAPCONF_KERNEL_UNWIND_STACK) -+#include -+#endif -+ -+static void _stp_stack_print_fallback(unsigned long, struct pt_regs*, int, int, int); - - #ifdef STP_USE_DWARF_UNWINDER - #ifdef STAPCONF_LINUX_UACCESS_H -@@ -128,7 +132,7 @@ static const struct stacktrace_ops print_stack_ops = { - }; - - /* Used for kernel backtrace printing when other mechanisms fail. */ --static void _stp_stack_print_fallback(unsigned long stack, -+static void _stp_stack_print_fallback(unsigned long stack, struct pt_regs *regs, - int sym_flags, int levels, int skip) - { - struct print_stack_data print_data; -@@ -136,20 +140,55 @@ static void _stp_stack_print_fallback(unsigned long stack, - print_data.levels = levels; - print_data.skip = skip; - #if defined(STAPCONF_KERNEL_STACKTRACE) -+ dbug_unwind(1, "fallback kernel stacktrace\n"); - dump_trace(current, NULL, (long *)stack, 0, &print_stack_ops, - &print_data); - #else - /* STAPCONF_KERNEL_STACKTRACE_NO_BP */ -+ dbug_unwind(1, "fallback kernel stacktrace (no bp)\n"); - dump_trace(current, NULL, (long *)stack, &print_stack_ops, - &print_data); - #endif - } - #else --static void _stp_stack_print_fallback(unsigned long s, int v, int l, int k) { -+#if defined(STAPCONF_KERNEL_UNWIND_STACK) -+static void _stp_stack_print_fallback(unsigned long sp, struct pt_regs *regs, -+ int sym_flags, -+ int levels, int skip) { -+ struct unwind_state state; -+ unwind_start (&state, current, regs, (unsigned long *) sp); -+ dbug_unwind(1, "fallback kernel stacktrace (unwind)\n"); -+ while (levels > 0 && ! unwind_done (&state)) -+ { -+ if (skip == 0) -+ { -+ unsigned long addr = unwind_get_return_address (&state); -+ /* When we have frame pointers, the unwind addresses can be -+ (mostly) trusted, otherwise it is all guesswork. */ -+#ifdef CONFIG_FRAME_POINTER -+ _stp_print_addr(addr, sym_flags, NULL); -+#else -+ _stp_print_addr(addr, sym_flags | _STP_SYM_INEXACT, NULL); -+#endif -+ if (addr == 0) -+ break; -+ levels--; -+ } -+ else -+ { -+ dbug_unwind(1, "skipping frame\n"); -+ skip--; -+ } -+ unwind_next_frame(&state); -+ } -+} -+#else /* no new unwind */ -+static void _stp_stack_print_fallback(unsigned long s, struct pt_regs *r, int v, int l, int k) { - /* Don't guess, just give up. */ -+ dbug_unwind(1, "no fallback kernel stacktrace (giving up)\n"); - _stp_print_addr(0, v | _STP_SYM_INEXACT, NULL); - } -- -+#endif /* new unwind */ - #endif /* defined(STAPCONF_KERNEL_STACKTRACE) || defined(STAPCONF_KERNEL_STACKTRACE_NO_BP) */ - - -@@ -382,6 +421,7 @@ static void _stp_stack_kernel_print(struct context *c, int sym_flags) - if (l == 0) { - remaining = MAXBACKTRACE - n; - _stp_stack_print_fallback(UNW_SP(&c->uwcontext_kernel.info), -+ &c->uwcontext_kernel.info.regs, - sym_flags, remaining, 0); - break; - } else { -@@ -408,7 +448,7 @@ static void _stp_stack_kernel_print(struct context *c, int sym_flags) - sp = 0; - skip = 5; /* yes, that many framework frames. */ - #endif -- _stp_stack_print_fallback(sp, sym_flags, -+ _stp_stack_print_fallback(sp, NULL, sym_flags, - MAXBACKTRACE, skip); - #else - if (sym_flags & _STP_SYM_SYMBOL) -diff --git a/runtime/unwind.c b/runtime/unwind.c -index ec7cd58..3a2d991 100644 ---- a/runtime/unwind.c -+++ b/runtime/unwind.c -@@ -235,7 +235,7 @@ static int parse_fde_cie(const u32 *fde, const u32 *cie, - - #define REG_STATE state->reg[state->stackDepth] - --static int advance_loc(unsigned long delta, struct unwind_state *state) -+static int advance_loc(unsigned long delta, struct uw_state *state) - { - state->loc += delta * state->codeAlign; - dbug_unwind(1, "state->loc=%lx\n", state->loc); -@@ -244,7 +244,7 @@ static int advance_loc(unsigned long delta, struct unwind_state *state) - - /* Set Same or Nowhere rule for register. */ - static void set_no_state_rule(uleb128_t reg, enum item_location where, -- struct unwind_state *state) -+ struct uw_state *state) - { - dbug_unwind(1, "reg=%lx, where=%d\n", reg, where); - if (reg < ARRAY_SIZE(REG_STATE.regs)) { -@@ -254,7 +254,7 @@ static void set_no_state_rule(uleb128_t reg, enum item_location where, - - /* Memory or Value rule */ - static void set_offset_rule(uleb128_t reg, enum item_location where, -- sleb128_t svalue, struct unwind_state *state) -+ sleb128_t svalue, struct uw_state *state) - { - dbug_unwind(1, "reg=%lx, where=%d, svalue=%lx\n", reg, where, svalue); - if (reg < ARRAY_SIZE(REG_STATE.regs)) { -@@ -265,7 +265,7 @@ static void set_offset_rule(uleb128_t reg, enum item_location where, - - /* Register rule. */ - static void set_register_rule(uleb128_t reg, uleb128_t value, -- struct unwind_state *state) -+ struct uw_state *state) - { - dbug_unwind(1, "reg=%lx, value=%lx\n", reg, value); - if (reg < ARRAY_SIZE(REG_STATE.regs)) { -@@ -277,7 +277,7 @@ static void set_register_rule(uleb128_t reg, uleb128_t value, - /* Expr or ValExpr rule. */ - static void set_expr_rule(uleb128_t reg, enum item_location where, - const u8 **expr, const u8 *end, -- struct unwind_state *state) -+ struct uw_state *state) - { - const u8 *const start = *expr; - uleb128_t len = get_uleb128(expr, end); -@@ -296,7 +296,7 @@ static void set_expr_rule(uleb128_t reg, enum item_location where, - #define MAX_CFI 512 - - static int processCFI(const u8 *start, const u8 *end, unsigned long targetLoc, -- signed ptrType, int user, struct unwind_state *state, int compat_task) -+ signed ptrType, int user, struct uw_state *state, int compat_task) - { - union { - const u8 *p8; -@@ -1169,7 +1169,7 @@ static int unwind_frame(struct unwind_context *context, - unsigned i; - signed ptrType = -1, call_frame = 1; - uleb128_t retAddrReg = 0; -- struct unwind_state *state = &context->state; -+ struct uw_state *state = &context->state; - unsigned long addr; - - if (unlikely(table_len == 0)) { -diff --git a/runtime/unwind/unwind.h b/runtime/unwind/unwind.h -index 9d66732..b3ff786 100644 ---- a/runtime/unwind/unwind.h -+++ b/runtime/unwind/unwind.h -@@ -492,7 +492,7 @@ struct unwind_reg_state { - unsigned cfa_is_expr:1; - }; - --struct unwind_state { -+struct uw_state { - uleb128_t loc; - uleb128_t codeAlign; - sleb128_t dataAlign; -@@ -503,7 +503,7 @@ struct unwind_state { - - struct unwind_context { - struct unwind_frame_info info; -- struct unwind_state state; -+ struct uw_state state; - }; - - static const struct cfa badCFA = { ARRAY_SIZE(reg_info), 1 }; --- -1.8.3.1 - diff --git a/unwind-ksalr.patch b/unwind-ksalr.patch deleted file mode 100644 index 6ed43ee..0000000 --- a/unwind-ksalr.patch +++ /dev/null @@ -1,32 +0,0 @@ -commit 17ee540dd61113fe4f557f191db3480db875cca1 -Author: Mark Wielaard -Date: Wed Apr 18 15:00:24 2018 +0200 - - Make kernel DWARF unwinder work with ksalr. - - The .debug_frame loaded from disk is already relocated against the - expected load offset of the kernel, but the actual static (load) - address might be different (with kaslr). So adjust the startLoc - for that difference when reading any address from the unwind table. - -diff --git a/runtime/unwind.c b/runtime/unwind.c -index 3a2d991..4c360d2 100644 ---- a/runtime/unwind.c -+++ b/runtime/unwind.c -@@ -724,10 +724,15 @@ adjustStartLoc (unsigned long startLoc, - dbug_unwind(2, "adjustStartLoc=%lx, ptrType=%s, m=%s, s=%s eh=%d\n", - startLoc, _stp_eh_enc_name(ptrType), m->path, s->name, is_ehframe); - if (startLoc == 0 -- || strcmp (m->name, "kernel") == 0 - || (strcmp (s->name, ".absolute") == 0 && !is_ehframe)) - return startLoc; - -+ /* The .debug_frame loaded from disk is already relocated against the -+ expected load offset of the kernel, but the actual static (load) -+ address might be different (with kaslr). */ -+ if (strcmp (m->name, "kernel") == 0) -+ return startLoc - s->sec_load_offset + s->static_addr; -+ - /* eh_frame data has been loaded in the kernel, so readjust offset. */ - if (is_ehframe) { - dbug_unwind(2, "eh_frame=%lx, eh_frame_addr=%lx\n", (unsigned long) m->eh_frame, m->eh_frame_addr); From c0ec2425f38e65b37793f815f4d7c00a0ca1591c Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Thu, 15 Nov 2018 20:38:09 -0500 Subject: [PATCH 7/7] rhbz1650371 --- rhbz1650371.patch | 134 ++++++++++++++++++++++++++++++++++++++++++++++ systemtap.spec | 9 +++- 2 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 rhbz1650371.patch diff --git a/rhbz1650371.patch b/rhbz1650371.patch new file mode 100644 index 0000000..7401c66 --- /dev/null +++ b/rhbz1650371.patch @@ -0,0 +1,134 @@ +commit fba365b4d365f54ab7ef60272996dc2889461640 +Author: Frank Ch. Eigler +Date: Thu Nov 15 16:27:58 2018 -0500 + + PR23890: tolerate f29+ style ELF files + + Reported by kenj@pcp, with mjw et al.'s help, we found out why + systemtap on fedora 29+ routinely fails to verify build-ids for + userspace programs. F29 adds a separate loadable segment with the + relevante .note's, before the main text segment. The runtime code + that listens to mmaps-in-progress now accepts this configuration. + As long as the .note section is loaded (time-wise and space-wise) + before the .text one(s), we're good. + +diff --git a/runtime/linux/uprobes-inode.c b/runtime/linux/uprobes-inode.c +index 6d450c90d87c..b9604e6385ce 100644 +--- a/runtime/linux/uprobes-inode.c ++++ b/runtime/linux/uprobes-inode.c +@@ -563,9 +563,11 @@ stapiu_change_plus(struct stapiu_target* target, struct task_struct *task, + return rc; + } + +- /* Actually do the check. */ ++ /* Actually do the check. NB: on F29+, offset may not equal 0 ++ for LOADable "R E" segments, because the read-only .note.* ++ stuff may have been loaded earlier, separately. PR23890. */ + if ((rc = _stp_usermodule_check(task, target->filename, +- relocation))) { ++ relocation - offset))) { + /* Be sure to release the inode on failure. */ + iput(target->inode); + target->inode = NULL; + +commit 824e9ab80108c1882842fc2a4b4abd1aee990ecc (upstream/master) +Author: Frank Ch. Eigler +Date: Thu Nov 15 20:22:34 2018 -0500 + + PR23890 bonus: show nicer messages upon a buildid mismatch + + Instead of producing only a one-byte error, we now compute the entire + builds into hex text strings, and report the whole shebang on an + error. (Also, ditch some 2.6.27 kernel-bug compatibiltiy fossil + in the area.) + +diff --git a/runtime/sym.c b/runtime/sym.c +index 60f0fa980964..111147ee555d 100644 +--- a/runtime/sym.c ++++ b/runtime/sym.c +@@ -636,30 +636,46 @@ unsigned long _stp_linenumber_lookup(unsigned long addr, struct task_struct *tas + return 0; + } + ++ ++// Compare two build-id hex strings, each of length m->build_id_len bytes. ++// Since mismatches can mystify, produce a hex-textual version of both ++// expected and actual strings, and compare textually. Failure messages ++// are more intelligible this way. + static int _stp_build_id_check (struct _stp_module *m, + unsigned long notes_addr, + struct task_struct *tsk) + { +- int j; ++ enum { max_buildid_hexstring = 65 }; ++ static const char hexnibble[16]="0123456789abcdef"; ++ char hexstring_theory[max_buildid_hexstring], hexstring_practice[max_buildid_hexstring]; ++ int buildid_len = min((max_buildid_hexstring-1)/2, m->build_id_len); ++ ++ int i, j; ++ ++ memset(hexstring_theory, '\0', max_buildid_hexstring); ++ for (i=0, j=0; jbuild_id_bits[j]; ++ hexstring_theory[i++] = hexnibble[theory >> 4]; ++ hexstring_theory[i++] = hexnibble[theory & 15]; ++ } + +- for (j = 0; j < m->build_id_len; j++) { ++ memset(hexstring_practice, '\0', max_buildid_hexstring); ++ for (i=0, j=0; jbuild_id_bits[j]; + set_fs(KERNEL_DS); + rc = probe_kernel_read(&practice, (void*)(notes_addr + j), 1); + } + else + #endif + { +- theory = m->build_id_bits[j]; + set_fs (tsk ? USER_DS : KERNEL_DS); + + /* +@@ -685,21 +701,19 @@ static int _stp_build_id_check (struct _stp_module *m, + } + set_fs(oldfs); + +- if (rc || (theory != practice)) { +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +- _stp_error ("Build-id mismatch [man error::buildid]: \"%s\" byte %d (0x%02x vs 0x%02x) address %#lx rc %d\n", +- m->path, j, theory, practice, notes_addr, rc); ++ if (rc == 0) { // got actual data byte ++ hexstring_practice[i++] = hexnibble[practice >> 4]; ++ hexstring_practice[i++] = hexnibble[practice & 15]; ++ } ++ } ++ ++ // have two strings, will travel ++ if (strcmp (hexstring_practice, hexstring_theory)) { ++ _stp_error ("Build-id mismatch [man error::buildid]: \"%s\" address %#lx, expected %s actual %s\n", ++ m->path, notes_addr, hexstring_theory, hexstring_practice); + return 1; +-#else +- /* This branch is a surrogate for kernels affected by Fedora bug +- * #465873. */ +- _stp_warn (KERN_WARNING +- "Build-id mismatch [man error::buildid]: \"%s\" byte %d (0x%02x vs 0x%02x) rc %d\n", +- m->path, j, theory, practice, rc); +-#endif +- break; +- } /* end mismatch */ +- } /* end per-byte check loop */ ++ } ++ + return 0; + } + diff --git a/systemtap.spec b/systemtap.spec index afd579f..d430575 100644 --- a/systemtap.spec +++ b/systemtap.spec @@ -84,7 +84,7 @@ Name: systemtap Version: 4.0 -Release: 1%{?release_override}%{?dist} +Release: 2%{?release_override}%{?dist} # for version, see also configure.ac @@ -121,6 +121,8 @@ License: GPLv2+ URL: http://sourceware.org/systemtap/ Source: ftp://sourceware.org/pub/systemtap/releases/systemtap-%{version}.tar.gz +Patch10: rhbz1650371.patch + # Build* BuildRequires: gcc-c++ BuildRequires: cpio @@ -529,6 +531,8 @@ find . \( -name configure -o -name config.h.in \) -print | xargs touch cd .. %endif +%patch10 -p1 + %build %if %{with_bundled_elfutils} @@ -1271,6 +1275,9 @@ done # PRERELEASE %changelog +* Thu Nov 15 2018 Frank Ch. Eigler - 4.0-2 +- rhbz1650371 - buildid mismatch for uprobes + * Sat Oct 13 2018 Frank Ch. Eigler - 4.0-1 - Upstream release.