aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/kernel.h
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-04-29 16:55:38 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-04-29 16:55:38 -0400
commit9e8529afc4518f4e5d610001545ebc97e1333c79 (patch)
tree26e1aa2cbb50f3f511cfa7d8e39e6b7bd9221b68 /include/linux/kernel.h
parentec25e246b94a3233ab064994ef05a170bdba0e7c (diff)
parent4c69e6ea415a35eb7f0fc8ee9390c8f7436492a2 (diff)
Merge tag 'trace-3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
Pull tracing updates from Steven Rostedt: "Along with the usual minor fixes and clean ups there are a few major changes with this pull request. 1) Multiple buffers for the ftrace facility This feature has been requested by many people over the last few years. I even heard that Google was about to implement it themselves. I finally had time and cleaned up the code such that you can now create multiple instances of the ftrace buffer and have different events go to different buffers. This way, a low frequency event will not be lost in the noise of a high frequency event. Note, currently only events can go to different buffers, the tracers (ie function, function_graph and the latency tracers) still can only be written to the main buffer. 2) The function tracer triggers have now been extended. The function tracer had two triggers. One to enable tracing when a function is hit, and one to disable tracing. Now you can record a stack trace on a single (or many) function(s), take a snapshot of the buffer (copy it to the snapshot buffer), and you can enable or disable an event to be traced when a function is hit. 3) A perf clock has been added. A "perf" clock can be chosen to be used when tracing. This will cause ftrace to use the same clock as perf uses, and hopefully this will make it easier to interleave the perf and ftrace data for analysis." * tag 'trace-3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (82 commits) tracepoints: Prevent null probe from being added tracing: Compare to 1 instead of zero for is_signed_type() tracing: Remove obsolete macro guard _TRACE_PROFILE_INIT ftrace: Get rid of ftrace_profile_bits tracing: Check return value of tracing_init_dentry() tracing: Get rid of unneeded key calculation in ftrace_hash_move() tracing: Reset ftrace_graph_filter_enabled if count is zero tracing: Fix off-by-one on allocating stat->pages kernel: tracing: Use strlcpy instead of strncpy tracing: Update debugfs README file tracing: Fix ftrace_dump() tracing: Rename trace_event_mutex to trace_event_sem tracing: Fix comment about prefix in arch_syscall_match_sym_name() tracing: Convert trace_destroy_fields() to static tracing: Move find_event_field() into trace_events.c tracing: Use TRACE_MAX_PRINT instead of constant tracing: Use pr_warn_once instead of open coded implementation ring-buffer: Add ring buffer startup selftest tracing: Bring Documentation/trace/ftrace.txt up to date tracing: Add "perf" trace_clock ... Conflicts: kernel/trace/ftrace.c kernel/trace/trace.c
Diffstat (limited to 'include/linux/kernel.h')
-rw-r--r--include/linux/kernel.h70
1 files changed, 67 insertions, 3 deletions
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 79fdd80a42d4..2dac79c39199 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -486,6 +486,8 @@ enum ftrace_dump_mode {
486void tracing_on(void); 486void tracing_on(void);
487void tracing_off(void); 487void tracing_off(void);
488int tracing_is_on(void); 488int tracing_is_on(void);
489void tracing_snapshot(void);
490void tracing_snapshot_alloc(void);
489 491
490extern void tracing_start(void); 492extern void tracing_start(void);
491extern void tracing_stop(void); 493extern void tracing_stop(void);
@@ -515,10 +517,32 @@ do { \
515 * 517 *
516 * This is intended as a debugging tool for the developer only. 518 * This is intended as a debugging tool for the developer only.
517 * Please refrain from leaving trace_printks scattered around in 519 * Please refrain from leaving trace_printks scattered around in
518 * your code. 520 * your code. (Extra memory is used for special buffers that are
521 * allocated when trace_printk() is used)
522 *
523 * A little optization trick is done here. If there's only one
524 * argument, there's no need to scan the string for printf formats.
525 * The trace_puts() will suffice. But how can we take advantage of
526 * using trace_puts() when trace_printk() has only one argument?
527 * By stringifying the args and checking the size we can tell
528 * whether or not there are args. __stringify((__VA_ARGS__)) will
529 * turn into "()\0" with a size of 3 when there are no args, anything
530 * else will be bigger. All we need to do is define a string to this,
531 * and then take its size and compare to 3. If it's bigger, use
532 * do_trace_printk() otherwise, optimize it to trace_puts(). Then just
533 * let gcc optimize the rest.
519 */ 534 */
520 535
521#define trace_printk(fmt, args...) \ 536#define trace_printk(fmt, ...) \
537do { \
538 char _______STR[] = __stringify((__VA_ARGS__)); \
539 if (sizeof(_______STR) > 3) \
540 do_trace_printk(fmt, ##__VA_ARGS__); \
541 else \
542 trace_puts(fmt); \
543} while (0)
544
545#define do_trace_printk(fmt, args...) \
522do { \ 546do { \
523 static const char *trace_printk_fmt \ 547 static const char *trace_printk_fmt \
524 __attribute__((section("__trace_printk_fmt"))) = \ 548 __attribute__((section("__trace_printk_fmt"))) = \
@@ -538,7 +562,45 @@ int __trace_bprintk(unsigned long ip, const char *fmt, ...);
538extern __printf(2, 3) 562extern __printf(2, 3)
539int __trace_printk(unsigned long ip, const char *fmt, ...); 563int __trace_printk(unsigned long ip, const char *fmt, ...);
540 564
541extern void trace_dump_stack(void); 565/**
566 * trace_puts - write a string into the ftrace buffer
567 * @str: the string to record
568 *
569 * Note: __trace_bputs is an internal function for trace_puts and
570 * the @ip is passed in via the trace_puts macro.
571 *
572 * This is similar to trace_printk() but is made for those really fast
573 * paths that a developer wants the least amount of "Heisenbug" affects,
574 * where the processing of the print format is still too much.
575 *
576 * This function allows a kernel developer to debug fast path sections
577 * that printk is not appropriate for. By scattering in various
578 * printk like tracing in the code, a developer can quickly see
579 * where problems are occurring.
580 *
581 * This is intended as a debugging tool for the developer only.
582 * Please refrain from leaving trace_puts scattered around in
583 * your code. (Extra memory is used for special buffers that are
584 * allocated when trace_puts() is used)
585 *
586 * Returns: 0 if nothing was written, positive # if string was.
587 * (1 when __trace_bputs is used, strlen(str) when __trace_puts is used)
588 */
589
590extern int __trace_bputs(unsigned long ip, const char *str);
591extern int __trace_puts(unsigned long ip, const char *str, int size);
592#define trace_puts(str) ({ \
593 static const char *trace_printk_fmt \
594 __attribute__((section("__trace_printk_fmt"))) = \
595 __builtin_constant_p(str) ? str : NULL; \
596 \
597 if (__builtin_constant_p(str)) \
598 __trace_bputs(_THIS_IP_, trace_printk_fmt); \
599 else \
600 __trace_puts(_THIS_IP_, str, strlen(str)); \
601})
602
603extern void trace_dump_stack(int skip);
542 604
543/* 605/*
544 * The double __builtin_constant_p is because gcc will give us an error 606 * The double __builtin_constant_p is because gcc will give us an error
@@ -573,6 +635,8 @@ static inline void trace_dump_stack(void) { }
573static inline void tracing_on(void) { } 635static inline void tracing_on(void) { }
574static inline void tracing_off(void) { } 636static inline void tracing_off(void) { }
575static inline int tracing_is_on(void) { return 0; } 637static inline int tracing_is_on(void) { return 0; }
638static inline void tracing_snapshot(void) { }
639static inline void tracing_snapshot_alloc(void) { }
576 640
577static inline __printf(1, 2) 641static inline __printf(1, 2)
578int trace_printk(const char *fmt, ...) 642int trace_printk(const char *fmt, ...)