diff options
Diffstat (limited to 'kernel/trace/trace.h')
-rw-r--r-- | kernel/trace/trace.h | 61 |
1 files changed, 45 insertions, 16 deletions
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 229f8591f61d..3f381d0b20a8 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
@@ -278,6 +278,29 @@ struct tracer { | |||
278 | }; | 278 | }; |
279 | 279 | ||
280 | 280 | ||
281 | /* Only current can touch trace_recursion */ | ||
282 | #define trace_recursion_inc() do { (current)->trace_recursion++; } while (0) | ||
283 | #define trace_recursion_dec() do { (current)->trace_recursion--; } while (0) | ||
284 | |||
285 | /* Ring buffer has the 10 LSB bits to count */ | ||
286 | #define trace_recursion_buffer() ((current)->trace_recursion & 0x3ff) | ||
287 | |||
288 | /* for function tracing recursion */ | ||
289 | #define TRACE_INTERNAL_BIT (1<<11) | ||
290 | #define TRACE_GLOBAL_BIT (1<<12) | ||
291 | /* | ||
292 | * Abuse of the trace_recursion. | ||
293 | * As we need a way to maintain state if we are tracing the function | ||
294 | * graph in irq because we want to trace a particular function that | ||
295 | * was called in irq context but we have irq tracing off. Since this | ||
296 | * can only be modified by current, we can reuse trace_recursion. | ||
297 | */ | ||
298 | #define TRACE_IRQ_BIT (1<<13) | ||
299 | |||
300 | #define trace_recursion_set(bit) do { (current)->trace_recursion |= (bit); } while (0) | ||
301 | #define trace_recursion_clear(bit) do { (current)->trace_recursion &= ~(bit); } while (0) | ||
302 | #define trace_recursion_test(bit) ((current)->trace_recursion & (bit)) | ||
303 | |||
281 | #define TRACE_PIPE_ALL_CPU -1 | 304 | #define TRACE_PIPE_ALL_CPU -1 |
282 | 305 | ||
283 | int tracer_init(struct tracer *t, struct trace_array *tr); | 306 | int tracer_init(struct tracer *t, struct trace_array *tr); |
@@ -389,6 +412,9 @@ void update_max_tr_single(struct trace_array *tr, | |||
389 | void ftrace_trace_stack(struct ring_buffer *buffer, unsigned long flags, | 412 | void ftrace_trace_stack(struct ring_buffer *buffer, unsigned long flags, |
390 | int skip, int pc); | 413 | int skip, int pc); |
391 | 414 | ||
415 | void ftrace_trace_stack_regs(struct ring_buffer *buffer, unsigned long flags, | ||
416 | int skip, int pc, struct pt_regs *regs); | ||
417 | |||
392 | void ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, | 418 | void ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, |
393 | int pc); | 419 | int pc); |
394 | 420 | ||
@@ -400,6 +426,12 @@ static inline void ftrace_trace_stack(struct ring_buffer *buffer, | |||
400 | { | 426 | { |
401 | } | 427 | } |
402 | 428 | ||
429 | static inline void ftrace_trace_stack_regs(struct ring_buffer *buffer, | ||
430 | unsigned long flags, int skip, | ||
431 | int pc, struct pt_regs *regs) | ||
432 | { | ||
433 | } | ||
434 | |||
403 | static inline void ftrace_trace_userstack(struct ring_buffer *buffer, | 435 | static inline void ftrace_trace_userstack(struct ring_buffer *buffer, |
404 | unsigned long flags, int pc) | 436 | unsigned long flags, int pc) |
405 | { | 437 | { |
@@ -507,8 +539,18 @@ static inline int ftrace_graph_addr(unsigned long addr) | |||
507 | return 1; | 539 | return 1; |
508 | 540 | ||
509 | for (i = 0; i < ftrace_graph_count; i++) { | 541 | for (i = 0; i < ftrace_graph_count; i++) { |
510 | if (addr == ftrace_graph_funcs[i]) | 542 | if (addr == ftrace_graph_funcs[i]) { |
543 | /* | ||
544 | * If no irqs are to be traced, but a set_graph_function | ||
545 | * is set, and called by an interrupt handler, we still | ||
546 | * want to trace it. | ||
547 | */ | ||
548 | if (in_irq()) | ||
549 | trace_recursion_set(TRACE_IRQ_BIT); | ||
550 | else | ||
551 | trace_recursion_clear(TRACE_IRQ_BIT); | ||
511 | return 1; | 552 | return 1; |
553 | } | ||
512 | } | 554 | } |
513 | 555 | ||
514 | return 0; | 556 | return 0; |
@@ -609,6 +651,7 @@ enum trace_iterator_flags { | |||
609 | TRACE_ITER_GRAPH_TIME = 0x80000, | 651 | TRACE_ITER_GRAPH_TIME = 0x80000, |
610 | TRACE_ITER_RECORD_CMD = 0x100000, | 652 | TRACE_ITER_RECORD_CMD = 0x100000, |
611 | TRACE_ITER_OVERWRITE = 0x200000, | 653 | TRACE_ITER_OVERWRITE = 0x200000, |
654 | TRACE_ITER_STOP_ON_FREE = 0x400000, | ||
612 | }; | 655 | }; |
613 | 656 | ||
614 | /* | 657 | /* |
@@ -677,6 +720,7 @@ struct event_subsystem { | |||
677 | struct dentry *entry; | 720 | struct dentry *entry; |
678 | struct event_filter *filter; | 721 | struct event_filter *filter; |
679 | int nr_events; | 722 | int nr_events; |
723 | int ref_count; | ||
680 | }; | 724 | }; |
681 | 725 | ||
682 | #define FILTER_PRED_INVALID ((unsigned short)-1) | 726 | #define FILTER_PRED_INVALID ((unsigned short)-1) |
@@ -784,19 +828,4 @@ extern const char *__stop___trace_bprintk_fmt[]; | |||
784 | FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print)) | 828 | FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print)) |
785 | #include "trace_entries.h" | 829 | #include "trace_entries.h" |
786 | 830 | ||
787 | /* Only current can touch trace_recursion */ | ||
788 | #define trace_recursion_inc() do { (current)->trace_recursion++; } while (0) | ||
789 | #define trace_recursion_dec() do { (current)->trace_recursion--; } while (0) | ||
790 | |||
791 | /* Ring buffer has the 10 LSB bits to count */ | ||
792 | #define trace_recursion_buffer() ((current)->trace_recursion & 0x3ff) | ||
793 | |||
794 | /* for function tracing recursion */ | ||
795 | #define TRACE_INTERNAL_BIT (1<<11) | ||
796 | #define TRACE_GLOBAL_BIT (1<<12) | ||
797 | |||
798 | #define trace_recursion_set(bit) do { (current)->trace_recursion |= (bit); } while (0) | ||
799 | #define trace_recursion_clear(bit) do { (current)->trace_recursion &= ~(bit); } while (0) | ||
800 | #define trace_recursion_test(bit) ((current)->trace_recursion & (bit)) | ||
801 | |||
802 | #endif /* _LINUX_KERNEL_TRACE_H */ | 831 | #endif /* _LINUX_KERNEL_TRACE_H */ |