upstream release 3.3
This commit is contained in:
parent
b67c63adc5
commit
3df356ef9a
@ -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 {
|
@ -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
|
||||
|
@ -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))
|
||||
}
|
@ -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;
|
||||
}
|
@ -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"))
|
||||
}
|
||||
|
||||
/**
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (systemtap-3.2.tar.gz) = 6036ed1b5189fd3fcfdeeaa526a3539ac632d0b687a063b5e3424e8f613bfc2c8d079742b0262b547128e97e30e4beb61898b23761657aee519e61346ac92e94
|
||||
SHA512 (systemtap-3.3.tar.gz) = b75a4591bdc021645c15cb8f2b8991f46fdffb29b1d132745bafe4291aee5e1892ea9a63c8e98f011a4fee68decd99aa4401dc2f70e163e801cd140ad4cd6b6e
|
||||
|
125
systemtap.spec
125
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 <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.
|
||||
|
@ -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
|
||||
|
@ -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);
|
Loading…
Reference in New Issue
Block a user