From: takahiro.akashi@linaro.org (AKASHI Takahiro)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 5/7] ftrace: allow arch-specific stack tracer
Date: Thu, 8 Oct 2015 19:01:42 +0900 [thread overview]
Message-ID: <1444298504-10392-6-git-send-email-takahiro.akashi@linaro.org> (raw)
In-Reply-To: <1444298504-10392-1-git-send-email-takahiro.akashi@linaro.org>
A stack frame may be used in a different way depending on cpu architecture.
Thus it is not always appropriate to slurp the stack contents, as current
check_stack() does, in order to calcurate a stack index (height) at a given
function call. At least not on arm64.
In addition, there is a possibility that we will mistakenly detect a stale
stack frame which has not been overwritten.
This patch makes check_stack() a weak function so as to later implement
arch-specific version.
Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
---
include/linux/ftrace.h | 10 ++++++++++
kernel/trace/trace_stack.c | 22 ++++++++++++++--------
2 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index d77b195..e538400 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -270,7 +270,17 @@ static inline void ftrace_kill(void) { }
#define FTRACE_STACK_FRAME_OFFSET 0
#endif
+#define STACK_TRACE_ENTRIES 500
+
+struct stack_trace;
+
+extern unsigned stack_dump_index[];
+extern struct stack_trace max_stack_trace;
+extern unsigned long max_stack_size;
+extern arch_spinlock_t max_stack_lock;
+
extern int stack_tracer_enabled;
+void print_max_stack(void);
int
stack_trace_sysctl(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp,
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
index 30521ea..ff1a191 100644
--- a/kernel/trace/trace_stack.c
+++ b/kernel/trace/trace_stack.c
@@ -16,24 +16,22 @@
#include "trace.h"
-#define STACK_TRACE_ENTRIES 500
-
static unsigned long stack_dump_trace[STACK_TRACE_ENTRIES+1] =
{ [0 ... (STACK_TRACE_ENTRIES)] = ULONG_MAX };
-static unsigned stack_dump_index[STACK_TRACE_ENTRIES];
+unsigned stack_dump_index[STACK_TRACE_ENTRIES];
/*
* Reserve one entry for the passed in ip. This will allow
* us to remove most or all of the stack size overhead
* added by the stack tracer itself.
*/
-static struct stack_trace max_stack_trace = {
+struct stack_trace max_stack_trace = {
.max_entries = STACK_TRACE_ENTRIES - 1,
.entries = &stack_dump_trace[0],
};
-static unsigned long max_stack_size;
-static arch_spinlock_t max_stack_lock =
+unsigned long max_stack_size;
+arch_spinlock_t max_stack_lock =
(arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED;
static DEFINE_PER_CPU(int, trace_active);
@@ -42,7 +40,7 @@ static DEFINE_MUTEX(stack_sysctl_mutex);
int stack_tracer_enabled;
static int last_stack_tracer_enabled;
-static inline void print_max_stack(void)
+void print_max_stack(void)
{
long i;
int size;
@@ -65,7 +63,15 @@ static inline void print_max_stack(void)
}
}
-static inline void
+/*
+ * When arch-specific code overides this function, the following
+ * data should be filled up, assuming max_stack_lock is held to
+ * prevent concurrent updates.
+ * stack_dump_index[]
+ * max_stack_trace
+ * max_stack_size
+ */
+void __weak
check_stack(unsigned long ip, unsigned long *stack)
{
unsigned long this_size, flags; unsigned long *p, *top, *start;
--
1.7.9.5
next prev parent reply other threads:[~2015-10-08 10:01 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-08 10:01 [PATCH v3 0/7] arm64: ftrace: fix incorrect output from stack tracer AKASHI Takahiro
2015-10-08 10:01 ` [PATCH v3 1/7] arm64: ftrace: adjust callsite addresses examined by " AKASHI Takahiro
2015-10-13 15:15 ` Jungseok Lee
2015-10-13 15:37 ` Steven Rostedt
2015-10-14 5:09 ` AKASHI Takahiro
2015-10-08 10:01 ` [PATCH v3 2/7] arm64: ftrace: modify a stack frame in a safe way AKASHI Takahiro
2015-10-08 10:01 ` [PATCH v3 3/7] arm64: ftrace: fix a stack tracer's output under function graph tracer AKASHI Takahiro
2015-10-09 6:46 ` kbuild test robot
2015-10-13 15:24 ` Jungseok Lee
2015-10-14 5:03 ` AKASHI Takahiro
2015-10-08 10:01 ` [PATCH v3 4/7] arm64: ftrace: allow for tracing leaf functions AKASHI Takahiro
2015-10-08 10:01 ` AKASHI Takahiro [this message]
2015-10-13 15:45 ` [PATCH v3 5/7] ftrace: allow arch-specific stack tracer Steven Rostedt
2015-10-08 10:01 ` [PATCH v3 6/7] arm64: insn: add instruction decoders for ldp/stp and add/sub AKASHI Takahiro
2015-10-08 10:01 ` [PATCH v3 7/7] arm64: ftrace: add arch-specific stack tracer AKASHI Takahiro
2015-10-09 6:41 ` kbuild test robot
2015-10-08 14:45 ` [PATCH v3 0/7] arm64: ftrace: fix incorrect output from " Jungseok Lee
2015-10-22 14:05 ` Jungseok Lee
2015-10-28 15:23 ` Will Deacon
2015-10-29 5:24 ` AKASHI Takahiro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1444298504-10392-6-git-send-email-takahiro.akashi@linaro.org \
--to=takahiro.akashi@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).