diff options
| author | Tejun Heo <tj@kernel.org> | 2012-04-01 15:30:01 -0400 |
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2012-04-01 15:55:00 -0400 |
| commit | 959d851caa48829eb85cb85aa949fd6b4c5d5bc6 (patch) | |
| tree | 3ba9c94ec346275fb44c4f0d1cd2537cdff8d811 /kernel/trace/trace_export.c | |
| parent | a5567932fc926739e29e98487128080f40c61710 (diff) | |
| parent | 48ddbe194623ae089cc0576e60363f2d2e85662a (diff) | |
Merge branch 'for-3.5' of ../cgroup into block/for-3.5/core-merged
cgroup/for-3.5 contains the following changes which blk-cgroup needs
to proceed with the on-going cleanup.
* Dynamic addition and removal of cftypes to make config/stat file
handling modular for policies.
* cgroup removal update to not wait for css references to drain to fix
blkcg removal hang caused by cfq caching cfqgs.
Pull in cgroup/for-3.5 into block/for-3.5/core. This causes the
following conflicts in block/blk-cgroup.c.
* 761b3ef50e "cgroup: remove cgroup_subsys argument from callbacks"
conflicts with blkiocg_pre_destroy() addition and blkiocg_attach()
removal. Resolved by removing @subsys from all subsys methods.
* 676f7c8f84 "cgroup: relocate cftype and cgroup_subsys definitions in
controllers" conflicts with ->pre_destroy() and ->attach() updates
and removal of modular config. Resolved by dropping forward
declarations of the methods and applying updates to the relocated
blkio_subsys.
* 4baf6e3325 "cgroup: convert all non-memcg controllers to the new
cftype interface" builds upon the previous item. Resolved by adding
->base_cftypes to the relocated blkio_subsys.
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'kernel/trace/trace_export.c')
| -rw-r--r-- | kernel/trace/trace_export.c | 66 |
1 files changed, 45 insertions, 21 deletions
diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c index bbeec31e0ae3..3dd15e8bc856 100644 --- a/kernel/trace/trace_export.c +++ b/kernel/trace/trace_export.c | |||
| @@ -18,6 +18,16 @@ | |||
| 18 | #undef TRACE_SYSTEM | 18 | #undef TRACE_SYSTEM |
| 19 | #define TRACE_SYSTEM ftrace | 19 | #define TRACE_SYSTEM ftrace |
| 20 | 20 | ||
| 21 | /* | ||
| 22 | * The FTRACE_ENTRY_REG macro allows ftrace entry to define register | ||
| 23 | * function and thus become accesible via perf. | ||
| 24 | */ | ||
| 25 | #undef FTRACE_ENTRY_REG | ||
| 26 | #define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, \ | ||
| 27 | filter, regfn) \ | ||
| 28 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \ | ||
| 29 | filter) | ||
| 30 | |||
| 21 | /* not needed for this file */ | 31 | /* not needed for this file */ |
| 22 | #undef __field_struct | 32 | #undef __field_struct |
| 23 | #define __field_struct(type, item) | 33 | #define __field_struct(type, item) |
| @@ -44,21 +54,22 @@ | |||
| 44 | #define F_printk(fmt, args...) fmt, args | 54 | #define F_printk(fmt, args...) fmt, args |
| 45 | 55 | ||
| 46 | #undef FTRACE_ENTRY | 56 | #undef FTRACE_ENTRY |
| 47 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \ | 57 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter) \ |
| 48 | struct ____ftrace_##name { \ | 58 | struct ____ftrace_##name { \ |
| 49 | tstruct \ | 59 | tstruct \ |
| 50 | }; \ | 60 | }; \ |
| 51 | static void __always_unused ____ftrace_check_##name(void) \ | 61 | static void __always_unused ____ftrace_check_##name(void) \ |
| 52 | { \ | 62 | { \ |
| 53 | struct ____ftrace_##name *__entry = NULL; \ | 63 | struct ____ftrace_##name *__entry = NULL; \ |
| 54 | \ | 64 | \ |
| 55 | /* force compile-time check on F_printk() */ \ | 65 | /* force compile-time check on F_printk() */ \ |
| 56 | printk(print); \ | 66 | printk(print); \ |
| 57 | } | 67 | } |
| 58 | 68 | ||
| 59 | #undef FTRACE_ENTRY_DUP | 69 | #undef FTRACE_ENTRY_DUP |
| 60 | #define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print) \ | 70 | #define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print, filter) \ |
| 61 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print)) | 71 | FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \ |
| 72 | filter) | ||
| 62 | 73 | ||
| 63 | #include "trace_entries.h" | 74 | #include "trace_entries.h" |
| 64 | 75 | ||
| @@ -67,7 +78,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 67 | ret = trace_define_field(event_call, #type, #item, \ | 78 | ret = trace_define_field(event_call, #type, #item, \ |
| 68 | offsetof(typeof(field), item), \ | 79 | offsetof(typeof(field), item), \ |
| 69 | sizeof(field.item), \ | 80 | sizeof(field.item), \ |
| 70 | is_signed_type(type), FILTER_OTHER); \ | 81 | is_signed_type(type), filter_type); \ |
| 71 | if (ret) \ | 82 | if (ret) \ |
| 72 | return ret; | 83 | return ret; |
| 73 | 84 | ||
| @@ -77,7 +88,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 77 | offsetof(typeof(field), \ | 88 | offsetof(typeof(field), \ |
| 78 | container.item), \ | 89 | container.item), \ |
| 79 | sizeof(field.container.item), \ | 90 | sizeof(field.container.item), \ |
| 80 | is_signed_type(type), FILTER_OTHER); \ | 91 | is_signed_type(type), filter_type); \ |
| 81 | if (ret) \ | 92 | if (ret) \ |
| 82 | return ret; | 93 | return ret; |
| 83 | 94 | ||
| @@ -91,7 +102,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 91 | ret = trace_define_field(event_call, event_storage, #item, \ | 102 | ret = trace_define_field(event_call, event_storage, #item, \ |
| 92 | offsetof(typeof(field), item), \ | 103 | offsetof(typeof(field), item), \ |
| 93 | sizeof(field.item), \ | 104 | sizeof(field.item), \ |
| 94 | is_signed_type(type), FILTER_OTHER); \ | 105 | is_signed_type(type), filter_type); \ |
| 95 | mutex_unlock(&event_storage_mutex); \ | 106 | mutex_unlock(&event_storage_mutex); \ |
| 96 | if (ret) \ | 107 | if (ret) \ |
| 97 | return ret; \ | 108 | return ret; \ |
| @@ -104,7 +115,7 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 104 | offsetof(typeof(field), \ | 115 | offsetof(typeof(field), \ |
| 105 | container.item), \ | 116 | container.item), \ |
| 106 | sizeof(field.container.item), \ | 117 | sizeof(field.container.item), \ |
| 107 | is_signed_type(type), FILTER_OTHER); \ | 118 | is_signed_type(type), filter_type); \ |
| 108 | if (ret) \ | 119 | if (ret) \ |
| 109 | return ret; | 120 | return ret; |
| 110 | 121 | ||
| @@ -112,17 +123,18 @@ static void __always_unused ____ftrace_check_##name(void) \ | |||
| 112 | #define __dynamic_array(type, item) \ | 123 | #define __dynamic_array(type, item) \ |
| 113 | ret = trace_define_field(event_call, #type, #item, \ | 124 | ret = trace_define_field(event_call, #type, #item, \ |
| 114 | offsetof(typeof(field), item), \ | 125 | offsetof(typeof(field), item), \ |
| 115 | 0, is_signed_type(type), FILTER_OTHER);\ | 126 | 0, is_signed_type(type), filter_type);\ |
| 116 | if (ret) \ | 127 | if (ret) \ |
| 117 | return ret; | 128 | return ret; |
| 118 | 129 | ||
| 119 | #undef FTRACE_ENTRY | 130 | #undef FTRACE_ENTRY |
| 120 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \ | 131 | #define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter) \ |
| 121 | int \ | 132 | int \ |
| 122 | ftrace_define_fields_##name(struct ftrace_event_call *event_call) \ | 133 | ftrace_define_fields_##name(struct ftrace_event_call *event_call) \ |
| 123 | { \ | 134 | { \ |
| 124 | struct struct_name field; \ | 135 | struct struct_name field; \ |
| 125 | int ret; \ | 136 | int ret; \ |
| 137 | int filter_type = filter; \ | ||
| 126 | \ | 138 | \ |
| 127 | tstruct; \ | 139 | tstruct; \ |
| 128 | \ | 140 | \ |
| @@ -150,15 +162,17 @@ ftrace_define_fields_##name(struct ftrace_event_call *event_call) \ | |||
| 150 | #define __dynamic_array(type, item) | 162 | #define __dynamic_array(type, item) |
| 151 | 163 | ||
| 152 | #undef F_printk | 164 | #undef F_printk |
| 153 | #define F_printk(fmt, args...) #fmt ", " __stringify(args) | 165 | #define F_printk(fmt, args...) __stringify(fmt) ", " __stringify(args) |
| 154 | 166 | ||
| 155 | #undef FTRACE_ENTRY | 167 | #undef FTRACE_ENTRY_REG |
| 156 | #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print) \ | 168 | #define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, filter,\ |
| 169 | regfn) \ | ||
| 157 | \ | 170 | \ |
| 158 | struct ftrace_event_class event_class_ftrace_##call = { \ | 171 | struct ftrace_event_class event_class_ftrace_##call = { \ |
| 159 | .system = __stringify(TRACE_SYSTEM), \ | 172 | .system = __stringify(TRACE_SYSTEM), \ |
| 160 | .define_fields = ftrace_define_fields_##call, \ | 173 | .define_fields = ftrace_define_fields_##call, \ |
| 161 | .fields = LIST_HEAD_INIT(event_class_ftrace_##call.fields),\ | 174 | .fields = LIST_HEAD_INIT(event_class_ftrace_##call.fields),\ |
| 175 | .reg = regfn, \ | ||
| 162 | }; \ | 176 | }; \ |
| 163 | \ | 177 | \ |
| 164 | struct ftrace_event_call __used event_##call = { \ | 178 | struct ftrace_event_call __used event_##call = { \ |
| @@ -170,4 +184,14 @@ struct ftrace_event_call __used event_##call = { \ | |||
| 170 | struct ftrace_event_call __used \ | 184 | struct ftrace_event_call __used \ |
| 171 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call; | 185 | __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call; |
| 172 | 186 | ||
| 187 | #undef FTRACE_ENTRY | ||
| 188 | #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print, filter) \ | ||
| 189 | FTRACE_ENTRY_REG(call, struct_name, etype, \ | ||
| 190 | PARAMS(tstruct), PARAMS(print), filter, NULL) | ||
| 191 | |||
| 192 | int ftrace_event_is_function(struct ftrace_event_call *call) | ||
| 193 | { | ||
| 194 | return call == &event_function; | ||
| 195 | } | ||
| 196 | |||
| 173 | #include "trace_entries.h" | 197 | #include "trace_entries.h" |
