Commit 9a92a6ce authored by Joonsoo Kim's avatar Joonsoo Kim Committed by Linus Torvalds

stacktrace: introduce snprint_stack_trace for buffer output

Current stacktrace only have the function for console output.  page_owner
that will be introduced in following patch needs to print the output of
stacktrace into the buffer for our own output format so so new function,
snprint_stack_trace(), is needed.
Signed-off-by: default avatarJoonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Dave Hansen <dave@sr71.net>
Cc: Michal Nazarewicz <mina86@mina86.com>
Cc: Jungsoo Son <jungsoo.son@lge.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent dbc8358c
#ifndef __LINUX_STACKTRACE_H #ifndef __LINUX_STACKTRACE_H
#define __LINUX_STACKTRACE_H #define __LINUX_STACKTRACE_H
#include <linux/types.h>
struct task_struct; struct task_struct;
struct pt_regs; struct pt_regs;
...@@ -20,6 +22,8 @@ extern void save_stack_trace_tsk(struct task_struct *tsk, ...@@ -20,6 +22,8 @@ extern void save_stack_trace_tsk(struct task_struct *tsk,
struct stack_trace *trace); struct stack_trace *trace);
extern void print_stack_trace(struct stack_trace *trace, int spaces); extern void print_stack_trace(struct stack_trace *trace, int spaces);
extern int snprint_stack_trace(char *buf, size_t size,
struct stack_trace *trace, int spaces);
#ifdef CONFIG_USER_STACKTRACE_SUPPORT #ifdef CONFIG_USER_STACKTRACE_SUPPORT
extern void save_stack_trace_user(struct stack_trace *trace); extern void save_stack_trace_user(struct stack_trace *trace);
...@@ -32,6 +36,7 @@ extern void save_stack_trace_user(struct stack_trace *trace); ...@@ -32,6 +36,7 @@ extern void save_stack_trace_user(struct stack_trace *trace);
# define save_stack_trace_tsk(tsk, trace) do { } while (0) # define save_stack_trace_tsk(tsk, trace) do { } while (0)
# define save_stack_trace_user(trace) do { } while (0) # define save_stack_trace_user(trace) do { } while (0)
# define print_stack_trace(trace, spaces) do { } while (0) # define print_stack_trace(trace, spaces) do { } while (0)
# define snprint_stack_trace(buf, size, trace, spaces) do { } while (0)
#endif #endif
#endif #endif
...@@ -25,6 +25,38 @@ void print_stack_trace(struct stack_trace *trace, int spaces) ...@@ -25,6 +25,38 @@ void print_stack_trace(struct stack_trace *trace, int spaces)
} }
EXPORT_SYMBOL_GPL(print_stack_trace); EXPORT_SYMBOL_GPL(print_stack_trace);
int snprint_stack_trace(char *buf, size_t size,
struct stack_trace *trace, int spaces)
{
int i;
unsigned long ip;
int generated;
int total = 0;
if (WARN_ON(!trace->entries))
return 0;
for (i = 0; i < trace->nr_entries; i++) {
ip = trace->entries[i];
generated = snprintf(buf, size, "%*c[<%p>] %pS\n",
1 + spaces, ' ', (void *) ip, (void *) ip);
total += generated;
/* Assume that generated isn't a negative number */
if (generated >= size) {
buf += size;
size = 0;
} else {
buf += generated;
size -= generated;
}
}
return total;
}
EXPORT_SYMBOL_GPL(snprint_stack_trace);
/* /*
* Architectures that do not implement save_stack_trace_tsk or * Architectures that do not implement save_stack_trace_tsk or
* save_stack_trace_regs get this weak alias and a once-per-bootup warning * save_stack_trace_regs get this weak alias and a once-per-bootup warning
......
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