diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/ftrace.h | 4 | ||||
| -rw-r--r-- | include/linux/interrupt.h | 7 | ||||
| -rw-r--r-- | include/linux/tracepoint.h | 22 | ||||
| -rw-r--r-- | include/trace/events/power.h | 2 | ||||
| -rw-r--r-- | include/trace/events/printk.h | 41 |
5 files changed, 64 insertions, 12 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 028e26f0bf08..f33fb3b041c6 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
| @@ -178,9 +178,9 @@ struct dyn_ftrace { | |||
| 178 | }; | 178 | }; |
| 179 | 179 | ||
| 180 | int ftrace_force_update(void); | 180 | int ftrace_force_update(void); |
| 181 | void ftrace_set_filter(struct ftrace_ops *ops, unsigned char *buf, | 181 | int ftrace_set_filter(struct ftrace_ops *ops, unsigned char *buf, |
| 182 | int len, int reset); | 182 | int len, int reset); |
| 183 | void ftrace_set_notrace(struct ftrace_ops *ops, unsigned char *buf, | 183 | int ftrace_set_notrace(struct ftrace_ops *ops, unsigned char *buf, |
| 184 | int len, int reset); | 184 | int len, int reset); |
| 185 | void ftrace_set_global_filter(unsigned char *buf, int len, int reset); | 185 | void ftrace_set_global_filter(unsigned char *buf, int len, int reset); |
| 186 | void ftrace_set_global_notrace(unsigned char *buf, int len, int reset); | 186 | void ftrace_set_global_notrace(unsigned char *buf, int len, int reset); |
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index a64b00e286f5..3f830e005118 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
| @@ -20,7 +20,6 @@ | |||
| 20 | #include <linux/atomic.h> | 20 | #include <linux/atomic.h> |
| 21 | #include <asm/ptrace.h> | 21 | #include <asm/ptrace.h> |
| 22 | #include <asm/system.h> | 22 | #include <asm/system.h> |
| 23 | #include <trace/events/irq.h> | ||
| 24 | 23 | ||
| 25 | /* | 24 | /* |
| 26 | * These correspond to the IORESOURCE_IRQ_* defines in | 25 | * These correspond to the IORESOURCE_IRQ_* defines in |
| @@ -456,11 +455,7 @@ asmlinkage void do_softirq(void); | |||
| 456 | asmlinkage void __do_softirq(void); | 455 | asmlinkage void __do_softirq(void); |
| 457 | extern void open_softirq(int nr, void (*action)(struct softirq_action *)); | 456 | extern void open_softirq(int nr, void (*action)(struct softirq_action *)); |
| 458 | extern void softirq_init(void); | 457 | extern void softirq_init(void); |
| 459 | static inline void __raise_softirq_irqoff(unsigned int nr) | 458 | extern void __raise_softirq_irqoff(unsigned int nr); |
| 460 | { | ||
| 461 | trace_softirq_raise(nr); | ||
| 462 | or_softirq_pending(1UL << nr); | ||
| 463 | } | ||
| 464 | 459 | ||
| 465 | extern void raise_softirq_irqoff(unsigned int nr); | 460 | extern void raise_softirq_irqoff(unsigned int nr); |
| 466 | extern void raise_softirq(unsigned int nr); | 461 | extern void raise_softirq(unsigned int nr); |
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index df0a779c1bbd..fc36da97ff7e 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
| @@ -114,7 +114,7 @@ static inline void tracepoint_synchronize_unregister(void) | |||
| 114 | * as "(void *, void)". The DECLARE_TRACE_NOARGS() will pass in just | 114 | * as "(void *, void)". The DECLARE_TRACE_NOARGS() will pass in just |
| 115 | * "void *data", where as the DECLARE_TRACE() will pass in "void *data, proto". | 115 | * "void *data", where as the DECLARE_TRACE() will pass in "void *data, proto". |
| 116 | */ | 116 | */ |
| 117 | #define __DO_TRACE(tp, proto, args, cond) \ | 117 | #define __DO_TRACE(tp, proto, args, cond, prercu, postrcu) \ |
| 118 | do { \ | 118 | do { \ |
| 119 | struct tracepoint_func *it_func_ptr; \ | 119 | struct tracepoint_func *it_func_ptr; \ |
| 120 | void *it_func; \ | 120 | void *it_func; \ |
| @@ -122,6 +122,7 @@ static inline void tracepoint_synchronize_unregister(void) | |||
| 122 | \ | 122 | \ |
| 123 | if (!(cond)) \ | 123 | if (!(cond)) \ |
| 124 | return; \ | 124 | return; \ |
| 125 | prercu; \ | ||
| 125 | rcu_read_lock_sched_notrace(); \ | 126 | rcu_read_lock_sched_notrace(); \ |
| 126 | it_func_ptr = rcu_dereference_sched((tp)->funcs); \ | 127 | it_func_ptr = rcu_dereference_sched((tp)->funcs); \ |
| 127 | if (it_func_ptr) { \ | 128 | if (it_func_ptr) { \ |
| @@ -132,6 +133,7 @@ static inline void tracepoint_synchronize_unregister(void) | |||
| 132 | } while ((++it_func_ptr)->func); \ | 133 | } while ((++it_func_ptr)->func); \ |
| 133 | } \ | 134 | } \ |
| 134 | rcu_read_unlock_sched_notrace(); \ | 135 | rcu_read_unlock_sched_notrace(); \ |
| 136 | postrcu; \ | ||
| 135 | } while (0) | 137 | } while (0) |
| 136 | 138 | ||
| 137 | /* | 139 | /* |
| @@ -139,7 +141,7 @@ static inline void tracepoint_synchronize_unregister(void) | |||
| 139 | * not add unwanted padding between the beginning of the section and the | 141 | * not add unwanted padding between the beginning of the section and the |
| 140 | * structure. Force alignment to the same alignment as the section start. | 142 | * structure. Force alignment to the same alignment as the section start. |
| 141 | */ | 143 | */ |
| 142 | #define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \ | 144 | #define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \ |
| 143 | extern struct tracepoint __tracepoint_##name; \ | 145 | extern struct tracepoint __tracepoint_##name; \ |
| 144 | static inline void trace_##name(proto) \ | 146 | static inline void trace_##name(proto) \ |
| 145 | { \ | 147 | { \ |
| @@ -147,7 +149,17 @@ static inline void tracepoint_synchronize_unregister(void) | |||
| 147 | __DO_TRACE(&__tracepoint_##name, \ | 149 | __DO_TRACE(&__tracepoint_##name, \ |
| 148 | TP_PROTO(data_proto), \ | 150 | TP_PROTO(data_proto), \ |
| 149 | TP_ARGS(data_args), \ | 151 | TP_ARGS(data_args), \ |
| 150 | TP_CONDITION(cond)); \ | 152 | TP_CONDITION(cond),,); \ |
| 153 | } \ | ||
| 154 | static inline void trace_##name##_rcuidle(proto) \ | ||
| 155 | { \ | ||
| 156 | if (static_branch(&__tracepoint_##name.key)) \ | ||
| 157 | __DO_TRACE(&__tracepoint_##name, \ | ||
| 158 | TP_PROTO(data_proto), \ | ||
| 159 | TP_ARGS(data_args), \ | ||
| 160 | TP_CONDITION(cond), \ | ||
| 161 | rcu_idle_exit(), \ | ||
| 162 | rcu_idle_enter()); \ | ||
| 151 | } \ | 163 | } \ |
| 152 | static inline int \ | 164 | static inline int \ |
| 153 | register_trace_##name(void (*probe)(data_proto), void *data) \ | 165 | register_trace_##name(void (*probe)(data_proto), void *data) \ |
| @@ -190,9 +202,11 @@ static inline void tracepoint_synchronize_unregister(void) | |||
| 190 | EXPORT_SYMBOL(__tracepoint_##name) | 202 | EXPORT_SYMBOL(__tracepoint_##name) |
| 191 | 203 | ||
| 192 | #else /* !CONFIG_TRACEPOINTS */ | 204 | #else /* !CONFIG_TRACEPOINTS */ |
| 193 | #define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \ | 205 | #define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \ |
| 194 | static inline void trace_##name(proto) \ | 206 | static inline void trace_##name(proto) \ |
| 195 | { } \ | 207 | { } \ |
| 208 | static inline void trace_##name##_rcuidle(proto) \ | ||
| 209 | { } \ | ||
| 196 | static inline int \ | 210 | static inline int \ |
| 197 | register_trace_##name(void (*probe)(data_proto), \ | 211 | register_trace_##name(void (*probe)(data_proto), \ |
| 198 | void *data) \ | 212 | void *data) \ |
diff --git a/include/trace/events/power.h b/include/trace/events/power.h index 1bcc2a8c00e2..14b38940062b 100644 --- a/include/trace/events/power.h +++ b/include/trace/events/power.h | |||
| @@ -151,6 +151,8 @@ enum { | |||
| 151 | events get removed */ | 151 | events get removed */ |
| 152 | static inline void trace_power_start(u64 type, u64 state, u64 cpuid) {}; | 152 | static inline void trace_power_start(u64 type, u64 state, u64 cpuid) {}; |
| 153 | static inline void trace_power_end(u64 cpuid) {}; | 153 | static inline void trace_power_end(u64 cpuid) {}; |
| 154 | static inline void trace_power_start_rcuidle(u64 type, u64 state, u64 cpuid) {}; | ||
| 155 | static inline void trace_power_end_rcuidle(u64 cpuid) {}; | ||
| 154 | static inline void trace_power_frequency(u64 type, u64 state, u64 cpuid) {}; | 156 | static inline void trace_power_frequency(u64 type, u64 state, u64 cpuid) {}; |
| 155 | #endif /* _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED */ | 157 | #endif /* _PWR_EVENT_AVOID_DOUBLE_DEFINING_DEPRECATED */ |
| 156 | 158 | ||
diff --git a/include/trace/events/printk.h b/include/trace/events/printk.h new file mode 100644 index 000000000000..94ec79cc011a --- /dev/null +++ b/include/trace/events/printk.h | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | #undef TRACE_SYSTEM | ||
| 2 | #define TRACE_SYSTEM printk | ||
| 3 | |||
| 4 | #if !defined(_TRACE_PRINTK_H) || defined(TRACE_HEADER_MULTI_READ) | ||
| 5 | #define _TRACE_PRINTK_H | ||
| 6 | |||
| 7 | #include <linux/tracepoint.h> | ||
| 8 | |||
| 9 | TRACE_EVENT_CONDITION(console, | ||
| 10 | TP_PROTO(const char *log_buf, unsigned start, unsigned end, | ||
| 11 | unsigned log_buf_len), | ||
| 12 | |||
| 13 | TP_ARGS(log_buf, start, end, log_buf_len), | ||
| 14 | |||
| 15 | TP_CONDITION(start != end), | ||
| 16 | |||
| 17 | TP_STRUCT__entry( | ||
| 18 | __dynamic_array(char, msg, end - start + 1) | ||
| 19 | ), | ||
| 20 | |||
| 21 | TP_fast_assign( | ||
| 22 | if ((start & (log_buf_len - 1)) > (end & (log_buf_len - 1))) { | ||
| 23 | memcpy(__get_dynamic_array(msg), | ||
| 24 | log_buf + (start & (log_buf_len - 1)), | ||
| 25 | log_buf_len - (start & (log_buf_len - 1))); | ||
| 26 | memcpy((char *)__get_dynamic_array(msg) + | ||
| 27 | log_buf_len - (start & (log_buf_len - 1)), | ||
| 28 | log_buf, end & (log_buf_len - 1)); | ||
| 29 | } else | ||
| 30 | memcpy(__get_dynamic_array(msg), | ||
| 31 | log_buf + (start & (log_buf_len - 1)), | ||
| 32 | end - start); | ||
| 33 | ((char *)__get_dynamic_array(msg))[end - start] = 0; | ||
| 34 | ), | ||
| 35 | |||
| 36 | TP_printk("%s", __get_str(msg)) | ||
| 37 | ); | ||
| 38 | #endif /* _TRACE_PRINTK_H */ | ||
| 39 | |||
| 40 | /* This part must be outside protection */ | ||
| 41 | #include <trace/define_trace.h> | ||
