Skip to content

Commit

Permalink
tracing: Remove the ULONG_MAX stack trace hackery
Browse files Browse the repository at this point in the history
No architecture terminates the stack trace with ULONG_MAX anymore. As the
code checks the number of entries stored anyway there is no point in
keeping all that ULONG_MAX magic around.

The histogram code zeroes the storage before saving the stack, so if the
trace is shorter than the maximum number of entries it can terminate the
print loop if a zero entry is detected.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Alexander Potapenko <glider@google.com>
Link: https://lkml.kernel.org/r/20190410103645.048761764@linutronix.de
  • Loading branch information
Thomas Gleixner committed Apr 14, 2019
1 parent fa49e2e commit 4285f2f
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 16 deletions.
2 changes: 1 addition & 1 deletion kernel/trace/trace_events_hist.c
Original file line number Diff line number Diff line change
Expand Up @@ -5246,7 +5246,7 @@ static void hist_trigger_stacktrace_print(struct seq_file *m,
unsigned int i;

for (i = 0; i < max_entries; i++) {
if (stacktrace_entries[i] == ULONG_MAX)
if (!stacktrace_entries[i])
return;

seq_printf(m, "%*c", 1 + spaces, ' ');
Expand Down
20 changes: 5 additions & 15 deletions kernel/trace/trace_stack.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@

#include "trace.h"

static unsigned long stack_dump_trace[STACK_TRACE_ENTRIES+1] =
{ [0 ... (STACK_TRACE_ENTRIES)] = ULONG_MAX };
static unsigned long stack_dump_trace[STACK_TRACE_ENTRIES + 1];
unsigned stack_trace_index[STACK_TRACE_ENTRIES];

/*
Expand Down Expand Up @@ -52,10 +51,7 @@ void stack_trace_print(void)
stack_trace_max.nr_entries);

for (i = 0; i < stack_trace_max.nr_entries; i++) {
if (stack_dump_trace[i] == ULONG_MAX)
break;
if (i+1 == stack_trace_max.nr_entries ||
stack_dump_trace[i+1] == ULONG_MAX)
if (i + 1 == stack_trace_max.nr_entries)
size = stack_trace_index[i];
else
size = stack_trace_index[i] - stack_trace_index[i+1];
Expand Down Expand Up @@ -150,8 +146,6 @@ check_stack(unsigned long ip, unsigned long *stack)
p = start;

for (; p < top && i < stack_trace_max.nr_entries; p++) {
if (stack_dump_trace[i] == ULONG_MAX)
break;
/*
* The READ_ONCE_NOCHECK is used to let KASAN know that
* this is not a stack-out-of-bounds error.
Expand Down Expand Up @@ -183,8 +177,6 @@ check_stack(unsigned long ip, unsigned long *stack)
}

stack_trace_max.nr_entries = x;
for (; x < i; x++)
stack_dump_trace[x] = ULONG_MAX;

if (task_stack_end_corrupted(current)) {
stack_trace_print();
Expand Down Expand Up @@ -286,7 +278,7 @@ __next(struct seq_file *m, loff_t *pos)
{
long n = *pos - 1;

if (n >= stack_trace_max.nr_entries || stack_dump_trace[n] == ULONG_MAX)
if (n >= stack_trace_max.nr_entries)
return NULL;

m->private = (void *)n;
Expand Down Expand Up @@ -360,12 +352,10 @@ static int t_show(struct seq_file *m, void *v)

i = *(long *)v;

if (i >= stack_trace_max.nr_entries ||
stack_dump_trace[i] == ULONG_MAX)
if (i >= stack_trace_max.nr_entries)
return 0;

if (i+1 == stack_trace_max.nr_entries ||
stack_dump_trace[i+1] == ULONG_MAX)
if (i + 1 == stack_trace_max.nr_entries)
size = stack_trace_index[i];
else
size = stack_trace_index[i] - stack_trace_index[i+1];
Expand Down

0 comments on commit 4285f2f

Please sign in to comment.