tracing: Allow arch-specific stack tracer
[linux-2.6-block.git] / kernel / trace / trace_stack.c
CommitLineData
e5a81b62
SR
1/*
2 * Copyright (C) 2008 Steven Rostedt <srostedt@redhat.com>
3 *
4 */
5#include <linux/stacktrace.h>
6#include <linux/kallsyms.h>
7#include <linux/seq_file.h>
8#include <linux/spinlock.h>
9#include <linux/uaccess.h>
e5a81b62
SR
10#include <linux/ftrace.h>
11#include <linux/module.h>
f38f1d2a 12#include <linux/sysctl.h>
e5a81b62 13#include <linux/init.h>
762e1207
SR
14
15#include <asm/setup.h>
16
e5a81b62
SR
17#include "trace.h"
18
1b6cced6
SR
19static unsigned long stack_dump_trace[STACK_TRACE_ENTRIES+1] =
20 { [0 ... (STACK_TRACE_ENTRIES)] = ULONG_MAX };
bb99d8cc 21unsigned stack_trace_index[STACK_TRACE_ENTRIES];
1b6cced6 22
4df29712
SRRH
23/*
24 * Reserve one entry for the passed in ip. This will allow
25 * us to remove most or all of the stack size overhead
26 * added by the stack tracer itself.
27 */
bb99d8cc 28struct stack_trace stack_trace_max = {
4df29712 29 .max_entries = STACK_TRACE_ENTRIES - 1,
72ac426a 30 .entries = &stack_dump_trace[0],
e5a81b62
SR
31};
32
bb99d8cc
AT
33unsigned long stack_trace_max_size;
34arch_spinlock_t max_stack_lock =
edc35bd7 35 (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED;
e5a81b62 36
e5a81b62 37static DEFINE_PER_CPU(int, trace_active);
f38f1d2a
SR
38static DEFINE_MUTEX(stack_sysctl_mutex);
39
40int stack_tracer_enabled;
41static int last_stack_tracer_enabled;
e5a81b62 42
bb99d8cc 43void stack_trace_print(void)
e3172181
MK
44{
45 long i;
46 int size;
47
48 pr_emerg(" Depth Size Location (%d entries)\n"
49 " ----- ---- --------\n",
bb99d8cc 50 stack_trace_max.nr_entries);
e3172181 51
bb99d8cc 52 for (i = 0; i < stack_trace_max.nr_entries; i++) {
e3172181
MK
53 if (stack_dump_trace[i] == ULONG_MAX)
54 break;
bb99d8cc 55 if (i+1 == stack_trace_max.nr_entries ||
e3172181 56 stack_dump_trace[i+1] == ULONG_MAX)
bb99d8cc 57 size = stack_trace_index[i];
e3172181 58 else
bb99d8cc 59 size = stack_trace_index[i] - stack_trace_index[i+1];
e3172181 60
bb99d8cc 61 pr_emerg("%3ld) %8d %5d %pS\n", i, stack_trace_index[i],
e3172181
MK
62 size, (void *)stack_dump_trace[i]);
63 }
64}
65
bb99d8cc
AT
66/*
67 * When arch-specific code overides this function, the following
68 * data should be filled up, assuming max_stack_lock is held to
69 * prevent concurrent updates.
70 * stack_trace_index[]
71 * stack_trace_max
72 * stack_trace_max_size
73 */
74void __weak
d4ecbfc4 75check_stack(unsigned long ip, unsigned long *stack)
e5a81b62 76{
e3172181 77 unsigned long this_size, flags; unsigned long *p, *top, *start;
4df29712
SRRH
78 static int tracer_frame;
79 int frame_size = ACCESS_ONCE(tracer_frame);
72ac426a 80 int i, x;
e5a81b62 81
87889501 82 this_size = ((unsigned long)stack) & (THREAD_SIZE-1);
e5a81b62 83 this_size = THREAD_SIZE - this_size;
4df29712
SRRH
84 /* Remove the frame of the tracer */
85 this_size -= frame_size;
e5a81b62 86
bb99d8cc 87 if (this_size <= stack_trace_max_size)
e5a81b62
SR
88 return;
89
81520a1b 90 /* we do not handle interrupt stacks yet */
87889501 91 if (!object_is_on_stack(stack))
81520a1b
SR
92 return;
93
a5e25883 94 local_irq_save(flags);
0199c4e6 95 arch_spin_lock(&max_stack_lock);
e5a81b62 96
4df29712
SRRH
97 /* In case another CPU set the tracer_frame on us */
98 if (unlikely(!frame_size))
99 this_size -= tracer_frame;
100
e5a81b62 101 /* a race could have already updated it */
bb99d8cc 102 if (this_size <= stack_trace_max_size)
e5a81b62
SR
103 goto out;
104
bb99d8cc 105 stack_trace_max_size = this_size;
e5a81b62 106
bb99d8cc
AT
107 stack_trace_max.nr_entries = 0;
108 stack_trace_max.skip = 3;
e5a81b62 109
bb99d8cc 110 save_stack_trace(&stack_trace_max);
e5a81b62 111
72ac426a 112 /* Skip over the overhead of the stack tracer itself */
bb99d8cc 113 for (i = 0; i < stack_trace_max.nr_entries; i++) {
72ac426a
SRRH
114 if (stack_dump_trace[i] == ip)
115 break;
116 }
d4ecbfc4 117
1b6cced6
SR
118 /*
119 * Now find where in the stack these are.
120 */
72ac426a 121 x = 0;
87889501 122 start = stack;
1b6cced6
SR
123 top = (unsigned long *)
124 (((unsigned long)start & ~(THREAD_SIZE-1)) + THREAD_SIZE);
125
126 /*
127 * Loop through all the entries. One of the entries may
128 * for some reason be missed on the stack, so we may
129 * have to account for them. If they are all there, this
130 * loop will only happen once. This code only takes place
131 * on a new max, so it is far from a fast path.
132 */
bb99d8cc 133 while (i < stack_trace_max.nr_entries) {
0a37119d 134 int found = 0;
1b6cced6 135
bb99d8cc 136 stack_trace_index[x] = this_size;
1b6cced6
SR
137 p = start;
138
bb99d8cc 139 for (; p < top && i < stack_trace_max.nr_entries; p++) {
72ac426a
SRRH
140 if (stack_dump_trace[i] == ULONG_MAX)
141 break;
1b6cced6 142 if (*p == stack_dump_trace[i]) {
72ac426a 143 stack_dump_trace[x] = stack_dump_trace[i++];
bb99d8cc 144 this_size = stack_trace_index[x++] =
1b6cced6 145 (top - p) * sizeof(unsigned long);
0a37119d 146 found = 1;
1b6cced6
SR
147 /* Start the search from here */
148 start = p + 1;
4df29712
SRRH
149 /*
150 * We do not want to show the overhead
151 * of the stack tracer stack in the
152 * max stack. If we haven't figured
153 * out what that is, then figure it out
154 * now.
155 */
72ac426a 156 if (unlikely(!tracer_frame)) {
4df29712
SRRH
157 tracer_frame = (p - stack) *
158 sizeof(unsigned long);
bb99d8cc 159 stack_trace_max_size -= tracer_frame;
4df29712 160 }
1b6cced6
SR
161 }
162 }
163
0a37119d
SR
164 if (!found)
165 i++;
1b6cced6
SR
166 }
167
bb99d8cc 168 stack_trace_max.nr_entries = x;
72ac426a
SRRH
169 for (; x < i; x++)
170 stack_dump_trace[x] = ULONG_MAX;
171
a70857e4 172 if (task_stack_end_corrupted(current)) {
bb99d8cc 173 stack_trace_print();
e3172181
MK
174 BUG();
175 }
176
e5a81b62 177 out:
0199c4e6 178 arch_spin_unlock(&max_stack_lock);
a5e25883 179 local_irq_restore(flags);
e5a81b62
SR
180}
181
182static void
a1e2e31d
SR
183stack_trace_call(unsigned long ip, unsigned long parent_ip,
184 struct ftrace_ops *op, struct pt_regs *pt_regs)
e5a81b62 185{
87889501 186 unsigned long stack;
5168ae50 187 int cpu;
e5a81b62 188
5168ae50 189 preempt_disable_notrace();
e5a81b62
SR
190
191 cpu = raw_smp_processor_id();
192 /* no atomic needed, we only modify this variable by this cpu */
193 if (per_cpu(trace_active, cpu)++ != 0)
194 goto out;
195
72ac426a 196 ip += MCOUNT_INSN_SIZE;
4df29712
SRRH
197
198 check_stack(ip, &stack);
e5a81b62
SR
199
200 out:
201 per_cpu(trace_active, cpu)--;
202 /* prevent recursion in schedule */
5168ae50 203 preempt_enable_notrace();
e5a81b62
SR
204}
205
206static struct ftrace_ops trace_ops __read_mostly =
207{
208 .func = stack_trace_call,
4740974a 209 .flags = FTRACE_OPS_FL_RECURSION_SAFE,
e5a81b62
SR
210};
211
212static ssize_t
213stack_max_size_read(struct file *filp, char __user *ubuf,
214 size_t count, loff_t *ppos)
215{
216 unsigned long *ptr = filp->private_data;
217 char buf[64];
218 int r;
219
220 r = snprintf(buf, sizeof(buf), "%ld\n", *ptr);
221 if (r > sizeof(buf))
222 r = sizeof(buf);
223 return simple_read_from_buffer(ubuf, count, ppos, buf, r);
224}
225
226static ssize_t
227stack_max_size_write(struct file *filp, const char __user *ubuf,
228 size_t count, loff_t *ppos)
229{
230 long *ptr = filp->private_data;
231 unsigned long val, flags;
e5a81b62 232 int ret;
4f48f8b7 233 int cpu;
e5a81b62 234
22fe9b54
PH
235 ret = kstrtoul_from_user(ubuf, count, 10, &val);
236 if (ret)
e5a81b62
SR
237 return ret;
238
a5e25883 239 local_irq_save(flags);
4f48f8b7
LJ
240
241 /*
242 * In case we trace inside arch_spin_lock() or after (NMI),
243 * we will cause circular lock, so we also need to increase
244 * the percpu trace_active here.
245 */
246 cpu = smp_processor_id();
247 per_cpu(trace_active, cpu)++;
248
0199c4e6 249 arch_spin_lock(&max_stack_lock);
e5a81b62 250 *ptr = val;
0199c4e6 251 arch_spin_unlock(&max_stack_lock);
4f48f8b7
LJ
252
253 per_cpu(trace_active, cpu)--;
a5e25883 254 local_irq_restore(flags);
e5a81b62
SR
255
256 return count;
257}
258
f38f1d2a 259static const struct file_operations stack_max_size_fops = {
e5a81b62
SR
260 .open = tracing_open_generic,
261 .read = stack_max_size_read,
262 .write = stack_max_size_write,
6038f373 263 .llseek = default_llseek,
e5a81b62
SR
264};
265
266static void *
2fc5f0cf 267__next(struct seq_file *m, loff_t *pos)
e5a81b62 268{
2fc5f0cf 269 long n = *pos - 1;
e5a81b62 270
bb99d8cc 271 if (n > stack_trace_max.nr_entries || stack_dump_trace[n] == ULONG_MAX)
e5a81b62
SR
272 return NULL;
273
2fc5f0cf 274 m->private = (void *)n;
1b6cced6 275 return &m->private;
e5a81b62
SR
276}
277
2fc5f0cf
LZ
278static void *
279t_next(struct seq_file *m, void *v, loff_t *pos)
e5a81b62 280{
2fc5f0cf
LZ
281 (*pos)++;
282 return __next(m, pos);
283}
e5a81b62 284
2fc5f0cf
LZ
285static void *t_start(struct seq_file *m, loff_t *pos)
286{
4f48f8b7
LJ
287 int cpu;
288
e5a81b62 289 local_irq_disable();
4f48f8b7
LJ
290
291 cpu = smp_processor_id();
292 per_cpu(trace_active, cpu)++;
293
0199c4e6 294 arch_spin_lock(&max_stack_lock);
e5a81b62 295
522a110b
LW
296 if (*pos == 0)
297 return SEQ_START_TOKEN;
298
2fc5f0cf 299 return __next(m, pos);
e5a81b62
SR
300}
301
302static void t_stop(struct seq_file *m, void *p)
303{
4f48f8b7
LJ
304 int cpu;
305
0199c4e6 306 arch_spin_unlock(&max_stack_lock);
4f48f8b7
LJ
307
308 cpu = smp_processor_id();
309 per_cpu(trace_active, cpu)--;
310
e5a81b62
SR
311 local_irq_enable();
312}
313
962e3707 314static void trace_lookup_stack(struct seq_file *m, long i)
e5a81b62 315{
1b6cced6 316 unsigned long addr = stack_dump_trace[i];
e5a81b62 317
962e3707 318 seq_printf(m, "%pS\n", (void *)addr);
e5a81b62
SR
319}
320
e447e1df
SR
321static void print_disabled(struct seq_file *m)
322{
323 seq_puts(m, "#\n"
324 "# Stack tracer disabled\n"
325 "#\n"
326 "# To enable the stack tracer, either add 'stacktrace' to the\n"
327 "# kernel command line\n"
328 "# or 'echo 1 > /proc/sys/kernel/stack_tracer_enabled'\n"
329 "#\n");
330}
331
e5a81b62
SR
332static int t_show(struct seq_file *m, void *v)
333{
522a110b 334 long i;
1b6cced6
SR
335 int size;
336
522a110b 337 if (v == SEQ_START_TOKEN) {
eb1871f3 338 seq_printf(m, " Depth Size Location"
1b6cced6 339 " (%d entries)\n"
eb1871f3 340 " ----- ---- --------\n",
bb99d8cc 341 stack_trace_max.nr_entries);
e447e1df 342
bb99d8cc 343 if (!stack_tracer_enabled && !stack_trace_max_size)
e447e1df
SR
344 print_disabled(m);
345
1b6cced6
SR
346 return 0;
347 }
e5a81b62 348
522a110b
LW
349 i = *(long *)v;
350
bb99d8cc 351 if (i >= stack_trace_max.nr_entries ||
1b6cced6 352 stack_dump_trace[i] == ULONG_MAX)
e5a81b62
SR
353 return 0;
354
bb99d8cc 355 if (i+1 == stack_trace_max.nr_entries ||
1b6cced6 356 stack_dump_trace[i+1] == ULONG_MAX)
bb99d8cc 357 size = stack_trace_index[i];
1b6cced6 358 else
bb99d8cc 359 size = stack_trace_index[i] - stack_trace_index[i+1];
1b6cced6 360
bb99d8cc 361 seq_printf(m, "%3ld) %8d %5d ", i, stack_trace_index[i], size);
1b6cced6
SR
362
363 trace_lookup_stack(m, i);
e5a81b62
SR
364
365 return 0;
366}
367
f38f1d2a 368static const struct seq_operations stack_trace_seq_ops = {
e5a81b62
SR
369 .start = t_start,
370 .next = t_next,
371 .stop = t_stop,
372 .show = t_show,
373};
374
375static int stack_trace_open(struct inode *inode, struct file *file)
376{
d8cc1ab7 377 return seq_open(file, &stack_trace_seq_ops);
e5a81b62
SR
378}
379
f38f1d2a 380static const struct file_operations stack_trace_fops = {
e5a81b62
SR
381 .open = stack_trace_open,
382 .read = seq_read,
383 .llseek = seq_lseek,
d8cc1ab7 384 .release = seq_release,
e5a81b62
SR
385};
386
d2d45c7a
SR
387static int
388stack_trace_filter_open(struct inode *inode, struct file *file)
389{
390 return ftrace_regex_open(&trace_ops, FTRACE_ITER_FILTER,
391 inode, file);
392}
393
394static const struct file_operations stack_trace_filter_fops = {
395 .open = stack_trace_filter_open,
396 .read = seq_read,
397 .write = ftrace_filter_write,
098c879e 398 .llseek = tracing_lseek,
d2d45c7a
SR
399 .release = ftrace_regex_release,
400};
401
f38f1d2a
SR
402int
403stack_trace_sysctl(struct ctl_table *table, int write,
8d65af78 404 void __user *buffer, size_t *lenp,
f38f1d2a
SR
405 loff_t *ppos)
406{
407 int ret;
408
409 mutex_lock(&stack_sysctl_mutex);
410
8d65af78 411 ret = proc_dointvec(table, write, buffer, lenp, ppos);
f38f1d2a
SR
412
413 if (ret || !write ||
a32c7765 414 (last_stack_tracer_enabled == !!stack_tracer_enabled))
f38f1d2a
SR
415 goto out;
416
a32c7765 417 last_stack_tracer_enabled = !!stack_tracer_enabled;
f38f1d2a
SR
418
419 if (stack_tracer_enabled)
420 register_ftrace_function(&trace_ops);
421 else
422 unregister_ftrace_function(&trace_ops);
423
424 out:
425 mutex_unlock(&stack_sysctl_mutex);
426 return ret;
427}
428
762e1207
SR
429static char stack_trace_filter_buf[COMMAND_LINE_SIZE+1] __initdata;
430
f38f1d2a
SR
431static __init int enable_stacktrace(char *str)
432{
762e1207
SR
433 if (strncmp(str, "_filter=", 8) == 0)
434 strncpy(stack_trace_filter_buf, str+8, COMMAND_LINE_SIZE);
435
e05a43b7
SR
436 stack_tracer_enabled = 1;
437 last_stack_tracer_enabled = 1;
f38f1d2a
SR
438 return 1;
439}
440__setup("stacktrace", enable_stacktrace);
441
e5a81b62
SR
442static __init int stack_trace_init(void)
443{
444 struct dentry *d_tracer;
e5a81b62
SR
445
446 d_tracer = tracing_init_dentry();
14a5ae40 447 if (IS_ERR(d_tracer))
ed6f1c99 448 return 0;
e5a81b62 449
5452af66 450 trace_create_file("stack_max_size", 0644, d_tracer,
bb99d8cc 451 &stack_trace_max_size, &stack_max_size_fops);
e5a81b62 452
5452af66
FW
453 trace_create_file("stack_trace", 0444, d_tracer,
454 NULL, &stack_trace_fops);
e5a81b62 455
d2d45c7a
SR
456 trace_create_file("stack_trace_filter", 0444, d_tracer,
457 NULL, &stack_trace_filter_fops);
458
762e1207
SR
459 if (stack_trace_filter_buf[0])
460 ftrace_set_early_filter(&trace_ops, stack_trace_filter_buf, 1);
461
e05a43b7 462 if (stack_tracer_enabled)
f38f1d2a 463 register_ftrace_function(&trace_ops);
e5a81b62
SR
464
465 return 0;
466}
467
468device_initcall(stack_trace_init);