diff options
| author | Takashi Iwai <tiwai@suse.de> | 2011-08-08 08:30:29 -0400 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2011-08-08 08:30:29 -0400 |
| commit | 0a2d31b62dba9b5b92a38c67c9cc42630513662a (patch) | |
| tree | f755d74ec85248de645e10c45ed1a2ed467530f6 /kernel/trace/trace.h | |
| parent | 8039290a91c5dc4414093c086987a5d7738fe2fd (diff) | |
| parent | df944f66784e6d4f2f50739263a4947885d8b6ae (diff) | |
Merge branch 'fix/kconfig' into for-linus
Diffstat (limited to 'kernel/trace/trace.h')
| -rw-r--r-- | kernel/trace/trace.h | 63 |
1 files changed, 46 insertions, 17 deletions
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 229f8591f61d..616846bcfee5 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | #define _LINUX_KERNEL_TRACE_H | 2 | #define _LINUX_KERNEL_TRACE_H |
| 3 | 3 | ||
| 4 | #include <linux/fs.h> | 4 | #include <linux/fs.h> |
| 5 | #include <asm/atomic.h> | 5 | #include <linux/atomic.h> |
| 6 | #include <linux/sched.h> | 6 | #include <linux/sched.h> |
| 7 | #include <linux/clocksource.h> | 7 | #include <linux/clocksource.h> |
| 8 | #include <linux/ring_buffer.h> | 8 | #include <linux/ring_buffer.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 */ |
