Commit 87889501 authored by Steven Rostedt (Red Hat)'s avatar Steven Rostedt (Red Hat) Committed by Steven Rostedt

tracing: Use stack of calling function for stack tracer

Use the stack of stack_trace_call() instead of check_stack() as
the test pointer for max stack size. It makes it a bit cleaner
and a little more accurate.

Adding stable, as a later fix depends on this patch.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent dd42cd3e
...@@ -39,20 +39,21 @@ static DEFINE_MUTEX(stack_sysctl_mutex); ...@@ -39,20 +39,21 @@ static DEFINE_MUTEX(stack_sysctl_mutex);
int stack_tracer_enabled; int stack_tracer_enabled;
static int last_stack_tracer_enabled; static int last_stack_tracer_enabled;
static inline void check_stack(void) static inline void
check_stack(unsigned long *stack)
{ {
unsigned long this_size, flags; unsigned long this_size, flags;
unsigned long *p, *top, *start; unsigned long *p, *top, *start;
int i; int i;
this_size = ((unsigned long)&this_size) & (THREAD_SIZE-1); this_size = ((unsigned long)stack) & (THREAD_SIZE-1);
this_size = THREAD_SIZE - this_size; this_size = THREAD_SIZE - this_size;
if (this_size <= max_stack_size) if (this_size <= max_stack_size)
return; return;
/* we do not handle interrupt stacks yet */ /* we do not handle interrupt stacks yet */
if (!object_is_on_stack(&this_size)) if (!object_is_on_stack(stack))
return; return;
local_irq_save(flags); local_irq_save(flags);
...@@ -73,7 +74,7 @@ static inline void check_stack(void) ...@@ -73,7 +74,7 @@ static inline void check_stack(void)
* Now find where in the stack these are. * Now find where in the stack these are.
*/ */
i = 0; i = 0;
start = &this_size; start = stack;
top = (unsigned long *) top = (unsigned long *)
(((unsigned long)start & ~(THREAD_SIZE-1)) + THREAD_SIZE); (((unsigned long)start & ~(THREAD_SIZE-1)) + THREAD_SIZE);
...@@ -113,6 +114,7 @@ static void ...@@ -113,6 +114,7 @@ static void
stack_trace_call(unsigned long ip, unsigned long parent_ip, stack_trace_call(unsigned long ip, unsigned long parent_ip,
struct ftrace_ops *op, struct pt_regs *pt_regs) struct ftrace_ops *op, struct pt_regs *pt_regs)
{ {
unsigned long stack;
int cpu; int cpu;
preempt_disable_notrace(); preempt_disable_notrace();
...@@ -122,7 +124,7 @@ stack_trace_call(unsigned long ip, unsigned long parent_ip, ...@@ -122,7 +124,7 @@ stack_trace_call(unsigned long ip, unsigned long parent_ip,
if (per_cpu(trace_active, cpu)++ != 0) if (per_cpu(trace_active, cpu)++ != 0)
goto out; goto out;
check_stack(); check_stack(&stack);
out: out:
per_cpu(trace_active, cpu)--; per_cpu(trace_active, cpu)--;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment