diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2009-08-06 22:33:22 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2009-08-26 00:32:06 -0400 |
commit | 43b51ead3f752a3935116e5b1a94254b8573734f (patch) | |
tree | 5d9e88635c85ba7b1d273dea3c4d8d96e5000154 /kernel | |
parent | aa38e9fc3ea804290efd3a39316d7f7e6c945800 (diff) |
tracing/filters: Add __field_ext() to TRACE_EVENT
Add __field_ext(), so a field can be assigned to a specific
filter_type, which matches a corresponding filter function.
For example, a later patch will allow this:
__field_ext(const char *, str, FILTER_PTR_STR);
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
LKML-Reference: <4A7B9272.6050709@cn.fujitsu.com>
[
Fixed a -1 to FILTER_OTHER
Forward ported to latest kernel.
]
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/trace_events.c | 11 | ||||
-rw-r--r-- | kernel/trace/trace_events_filter.c | 6 | ||||
-rw-r--r-- | kernel/trace/trace_export.c | 8 | ||||
-rw-r--r-- | kernel/trace/trace_syscalls.c | 6 |
4 files changed, 17 insertions, 14 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 5740e90f4ca1..d33bcdeffe69 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -28,7 +28,8 @@ DEFINE_MUTEX(event_mutex); | |||
28 | LIST_HEAD(ftrace_events); | 28 | LIST_HEAD(ftrace_events); |
29 | 29 | ||
30 | int trace_define_field(struct ftrace_event_call *call, const char *type, | 30 | int trace_define_field(struct ftrace_event_call *call, const char *type, |
31 | const char *name, int offset, int size, int is_signed) | 31 | const char *name, int offset, int size, int is_signed, |
32 | int filter_type) | ||
32 | { | 33 | { |
33 | struct ftrace_event_field *field; | 34 | struct ftrace_event_field *field; |
34 | 35 | ||
@@ -44,7 +45,11 @@ int trace_define_field(struct ftrace_event_call *call, const char *type, | |||
44 | if (!field->type) | 45 | if (!field->type) |
45 | goto err; | 46 | goto err; |
46 | 47 | ||
47 | field->filter_type = filter_assign_type(type); | 48 | if (filter_type == FILTER_OTHER) |
49 | field->filter_type = filter_assign_type(type); | ||
50 | else | ||
51 | field->filter_type = filter_type; | ||
52 | |||
48 | field->offset = offset; | 53 | field->offset = offset; |
49 | field->size = size; | 54 | field->size = size; |
50 | field->is_signed = is_signed; | 55 | field->is_signed = is_signed; |
@@ -68,7 +73,7 @@ EXPORT_SYMBOL_GPL(trace_define_field); | |||
68 | ret = trace_define_field(call, #type, "common_" #item, \ | 73 | ret = trace_define_field(call, #type, "common_" #item, \ |
69 | offsetof(typeof(ent), item), \ | 74 | offsetof(typeof(ent), item), \ |
70 | sizeof(ent.item), \ | 75 | sizeof(ent.item), \ |
71 | is_signed_type(type)); \ | 76 | is_signed_type(type), FILTER_OTHER); \ |
72 | if (ret) \ | 77 | if (ret) \ |
73 | return ret; | 78 | return ret; |
74 | 79 | ||
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 22e6d822bbaa..8a8e576733fc 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c | |||
@@ -475,12 +475,6 @@ static int filter_add_pred_fn(struct filter_parse_state *ps, | |||
475 | return 0; | 475 | return 0; |
476 | } | 476 | } |
477 | 477 | ||
478 | enum { | ||
479 | FILTER_OTHER = 0, | ||
480 | FILTER_STATIC_STRING, | ||
481 | FILTER_DYN_STRING, | ||
482 | }; | ||
483 | |||
484 | int filter_assign_type(const char *type) | 478 | int filter_assign_type(const char *type) |
485 | { | 479 | { |
486 | if (strstr(type, "__data_loc") && strstr(type, "char")) | 480 | if (strstr(type, "__data_loc") && strstr(type, "char")) |
diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c index 70875303ae46..029a91f42287 100644 --- a/kernel/trace/trace_export.c +++ b/kernel/trace/trace_export.c | |||
@@ -158,7 +158,8 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ | |||
158 | #define TRACE_FIELD(type, item, assign) \ | 158 | #define TRACE_FIELD(type, item, assign) \ |
159 | ret = trace_define_field(event_call, #type, #item, \ | 159 | ret = trace_define_field(event_call, #type, #item, \ |
160 | offsetof(typeof(field), item), \ | 160 | offsetof(typeof(field), item), \ |
161 | sizeof(field.item), is_signed_type(type)); \ | 161 | sizeof(field.item), \ |
162 | is_signed_type(type), FILTER_OTHER); \ | ||
162 | if (ret) \ | 163 | if (ret) \ |
163 | return ret; | 164 | return ret; |
164 | 165 | ||
@@ -166,7 +167,7 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ | |||
166 | #define TRACE_FIELD_SPECIAL(type, item, len, cmd) \ | 167 | #define TRACE_FIELD_SPECIAL(type, item, len, cmd) \ |
167 | ret = trace_define_field(event_call, #type "[" #len "]", #item, \ | 168 | ret = trace_define_field(event_call, #type "[" #len "]", #item, \ |
168 | offsetof(typeof(field), item), \ | 169 | offsetof(typeof(field), item), \ |
169 | sizeof(field.item), 0); \ | 170 | sizeof(field.item), 0, FILTER_OTHER); \ |
170 | if (ret) \ | 171 | if (ret) \ |
171 | return ret; | 172 | return ret; |
172 | 173 | ||
@@ -174,7 +175,8 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ | |||
174 | #define TRACE_FIELD_SIGN(type, item, assign, is_signed) \ | 175 | #define TRACE_FIELD_SIGN(type, item, assign, is_signed) \ |
175 | ret = trace_define_field(event_call, #type, #item, \ | 176 | ret = trace_define_field(event_call, #type, #item, \ |
176 | offsetof(typeof(field), item), \ | 177 | offsetof(typeof(field), item), \ |
177 | sizeof(field.item), is_signed); \ | 178 | sizeof(field.item), is_signed, \ |
179 | FILTER_OTHER); \ | ||
178 | if (ret) \ | 180 | if (ret) \ |
179 | return ret; | 181 | return ret; |
180 | 182 | ||
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index 46c1b977a2cb..97a2454760b0 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
@@ -194,7 +194,8 @@ int syscall_enter_define_fields(struct ftrace_event_call *call) | |||
194 | for (i = 0; i < meta->nb_args; i++) { | 194 | for (i = 0; i < meta->nb_args; i++) { |
195 | ret = trace_define_field(call, meta->types[i], | 195 | ret = trace_define_field(call, meta->types[i], |
196 | meta->args[i], offset, | 196 | meta->args[i], offset, |
197 | sizeof(unsigned long), 0); | 197 | sizeof(unsigned long), 0, |
198 | FILTER_OTHER); | ||
198 | offset += sizeof(unsigned long); | 199 | offset += sizeof(unsigned long); |
199 | } | 200 | } |
200 | 201 | ||
@@ -210,7 +211,8 @@ int syscall_exit_define_fields(struct ftrace_event_call *call) | |||
210 | if (ret) | 211 | if (ret) |
211 | return ret; | 212 | return ret; |
212 | 213 | ||
213 | ret = trace_define_field(call, SYSCALL_FIELD(unsigned long, ret), 0); | 214 | ret = trace_define_field(call, SYSCALL_FIELD(unsigned long, ret), 0, |
215 | FILTER_OTHER); | ||
214 | 216 | ||
215 | return ret; | 217 | return ret; |
216 | } | 218 | } |