aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
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
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')
-rw-r--r--include/linux/ftrace.h6
-rw-r--r--include/linux/ftrace_event.h111
-rw-r--r--include/linux/kernel.h70
-rw-r--r--include/linux/ring_buffer.h6
-rw-r--r--include/linux/trace_clock.h1
5 files changed, 163 insertions, 31 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index 52da2a250795..f83e17a40e8b 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -261,8 +261,10 @@ struct ftrace_probe_ops {
261 void (*func)(unsigned long ip, 261 void (*func)(unsigned long ip,
262 unsigned long parent_ip, 262 unsigned long parent_ip,
263 void **data); 263 void **data);
264 int (*callback)(unsigned long ip, void **data); 264 int (*init)(struct ftrace_probe_ops *ops,
265 void (*free)(void **data); 265 unsigned long ip, void **data);
266 void (*free)(struct ftrace_probe_ops *ops,
267 unsigned long ip, void **data);
266 int (*print)(struct seq_file *m, 268 int (*print)(struct seq_file *m,
267 unsigned long ip, 269 unsigned long ip,
268 struct ftrace_probe_ops *ops, 270 struct ftrace_probe_ops *ops,
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h
index 13a54d0bdfa8..34e00fb49bec 100644
--- a/include/linux/ftrace_event.h
+++ b/include/linux/ftrace_event.h
@@ -8,6 +8,7 @@
8#include <linux/perf_event.h> 8#include <linux/perf_event.h>
9 9
10struct trace_array; 10struct trace_array;
11struct trace_buffer;
11struct tracer; 12struct tracer;
12struct dentry; 13struct dentry;
13 14
@@ -38,6 +39,12 @@ const char *ftrace_print_symbols_seq_u64(struct trace_seq *p,
38const char *ftrace_print_hex_seq(struct trace_seq *p, 39const char *ftrace_print_hex_seq(struct trace_seq *p,
39 const unsigned char *buf, int len); 40 const unsigned char *buf, int len);
40 41
42struct trace_iterator;
43struct trace_event;
44
45int ftrace_raw_output_prep(struct trace_iterator *iter,
46 struct trace_event *event);
47
41/* 48/*
42 * The trace entry - the most basic unit of tracing. This is what 49 * The trace entry - the most basic unit of tracing. This is what
43 * is printed in the end as a single line in the trace output, such as: 50 * is printed in the end as a single line in the trace output, such as:
@@ -61,6 +68,7 @@ struct trace_entry {
61struct trace_iterator { 68struct trace_iterator {
62 struct trace_array *tr; 69 struct trace_array *tr;
63 struct tracer *trace; 70 struct tracer *trace;
71 struct trace_buffer *trace_buffer;
64 void *private; 72 void *private;
65 int cpu_file; 73 int cpu_file;
66 struct mutex mutex; 74 struct mutex mutex;
@@ -95,8 +103,6 @@ enum trace_iter_flags {
95}; 103};
96 104
97 105
98struct trace_event;
99
100typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter, 106typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,
101 int flags, struct trace_event *event); 107 int flags, struct trace_event *event);
102 108
@@ -128,6 +134,13 @@ enum print_line_t {
128void tracing_generic_entry_update(struct trace_entry *entry, 134void tracing_generic_entry_update(struct trace_entry *entry,
129 unsigned long flags, 135 unsigned long flags,
130 int pc); 136 int pc);
137struct ftrace_event_file;
138
139struct ring_buffer_event *
140trace_event_buffer_lock_reserve(struct ring_buffer **current_buffer,
141 struct ftrace_event_file *ftrace_file,
142 int type, unsigned long len,
143 unsigned long flags, int pc);
131struct ring_buffer_event * 144struct ring_buffer_event *
132trace_current_buffer_lock_reserve(struct ring_buffer **current_buffer, 145trace_current_buffer_lock_reserve(struct ring_buffer **current_buffer,
133 int type, unsigned long len, 146 int type, unsigned long len,
@@ -182,53 +195,49 @@ extern int ftrace_event_reg(struct ftrace_event_call *event,
182 enum trace_reg type, void *data); 195 enum trace_reg type, void *data);
183 196
184enum { 197enum {
185 TRACE_EVENT_FL_ENABLED_BIT,
186 TRACE_EVENT_FL_FILTERED_BIT, 198 TRACE_EVENT_FL_FILTERED_BIT,
187 TRACE_EVENT_FL_RECORDED_CMD_BIT,
188 TRACE_EVENT_FL_CAP_ANY_BIT, 199 TRACE_EVENT_FL_CAP_ANY_BIT,
189 TRACE_EVENT_FL_NO_SET_FILTER_BIT, 200 TRACE_EVENT_FL_NO_SET_FILTER_BIT,
190 TRACE_EVENT_FL_IGNORE_ENABLE_BIT, 201 TRACE_EVENT_FL_IGNORE_ENABLE_BIT,
202 TRACE_EVENT_FL_WAS_ENABLED_BIT,
191}; 203};
192 204
205/*
206 * Event flags:
207 * FILTERED - The event has a filter attached
208 * CAP_ANY - Any user can enable for perf
209 * NO_SET_FILTER - Set when filter has error and is to be ignored
210 * IGNORE_ENABLE - For ftrace internal events, do not enable with debugfs file
211 * WAS_ENABLED - Set and stays set when an event was ever enabled
212 * (used for module unloading, if a module event is enabled,
213 * it is best to clear the buffers that used it).
214 */
193enum { 215enum {
194 TRACE_EVENT_FL_ENABLED = (1 << TRACE_EVENT_FL_ENABLED_BIT),
195 TRACE_EVENT_FL_FILTERED = (1 << TRACE_EVENT_FL_FILTERED_BIT), 216 TRACE_EVENT_FL_FILTERED = (1 << TRACE_EVENT_FL_FILTERED_BIT),
196 TRACE_EVENT_FL_RECORDED_CMD = (1 << TRACE_EVENT_FL_RECORDED_CMD_BIT),
197 TRACE_EVENT_FL_CAP_ANY = (1 << TRACE_EVENT_FL_CAP_ANY_BIT), 217 TRACE_EVENT_FL_CAP_ANY = (1 << TRACE_EVENT_FL_CAP_ANY_BIT),
198 TRACE_EVENT_FL_NO_SET_FILTER = (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT), 218 TRACE_EVENT_FL_NO_SET_FILTER = (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT),
199 TRACE_EVENT_FL_IGNORE_ENABLE = (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT), 219 TRACE_EVENT_FL_IGNORE_ENABLE = (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT),
220 TRACE_EVENT_FL_WAS_ENABLED = (1 << TRACE_EVENT_FL_WAS_ENABLED_BIT),
200}; 221};
201 222
202struct ftrace_event_call { 223struct ftrace_event_call {
203 struct list_head list; 224 struct list_head list;
204 struct ftrace_event_class *class; 225 struct ftrace_event_class *class;
205 char *name; 226 char *name;
206 struct dentry *dir;
207 struct trace_event event; 227 struct trace_event event;
208 const char *print_fmt; 228 const char *print_fmt;
209 struct event_filter *filter; 229 struct event_filter *filter;
230 struct list_head *files;
210 void *mod; 231 void *mod;
211 void *data; 232 void *data;
212
213 /* 233 /*
214 * 32 bit flags: 234 * bit 0: filter_active
215 * bit 1: enabled 235 * bit 1: allow trace by non root (cap any)
216 * bit 2: filter_active 236 * bit 2: failed to apply filter
217 * bit 3: enabled cmd record 237 * bit 3: ftrace internal event (do not enable)
218 * bit 4: allow trace by non root (cap any) 238 * bit 4: Event was enabled by module
219 * bit 5: failed to apply filter
220 * bit 6: ftrace internal event (do not enable)
221 *
222 * Changes to flags must hold the event_mutex.
223 *
224 * Note: Reads of flags do not hold the event_mutex since
225 * they occur in critical sections. But the way flags
226 * is currently used, these changes do no affect the code
227 * except that when a change is made, it may have a slight
228 * delay in propagating the changes to other CPUs due to
229 * caching and such.
230 */ 239 */
231 unsigned int flags; 240 int flags; /* static flags of different events */
232 241
233#ifdef CONFIG_PERF_EVENTS 242#ifdef CONFIG_PERF_EVENTS
234 int perf_refcount; 243 int perf_refcount;
@@ -236,6 +245,56 @@ struct ftrace_event_call {
236#endif 245#endif
237}; 246};
238 247
248struct trace_array;
249struct ftrace_subsystem_dir;
250
251enum {
252 FTRACE_EVENT_FL_ENABLED_BIT,
253 FTRACE_EVENT_FL_RECORDED_CMD_BIT,
254 FTRACE_EVENT_FL_SOFT_MODE_BIT,
255 FTRACE_EVENT_FL_SOFT_DISABLED_BIT,
256};
257
258/*
259 * Ftrace event file flags:
260 * ENABLED - The event is enabled
261 * RECORDED_CMD - The comms should be recorded at sched_switch
262 * SOFT_MODE - The event is enabled/disabled by SOFT_DISABLED
263 * SOFT_DISABLED - When set, do not trace the event (even though its
264 * tracepoint may be enabled)
265 */
266enum {
267 FTRACE_EVENT_FL_ENABLED = (1 << FTRACE_EVENT_FL_ENABLED_BIT),
268 FTRACE_EVENT_FL_RECORDED_CMD = (1 << FTRACE_EVENT_FL_RECORDED_CMD_BIT),
269 FTRACE_EVENT_FL_SOFT_MODE = (1 << FTRACE_EVENT_FL_SOFT_MODE_BIT),
270 FTRACE_EVENT_FL_SOFT_DISABLED = (1 << FTRACE_EVENT_FL_SOFT_DISABLED_BIT),
271};
272
273struct ftrace_event_file {
274 struct list_head list;
275 struct ftrace_event_call *event_call;
276 struct dentry *dir;
277 struct trace_array *tr;
278 struct ftrace_subsystem_dir *system;
279
280 /*
281 * 32 bit flags:
282 * bit 0: enabled
283 * bit 1: enabled cmd record
284 * bit 2: enable/disable with the soft disable bit
285 * bit 3: soft disabled
286 *
287 * Note: The bits must be set atomically to prevent races
288 * from other writers. Reads of flags do not need to be in
289 * sync as they occur in critical sections. But the way flags
290 * is currently used, these changes do not affect the code
291 * except that when a change is made, it may have a slight
292 * delay in propagating the changes to other CPUs due to
293 * caching and such. Which is mostly OK ;-)
294 */
295 unsigned long flags;
296};
297
239#define __TRACE_EVENT_FLAGS(name, value) \ 298#define __TRACE_EVENT_FLAGS(name, value) \
240 static int __init trace_init_flags_##name(void) \ 299 static int __init trace_init_flags_##name(void) \
241 { \ 300 { \
@@ -274,7 +333,7 @@ extern int trace_define_field(struct ftrace_event_call *call, const char *type,
274extern int trace_add_event_call(struct ftrace_event_call *call); 333extern int trace_add_event_call(struct ftrace_event_call *call);
275extern void trace_remove_event_call(struct ftrace_event_call *call); 334extern void trace_remove_event_call(struct ftrace_event_call *call);
276 335
277#define is_signed_type(type) (((type)(-1)) < (type)0) 336#define is_signed_type(type) (((type)(-1)) < (type)1)
278 337
279int trace_set_clr_event(const char *system, const char *event, int set); 338int trace_set_clr_event(const char *system, const char *event, int set);
280 339
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, ...)
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h
index 1342e69542f3..d69cf637a15a 100644
--- a/include/linux/ring_buffer.h
+++ b/include/linux/ring_buffer.h
@@ -4,6 +4,7 @@
4#include <linux/kmemcheck.h> 4#include <linux/kmemcheck.h>
5#include <linux/mm.h> 5#include <linux/mm.h>
6#include <linux/seq_file.h> 6#include <linux/seq_file.h>
7#include <linux/poll.h>
7 8
8struct ring_buffer; 9struct ring_buffer;
9struct ring_buffer_iter; 10struct ring_buffer_iter;
@@ -96,6 +97,11 @@ __ring_buffer_alloc(unsigned long size, unsigned flags, struct lock_class_key *k
96 __ring_buffer_alloc((size), (flags), &__key); \ 97 __ring_buffer_alloc((size), (flags), &__key); \
97}) 98})
98 99
100void ring_buffer_wait(struct ring_buffer *buffer, int cpu);
101int ring_buffer_poll_wait(struct ring_buffer *buffer, int cpu,
102 struct file *filp, poll_table *poll_table);
103
104
99#define RING_BUFFER_ALL_CPUS -1 105#define RING_BUFFER_ALL_CPUS -1
100 106
101void ring_buffer_free(struct ring_buffer *buffer); 107void ring_buffer_free(struct ring_buffer *buffer);
diff --git a/include/linux/trace_clock.h b/include/linux/trace_clock.h
index d563f37e1a1d..1d7ca2739272 100644
--- a/include/linux/trace_clock.h
+++ b/include/linux/trace_clock.h
@@ -16,6 +16,7 @@
16 16
17extern u64 notrace trace_clock_local(void); 17extern u64 notrace trace_clock_local(void);
18extern u64 notrace trace_clock(void); 18extern u64 notrace trace_clock(void);
19extern u64 notrace trace_clock_jiffies(void);
19extern u64 notrace trace_clock_global(void); 20extern u64 notrace trace_clock_global(void);
20extern u64 notrace trace_clock_counter(void); 21extern u64 notrace trace_clock_counter(void);
21 22