diff options
| -rw-r--r-- | include/linux/ftrace_event.h | 1 | ||||
| -rw-r--r-- | kernel/trace/trace.h | 23 | ||||
| -rw-r--r-- | kernel/trace/trace_entries.h | 48 | ||||
| -rw-r--r-- | kernel/trace/trace_events_filter.c | 7 | ||||
| -rw-r--r-- | kernel/trace/trace_export.c | 51 |
5 files changed, 83 insertions, 47 deletions
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 2bf677cb2d6f..dd478fc8f9f5 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
| @@ -245,6 +245,7 @@ enum { | |||
| 245 | FILTER_STATIC_STRING, | 245 | FILTER_STATIC_STRING, |
| 246 | FILTER_DYN_STRING, | 246 | FILTER_DYN_STRING, |
| 247 | FILTER_PTR_STRING, | 247 | FILTER_PTR_STRING, |
| 248 | FILTER_TRACE_FN, | ||
| 248 | }; | 249 | }; |
| 249 | 250 | ||
| 250 | #define EVENT_STORAGE_SIZE 128 | 251 | #define EVENT_STORAGE_SIZE 128 |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 76a1c5094bbf..29f93cd434a5 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
| @@ -56,21 +56,23 @@ enum trace_type { | |||
| 56 | #define F_STRUCT(args...) args | 56 | #define F_STRUCT(args...) args |
| 57 | 57 | ||
| 58 | #undef FTRACE_ENTRY | 58 | #undef FTRACE_ENTRY |
| 59 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \ | 59 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter) \ |
| 60 | struct struct_name { \ | 60 | struct struct_name { \ |
| 61 | struct trace_entry ent; \ | 61 | struct trace_entry ent; \ |
| 62 | tstruct \ | 62 | tstruct \ |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | #undef TP_ARGS | 65 | #undef TP_ARGS |
| 66 | #define TP_ARGS(args...) args | 66 | #define TP_ARGS(args...) args |
| 67 | 67 | ||
| 68 | #undef FTRACE_ENTRY_DUP | 68 | #undef FTRACE_ENTRY_DUP |
| 69 | #define FTRACE_ENTRY_DUP(name, name_struct, id, tstruct, printk) | 69 | #define FTRACE_ENTRY_DUP(name, name_struct, id, tstruct, printk, filter) |
| 70 | 70 | ||
| 71 | #undef FTRACE_ENTRY_REG | 71 | #undef FTRACE_ENTRY_REG |
| 72 | #define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, regfn) \ | 72 | #define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, \ |
| 73 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print)) | 73 | filter, regfn) \ |
| 74 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \ | ||
| 75 | filter) | ||
| 74 | 76 | ||
| 75 | #include "trace_entries.h" | 77 | #include "trace_entries.h" |
| 76 | 78 | ||
| @@ -826,12 +828,13 @@ extern const char *__start___trace_bprintk_fmt[]; | |||
| 826 | extern const char *__stop___trace_bprintk_fmt[]; | 828 | extern const char *__stop___trace_bprintk_fmt[]; |
| 827 | 829 | ||
| 828 | #undef FTRACE_ENTRY | 830 | #undef FTRACE_ENTRY |
| 829 | #define FTRACE_ENTRY(call, struct_name, id, tstruct, print) \ | 831 | #define FTRACE_ENTRY(call, struct_name, id, tstruct, print, filter) \ |
| 830 | extern struct ftrace_event_call \ | 832 | extern struct ftrace_event_call \ |
| 831 | __attribute__((__aligned__(4))) event_##call; | 833 | __attribute__((__aligned__(4))) event_##call; |
| 832 | #undef FTRACE_ENTRY_DUP | 834 | #undef FTRACE_ENTRY_DUP |
| 833 | #define FTRACE_ENTRY_DUP(call, struct_name, id, tstruct, print) \ | 835 | #define FTRACE_ENTRY_DUP(call, struct_name, id, tstruct, print, filter) \ |
| 834 | FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print)) | 836 | FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print), \ |
| 837 | filter) | ||
| 835 | #include "trace_entries.h" | 838 | #include "trace_entries.h" |
| 836 | 839 | ||
| 837 | #ifdef CONFIG_PERF_EVENTS | 840 | #ifdef CONFIG_PERF_EVENTS |
diff --git a/kernel/trace/trace_entries.h b/kernel/trace/trace_entries.h index 47db7eda0531..d91eb0541b3a 100644 --- a/kernel/trace/trace_entries.h +++ b/kernel/trace/trace_entries.h | |||
| @@ -66,6 +66,8 @@ FTRACE_ENTRY_REG(function, ftrace_entry, | |||
| 66 | 66 | ||
| 67 | F_printk(" %lx <-- %lx", __entry->ip, __entry->parent_ip), | 67 | F_printk(" %lx <-- %lx", __entry->ip, __entry->parent_ip), |
| 68 | 68 | ||
| 69 | FILTER_TRACE_FN, | ||
| 70 | |||
| 69 | perf_ftrace_event_register | 71 | perf_ftrace_event_register |
| 70 | ); | 72 | ); |
| 71 | 73 | ||
| @@ -80,7 +82,9 @@ FTRACE_ENTRY(funcgraph_entry, ftrace_graph_ent_entry, | |||
| 80 | __field_desc( int, graph_ent, depth ) | 82 | __field_desc( int, graph_ent, depth ) |
| 81 | ), | 83 | ), |
| 82 | 84 | ||
| 83 | F_printk("--> %lx (%d)", __entry->func, __entry->depth) | 85 | F_printk("--> %lx (%d)", __entry->func, __entry->depth), |
| 86 | |||
| 87 | FILTER_OTHER | ||
| 84 | ); | 88 | ); |
| 85 | 89 | ||
| 86 | /* Function return entry */ | 90 | /* Function return entry */ |
| @@ -100,7 +104,9 @@ FTRACE_ENTRY(funcgraph_exit, ftrace_graph_ret_entry, | |||
| 100 | F_printk("<-- %lx (%d) (start: %llx end: %llx) over: %d", | 104 | F_printk("<-- %lx (%d) (start: %llx end: %llx) over: %d", |
| 101 | __entry->func, __entry->depth, | 105 | __entry->func, __entry->depth, |
| 102 | __entry->calltime, __entry->rettime, | 106 | __entry->calltime, __entry->rettime, |
| 103 | __entry->depth) | 107 | __entry->depth), |
| 108 | |||
| 109 | FILTER_OTHER | ||
| 104 | ); | 110 | ); |
| 105 | 111 | ||
| 106 | /* | 112 | /* |
| @@ -129,8 +135,9 @@ FTRACE_ENTRY(context_switch, ctx_switch_entry, | |||
| 129 | F_printk("%u:%u:%u ==> %u:%u:%u [%03u]", | 135 | F_printk("%u:%u:%u ==> %u:%u:%u [%03u]", |
| 130 | __entry->prev_pid, __entry->prev_prio, __entry->prev_state, | 136 | __entry->prev_pid, __entry->prev_prio, __entry->prev_state, |
| 131 | __entry->next_pid, __entry->next_prio, __entry->next_state, | 137 | __entry->next_pid, __entry->next_prio, __entry->next_state, |
| 132 | __entry->next_cpu | 138 | __entry->next_cpu), |
| 133 | ) | 139 | |
| 140 | FILTER_OTHER | ||
| 134 | ); | 141 | ); |
| 135 | 142 | ||
| 136 | /* | 143 | /* |
| @@ -148,8 +155,9 @@ FTRACE_ENTRY_DUP(wakeup, ctx_switch_entry, | |||
| 148 | F_printk("%u:%u:%u ==+ %u:%u:%u [%03u]", | 155 | F_printk("%u:%u:%u ==+ %u:%u:%u [%03u]", |
| 149 | __entry->prev_pid, __entry->prev_prio, __entry->prev_state, | 156 | __entry->prev_pid, __entry->prev_prio, __entry->prev_state, |
| 150 | __entry->next_pid, __entry->next_prio, __entry->next_state, | 157 | __entry->next_pid, __entry->next_prio, __entry->next_state, |
| 151 | __entry->next_cpu | 158 | __entry->next_cpu), |
| 152 | ) | 159 | |
| 160 | FILTER_OTHER | ||
| 153 | ); | 161 | ); |
| 154 | 162 | ||
| 155 | /* | 163 | /* |
| @@ -171,7 +179,9 @@ FTRACE_ENTRY(kernel_stack, stack_entry, | |||
| 171 | "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n", | 179 | "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n", |
| 172 | __entry->caller[0], __entry->caller[1], __entry->caller[2], | 180 | __entry->caller[0], __entry->caller[1], __entry->caller[2], |
| 173 | __entry->caller[3], __entry->caller[4], __entry->caller[5], | 181 | __entry->caller[3], __entry->caller[4], __entry->caller[5], |
| 174 | __entry->caller[6], __entry->caller[7]) | 182 | __entry->caller[6], __entry->caller[7]), |
| 183 | |||
| 184 | FILTER_OTHER | ||
| 175 | ); | 185 | ); |
| 176 | 186 | ||
| 177 | FTRACE_ENTRY(user_stack, userstack_entry, | 187 | FTRACE_ENTRY(user_stack, userstack_entry, |
| @@ -187,7 +197,9 @@ FTRACE_ENTRY(user_stack, userstack_entry, | |||
| 187 | "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n", | 197 | "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n", |
| 188 | __entry->caller[0], __entry->caller[1], __entry->caller[2], | 198 | __entry->caller[0], __entry->caller[1], __entry->caller[2], |
| 189 | __entry->caller[3], __entry->caller[4], __entry->caller[5], | 199 | __entry->caller[3], __entry->caller[4], __entry->caller[5], |
| 190 | __entry->caller[6], __entry->caller[7]) | 200 | __entry->caller[6], __entry->caller[7]), |
| 201 | |||
| 202 | FILTER_OTHER | ||
| 191 | ); | 203 | ); |
| 192 | 204 | ||
| 193 | /* | 205 | /* |
| @@ -204,7 +216,9 @@ FTRACE_ENTRY(bprint, bprint_entry, | |||
| 204 | ), | 216 | ), |
| 205 | 217 | ||
| 206 | F_printk("%08lx fmt:%p", | 218 | F_printk("%08lx fmt:%p", |
| 207 | __entry->ip, __entry->fmt) | 219 | __entry->ip, __entry->fmt), |
| 220 | |||
| 221 | FILTER_OTHER | ||
| 208 | ); | 222 | ); |
| 209 | 223 | ||
| 210 | FTRACE_ENTRY(print, print_entry, | 224 | FTRACE_ENTRY(print, print_entry, |
| @@ -217,7 +231,9 @@ FTRACE_ENTRY(print, print_entry, | |||
| 217 | ), | 231 | ), |
| 218 | 232 | ||
| 219 | F_printk("%08lx %s", | 233 | F_printk("%08lx %s", |
| 220 | __entry->ip, __entry->buf) | 234 | __entry->ip, __entry->buf), |
| 235 | |||
| 236 | FILTER_OTHER | ||
| 221 | ); | 237 | ); |
| 222 | 238 | ||
| 223 | FTRACE_ENTRY(mmiotrace_rw, trace_mmiotrace_rw, | 239 | FTRACE_ENTRY(mmiotrace_rw, trace_mmiotrace_rw, |
| @@ -236,7 +252,9 @@ FTRACE_ENTRY(mmiotrace_rw, trace_mmiotrace_rw, | |||
| 236 | 252 | ||
| 237 | F_printk("%lx %lx %lx %d %x %x", | 253 | F_printk("%lx %lx %lx %d %x %x", |
| 238 | (unsigned long)__entry->phys, __entry->value, __entry->pc, | 254 | (unsigned long)__entry->phys, __entry->value, __entry->pc, |
| 239 | __entry->map_id, __entry->opcode, __entry->width) | 255 | __entry->map_id, __entry->opcode, __entry->width), |
| 256 | |||
| 257 | FILTER_OTHER | ||
| 240 | ); | 258 | ); |
| 241 | 259 | ||
| 242 | FTRACE_ENTRY(mmiotrace_map, trace_mmiotrace_map, | 260 | FTRACE_ENTRY(mmiotrace_map, trace_mmiotrace_map, |
| @@ -254,7 +272,9 @@ FTRACE_ENTRY(mmiotrace_map, trace_mmiotrace_map, | |||
| 254 | 272 | ||
| 255 | F_printk("%lx %lx %lx %d %x", | 273 | F_printk("%lx %lx %lx %d %x", |
| 256 | (unsigned long)__entry->phys, __entry->virt, __entry->len, | 274 | (unsigned long)__entry->phys, __entry->virt, __entry->len, |
| 257 | __entry->map_id, __entry->opcode) | 275 | __entry->map_id, __entry->opcode), |
| 276 | |||
| 277 | FILTER_OTHER | ||
| 258 | ); | 278 | ); |
| 259 | 279 | ||
| 260 | 280 | ||
| @@ -274,6 +294,8 @@ FTRACE_ENTRY(branch, trace_branch, | |||
| 274 | 294 | ||
| 275 | F_printk("%u:%s:%s (%u)", | 295 | F_printk("%u:%s:%s (%u)", |
| 276 | __entry->line, | 296 | __entry->line, |
| 277 | __entry->func, __entry->file, __entry->correct) | 297 | __entry->func, __entry->file, __entry->correct), |
| 298 | |||
| 299 | FILTER_OTHER | ||
| 278 | ); | 300 | ); |
| 279 | 301 | ||
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 76afaee99dbc..3da3d0ec3584 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c | |||
| @@ -899,6 +899,11 @@ int filter_assign_type(const char *type) | |||
| 899 | return FILTER_OTHER; | 899 | return FILTER_OTHER; |
| 900 | } | 900 | } |
| 901 | 901 | ||
| 902 | static bool is_function_field(struct ftrace_event_field *field) | ||
| 903 | { | ||
| 904 | return field->filter_type == FILTER_TRACE_FN; | ||
| 905 | } | ||
| 906 | |||
| 902 | static bool is_string_field(struct ftrace_event_field *field) | 907 | static bool is_string_field(struct ftrace_event_field *field) |
| 903 | { | 908 | { |
| 904 | return field->filter_type == FILTER_DYN_STRING || | 909 | return field->filter_type == FILTER_DYN_STRING || |
| @@ -986,7 +991,7 @@ static int init_pred(struct filter_parse_state *ps, | |||
| 986 | fn = filter_pred_strloc; | 991 | fn = filter_pred_strloc; |
| 987 | else | 992 | else |
| 988 | fn = filter_pred_pchar; | 993 | fn = filter_pred_pchar; |
| 989 | } else { | 994 | } else if (!is_function_field(field)) { |
| 990 | if (field->is_signed) | 995 | if (field->is_signed) |
| 991 | ret = strict_strtoll(pred->regex.pattern, 0, &val); | 996 | ret = strict_strtoll(pred->regex.pattern, 0, &val); |
| 992 | else | 997 | else |
diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c index a3dbee6d04cd..7b46c9bd22ae 100644 --- a/kernel/trace/trace_export.c +++ b/kernel/trace/trace_export.c | |||
| @@ -23,8 +23,10 @@ | |||
| 23 | * function and thus become accesible via perf. | 23 | * function and thus become accesible via perf. |
| 24 | */ | 24 | */ |
| 25 | #undef FTRACE_ENTRY_REG | 25 | #undef FTRACE_ENTRY_REG |
| 26 | #define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, regfn) \ | 26 | #define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, \ |
| 27 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print)) | 27 | filter, regfn) \ |
| 28 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \ | ||
| 29 | filter) | ||
| 28 | 30 | ||
| 29 | /* not needed for this file */ | 31 | /* not needed for this file */ |
| 30 | #undef __field_struct | 32 | #undef __field_struct |
| @@ -52,21 +54,22 @@ | |||
| 52 | #define F_printk(fmt, args...) fmt, args | 54 | #define F_printk(fmt, args...) fmt, args |
| 53 | 55 | ||
| 54 | #undef FTRACE_ENTRY | 56 | #undef FTRACE_ENTRY |
| 55 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \ | 57 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter) \ |
| 56 | struct ____ftrace_##name { \ | 58 | struct ____ftrace_##name { \ |
| 57 | tstruct \ | 59 | tstruct \ |
| 58 | }; \ | 60 | }; \ |
| 59 | static void __always_unused ____ftrace_check_##name(void) \ | 61 | static void __always_unused ____ftrace_check_##name(void) \ |
| 60 | { \ | 62 | { \ |
| 61 | struct ____ftrace_##name *__entry = NULL; \ | 63 | struct ____ftrace_##name *__entry = NULL; \ |
| 62 | \ | 64 | \ |
| 63 | /* force compile-time check on F_printk() */ \ | 65 | /* force compile-time check on F_printk() */ \ |
| 64 | printk(print); \ | 66 | printk(print); \ |
| 65 | } | 67 | } |
| 66 | 68 | ||
| 67 | #undef FTRACE_ENTRY_DUP | 69 | #undef FTRACE_ENTRY_DUP |
| 68 | #define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print) \ | 70 | #define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print, filter) \ |
| 69 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print)) | 71 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \ |
| 72 | filter) | ||
| 70 | 73 | ||
| 71 | #include "trace_entries.h" | 74 | #include "trace_entries.h" |
| 72 | 75 | ||
| @@ -75,7 +78,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 75 | ret = trace_define_field(event_call, #type, #item, \ | 78 | ret = trace_define_field(event_call, #type, #item, \ |
| 76 | offsetof(typeof(field), item), \ | 79 | offsetof(typeof(field), item), \ |
| 77 | sizeof(field.item), \ | 80 | sizeof(field.item), \ |
| 78 | is_signed_type(type), FILTER_OTHER); \ | 81 | is_signed_type(type), filter_type); \ |
| 79 | if (ret) \ | 82 | if (ret) \ |
| 80 | return ret; | 83 | return ret; |
| 81 | 84 | ||
| @@ -85,7 +88,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 85 | offsetof(typeof(field), \ | 88 | offsetof(typeof(field), \ |
| 86 | container.item), \ | 89 | container.item), \ |
| 87 | sizeof(field.container.item), \ | 90 | sizeof(field.container.item), \ |
| 88 | is_signed_type(type), FILTER_OTHER); \ | 91 | is_signed_type(type), filter_type); \ |
| 89 | if (ret) \ | 92 | if (ret) \ |
| 90 | return ret; | 93 | return ret; |
| 91 | 94 | ||
| @@ -99,7 +102,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 99 | ret = trace_define_field(event_call, event_storage, #item, \ | 102 | ret = trace_define_field(event_call, event_storage, #item, \ |
| 100 | offsetof(typeof(field), item), \ | 103 | offsetof(typeof(field), item), \ |
| 101 | sizeof(field.item), \ | 104 | sizeof(field.item), \ |
| 102 | is_signed_type(type), FILTER_OTHER); \ | 105 | is_signed_type(type), filter_type); \ |
| 103 | mutex_unlock(&event_storage_mutex); \ | 106 | mutex_unlock(&event_storage_mutex); \ |
| 104 | if (ret) \ | 107 | if (ret) \ |
| 105 | return ret; \ | 108 | return ret; \ |
| @@ -112,7 +115,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 112 | offsetof(typeof(field), \ | 115 | offsetof(typeof(field), \ |
| 113 | container.item), \ | 116 | container.item), \ |
| 114 | sizeof(field.container.item), \ | 117 | sizeof(field.container.item), \ |
| 115 | is_signed_type(type), FILTER_OTHER); \ | 118 | is_signed_type(type), filter_type); \ |
| 116 | if (ret) \ | 119 | if (ret) \ |
| 117 | return ret; | 120 | return ret; |
| 118 | 121 | ||
| @@ -120,17 +123,18 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 120 | #define __dynamic_array(type, item) \ | 123 | #define __dynamic_array(type, item) \ |
| 121 | ret = trace_define_field(event_call, #type, #item, \ | 124 | ret = trace_define_field(event_call, #type, #item, \ |
| 122 | offsetof(typeof(field), item), \ | 125 | offsetof(typeof(field), item), \ |
| 123 | 0, is_signed_type(type), FILTER_OTHER);\ | 126 | 0, is_signed_type(type), filter_type);\ |
| 124 | if (ret) \ | 127 | if (ret) \ |
| 125 | return ret; | 128 | return ret; |
| 126 | 129 | ||
| 127 | #undef FTRACE_ENTRY | 130 | #undef FTRACE_ENTRY |
| 128 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \ | 131 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter) \ |
| 129 | int \ | 132 | int \ |
| 130 | ftrace_define_fields_##name(struct ftrace_event_call *event_call) \ | 133 | ftrace_define_fields_##name(struct ftrace_event_call *event_call) \ |
| 131 | { \ | 134 | { \ |
| 132 | struct struct_name field; \ | 135 | struct struct_name field; \ |
| 133 | int ret; \ | 136 | int ret; \ |
| 137 | int filter_type = filter; \ | ||
| 134 | \ | 138 | \ |
| 135 | tstruct; \ | 139 | tstruct; \ |
| 136 | \ | 140 | \ |
| @@ -161,7 +165,8 @@ ftrace_define_fields_##name(struct ftrace_event_call *event_call) \ | |||
| 161 | #define F_printk(fmt, args...) #fmt ", " __stringify(args) | 165 | #define F_printk(fmt, args...) #fmt ", " __stringify(args) |
| 162 | 166 | ||
| 163 | #undef FTRACE_ENTRY_REG | 167 | #undef FTRACE_ENTRY_REG |
| 164 | #define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, regfn)\ | 168 | #define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, filter,\ |
| 169 | regfn) \ | ||
| 165 | \ | 170 | \ |
| 166 | struct ftrace_event_class event_class_ftrace_##call = { \ | 171 | struct ftrace_event_class event_class_ftrace_##call = { \ |
| 167 | .system = __stringify(TRACE_SYSTEM), \ | 172 | .system = __stringify(TRACE_SYSTEM), \ |
| @@ -180,9 +185,9 @@ struct ftrace_event_call __used \ | |||
| 180 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call; | 185 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call; |
| 181 | 186 | ||
| 182 | #undef FTRACE_ENTRY | 187 | #undef FTRACE_ENTRY |
| 183 | #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print) \ | 188 | #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print, filter) \ |
| 184 | FTRACE_ENTRY_REG(call, struct_name, etype, \ | 189 | FTRACE_ENTRY_REG(call, struct_name, etype, \ |
| 185 | PARAMS(tstruct), PARAMS(print), NULL) | 190 | PARAMS(tstruct), PARAMS(print), filter, NULL) |
| 186 | 191 | ||
| 187 | int ftrace_event_is_function(struct ftrace_event_call *call) | 192 | int ftrace_event_is_function(struct ftrace_event_call *call) |
| 188 | { | 193 | { |
