diff options
author | Joonsoo Kim <iamjoonsoo.kim@lge.com> | 2014-12-12 19:55:58 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-13 15:42:48 -0500 |
commit | 9a92a6ce6f842713ccd0025c5228fe8bea61234c (patch) | |
tree | 1377a03f1f21fa4dac44c46794cb56254ad29be2 /kernel/stacktrace.c | |
parent | dbc8358c72373daa4f37b7e233fecbc47105fe54 (diff) |
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: Joonsoo 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/stacktrace.c')
-rw-r--r-- | kernel/stacktrace.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/kernel/stacktrace.c b/kernel/stacktrace.c index 00fe55cc5a82..b6e4c16377c7 100644 --- a/kernel/stacktrace.c +++ b/kernel/stacktrace.c | |||
@@ -25,6 +25,38 @@ void print_stack_trace(struct stack_trace *trace, int spaces) | |||
25 | } | 25 | } |
26 | EXPORT_SYMBOL_GPL(print_stack_trace); | 26 | EXPORT_SYMBOL_GPL(print_stack_trace); |
27 | 27 | ||
28 | int snprint_stack_trace(char *buf, size_t size, | ||
29 | struct stack_trace *trace, int spaces) | ||
30 | { | ||
31 | int i; | ||
32 | unsigned long ip; | ||
33 | int generated; | ||
34 | int total = 0; | ||
35 | |||
36 | if (WARN_ON(!trace->entries)) | ||
37 | return 0; | ||
38 | |||
39 | for (i = 0; i < trace->nr_entries; i++) { | ||
40 | ip = trace->entries[i]; | ||
41 | generated = snprintf(buf, size, "%*c[<%p>] %pS\n", | ||
42 | 1 + spaces, ' ', (void *) ip, (void *) ip); | ||
43 | |||
44 | total += generated; | ||
45 | |||
46 | /* Assume that generated isn't a negative number */ | ||
47 | if (generated >= size) { | ||
48 | buf += size; | ||
49 | size = 0; | ||
50 | } else { | ||
51 | buf += generated; | ||
52 | size -= generated; | ||
53 | } | ||
54 | } | ||
55 | |||
56 | return total; | ||
57 | } | ||
58 | EXPORT_SYMBOL_GPL(snprint_stack_trace); | ||
59 | |||
28 | /* | 60 | /* |
29 | * Architectures that do not implement save_stack_trace_tsk or | 61 | * Architectures that do not implement save_stack_trace_tsk or |
30 | * save_stack_trace_regs get this weak alias and a once-per-bootup warning | 62 | * save_stack_trace_regs get this weak alias and a once-per-bootup warning |