upstream release 3.3

This commit is contained in:
Frank Ch. Eigler 2018-06-08 18:46:04 -04:00
parent b67c63adc5
commit 3df356ef9a
9 changed files with 52 additions and 881 deletions

View File

@ -1,49 +0,0 @@
commit 9f81f10b0caf6dfc49c4b7ceb7902f45d37b532a (HEAD -> master, origin/master, origin/HEAD)
Author: Frank Ch. Eigler <fche@redhat.com>
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 {

View File

@ -1,273 +0,0 @@
From fbb26e17a4c026f05a497fc5d584516bad3b6950 Mon Sep 17 00:00:00 2001
From: David Smith <dsmith@redhat.com>
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 <linux/compat.h>
#include <linux/sched.h>
#include <linux/mm.h>
-#include <linux/timer.h>
+#include "timer_compatibility.h"
#include <linux/delay.h>
#include <linux/profile.h>
#include <linux/rcupdate.h>
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 <linux/timer.h>
+
+/*
+ * 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 <linux/debugfs.h>
#include <linux/mm.h>
#include <linux/relay.h>
-#include <linux/timer.h>
+#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 <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
-#include <linux/timer.h>
+#include "linux/timer_compatibility.h"
#include <linux/blkdev.h>
%}
--
2.9.3

View File

@ -1,32 +0,0 @@
commit d6492e78bd50e923963e3c7aa235100a208f4775
Author: Mark Wielaard <mark@klomp.org>
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))
}

View File

@ -1,46 +0,0 @@
commit db9c9d6e30c6cfd7b85475b5c79ee2cc51201934
Author: Serhei Makarov <smakarov@redhat.com>
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;
}

View File

@ -1,125 +0,0 @@
commit 0f8139eb4bd06a19714608b5f246fc24fcafde6e
Author: David Smith <dsmith@redhat.com>
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"))
}
/**

View File

@ -1 +1 @@
SHA512 (systemtap-3.2.tar.gz) = 6036ed1b5189fd3fcfdeeaa526a3539ac632d0b687a063b5e3424e8f613bfc2c8d079742b0262b547128e97e30e4beb61898b23761657aee519e61346ac92e94
SHA512 (systemtap-3.3.tar.gz) = b75a4591bdc021645c15cb8f2b8991f46fdffb29b1d132745bafe4291aee5e1892ea9a63c8e98f011a4fee68decd99aa4401dc2f70e163e801cd140ad4cd6b6e

View File

@ -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 <mjw@fedoraproject.org> - 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 <mjw@fedoraproject.org> - 3.2-10
- Add unwind-fallback.patch
- rhbz1566422.patch
* Tue Apr 17 2018 Mark Wielaard <mjw@fedoraproject.org> - 3.2-9
- Add unwind-fallback.patch.
* Thu Feb 22 2018 Sergey Avseyev <sergey.avseyev@gmail.com> - 3.2-3
- rhbz1546563 (backport fix for removed timers in kernel 4.15)
* Fri Oct 20 2017 Frank Ch. Eigler <fche@redhat.com> - 3.2-2
- rhbz1504009 (dtrace -G -o /dev/null)
* Thu Jun 07 2018 Frank Ch. Eigler <fche@redhat.com> - 3.3-1
- Upstream release.
* Wed Oct 18 2017 Frank Ch. Eigler <fche@redhat.com> - 3.2-1
- Upstream release.
@ -1234,7 +1211,7 @@ done
- Upstream release.
* Mon Jul 07 2014 Josh Stone <jistone@redhat.com>
- Flip with_dyninst to an %ifarch whitelist.
- Flip with_dyninst to an %%ifarch whitelist.
* Wed Apr 30 2014 Jonathan Lebon <jlebon@redhat.com> - 2.5-1
- Upstream release.

View File

@ -1,249 +0,0 @@
From 553b6df07c9b7ab30ed468a6a4374cbdf73d1c0d Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mark@klomp.org>
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 <linux/sched.h>
+#include <asm/unwind.h>
+
+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 <asm/stacktrace.h>
#endif
-static void _stp_stack_print_fallback(unsigned long, int, int, int);
+#if defined(STAPCONF_KERNEL_UNWIND_STACK)
+#include <asm/unwind.h>
+#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

View File

@ -1,32 +0,0 @@
commit 17ee540dd61113fe4f557f191db3480db875cca1
Author: Mark Wielaard <mark@klomp.org>
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);