diff options
Diffstat (limited to 'kernel/trace/ftrace.c')
| -rw-r--r-- | kernel/trace/ftrace.c | 162 |
1 files changed, 90 insertions, 72 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index cd7f76d1eb86..1fd4b9479210 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -237,14 +237,13 @@ static int control_ops_alloc(struct ftrace_ops *ops) | |||
| 237 | return 0; | 237 | return 0; |
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | static void control_ops_free(struct ftrace_ops *ops) | ||
| 241 | { | ||
| 242 | free_percpu(ops->disabled); | ||
| 243 | } | ||
| 244 | |||
| 245 | static void update_global_ops(void) | 240 | static void update_global_ops(void) |
| 246 | { | 241 | { |
| 247 | ftrace_func_t func; | 242 | ftrace_func_t func = ftrace_global_list_func; |
| 243 | void *private = NULL; | ||
| 244 | |||
| 245 | /* The list has its own recursion protection. */ | ||
| 246 | global_ops.flags |= FTRACE_OPS_FL_RECURSION_SAFE; | ||
| 248 | 247 | ||
| 249 | /* | 248 | /* |
| 250 | * If there's only one function registered, then call that | 249 | * If there's only one function registered, then call that |
| @@ -254,23 +253,17 @@ static void update_global_ops(void) | |||
| 254 | if (ftrace_global_list == &ftrace_list_end || | 253 | if (ftrace_global_list == &ftrace_list_end || |
| 255 | ftrace_global_list->next == &ftrace_list_end) { | 254 | ftrace_global_list->next == &ftrace_list_end) { |
| 256 | func = ftrace_global_list->func; | 255 | func = ftrace_global_list->func; |
| 256 | private = ftrace_global_list->private; | ||
| 257 | /* | 257 | /* |
| 258 | * As we are calling the function directly. | 258 | * As we are calling the function directly. |
| 259 | * If it does not have recursion protection, | 259 | * If it does not have recursion protection, |
| 260 | * the function_trace_op needs to be updated | 260 | * the function_trace_op needs to be updated |
| 261 | * accordingly. | 261 | * accordingly. |
| 262 | */ | 262 | */ |
| 263 | if (ftrace_global_list->flags & FTRACE_OPS_FL_RECURSION_SAFE) | 263 | if (!(ftrace_global_list->flags & FTRACE_OPS_FL_RECURSION_SAFE)) |
| 264 | global_ops.flags |= FTRACE_OPS_FL_RECURSION_SAFE; | ||
| 265 | else | ||
| 266 | global_ops.flags &= ~FTRACE_OPS_FL_RECURSION_SAFE; | 264 | global_ops.flags &= ~FTRACE_OPS_FL_RECURSION_SAFE; |
| 267 | } else { | ||
| 268 | func = ftrace_global_list_func; | ||
| 269 | /* The list has its own recursion protection. */ | ||
| 270 | global_ops.flags |= FTRACE_OPS_FL_RECURSION_SAFE; | ||
| 271 | } | 265 | } |
| 272 | 266 | ||
| 273 | |||
| 274 | /* If we filter on pids, update to use the pid function */ | 267 | /* If we filter on pids, update to use the pid function */ |
| 275 | if (!list_empty(&ftrace_pids)) { | 268 | if (!list_empty(&ftrace_pids)) { |
| 276 | set_ftrace_pid_function(func); | 269 | set_ftrace_pid_function(func); |
| @@ -278,6 +271,7 @@ static void update_global_ops(void) | |||
| 278 | } | 271 | } |
| 279 | 272 | ||
| 280 | global_ops.func = func; | 273 | global_ops.func = func; |
| 274 | global_ops.private = private; | ||
| 281 | } | 275 | } |
| 282 | 276 | ||
| 283 | static void ftrace_sync(struct work_struct *work) | 277 | static void ftrace_sync(struct work_struct *work) |
| @@ -437,6 +431,9 @@ static int remove_ftrace_list_ops(struct ftrace_ops **list, | |||
| 437 | 431 | ||
| 438 | static int __register_ftrace_function(struct ftrace_ops *ops) | 432 | static int __register_ftrace_function(struct ftrace_ops *ops) |
| 439 | { | 433 | { |
| 434 | if (ops->flags & FTRACE_OPS_FL_DELETED) | ||
| 435 | return -EINVAL; | ||
| 436 | |||
| 440 | if (FTRACE_WARN_ON(ops == &global_ops)) | 437 | if (FTRACE_WARN_ON(ops == &global_ops)) |
| 441 | return -EINVAL; | 438 | return -EINVAL; |
| 442 | 439 | ||
| @@ -1172,8 +1169,6 @@ struct ftrace_page { | |||
| 1172 | int size; | 1169 | int size; |
| 1173 | }; | 1170 | }; |
| 1174 | 1171 | ||
| 1175 | static struct ftrace_page *ftrace_new_pgs; | ||
| 1176 | |||
| 1177 | #define ENTRY_SIZE sizeof(struct dyn_ftrace) | 1172 | #define ENTRY_SIZE sizeof(struct dyn_ftrace) |
| 1178 | #define ENTRIES_PER_PAGE (PAGE_SIZE / ENTRY_SIZE) | 1173 | #define ENTRIES_PER_PAGE (PAGE_SIZE / ENTRY_SIZE) |
| 1179 | 1174 | ||
| @@ -1560,7 +1555,7 @@ unsigned long ftrace_location(unsigned long ip) | |||
| 1560 | * the function tracer. It checks the ftrace internal tables to | 1555 | * the function tracer. It checks the ftrace internal tables to |
| 1561 | * determine if the address belongs or not. | 1556 | * determine if the address belongs or not. |
| 1562 | */ | 1557 | */ |
| 1563 | int ftrace_text_reserved(void *start, void *end) | 1558 | int ftrace_text_reserved(const void *start, const void *end) |
| 1564 | { | 1559 | { |
| 1565 | unsigned long ret; | 1560 | unsigned long ret; |
| 1566 | 1561 | ||
| @@ -1994,6 +1989,7 @@ int __weak ftrace_arch_code_modify_post_process(void) | |||
| 1994 | void ftrace_modify_all_code(int command) | 1989 | void ftrace_modify_all_code(int command) |
| 1995 | { | 1990 | { |
| 1996 | int update = command & FTRACE_UPDATE_TRACE_FUNC; | 1991 | int update = command & FTRACE_UPDATE_TRACE_FUNC; |
| 1992 | int err = 0; | ||
| 1997 | 1993 | ||
| 1998 | /* | 1994 | /* |
| 1999 | * If the ftrace_caller calls a ftrace_ops func directly, | 1995 | * If the ftrace_caller calls a ftrace_ops func directly, |
| @@ -2005,8 +2001,11 @@ void ftrace_modify_all_code(int command) | |||
| 2005 | * to make sure the ops are having the right functions | 2001 | * to make sure the ops are having the right functions |
| 2006 | * traced. | 2002 | * traced. |
| 2007 | */ | 2003 | */ |
| 2008 | if (update) | 2004 | if (update) { |
| 2009 | ftrace_update_ftrace_func(ftrace_ops_list_func); | 2005 | err = ftrace_update_ftrace_func(ftrace_ops_list_func); |
| 2006 | if (FTRACE_WARN_ON(err)) | ||
| 2007 | return; | ||
| 2008 | } | ||
| 2010 | 2009 | ||
| 2011 | if (command & FTRACE_UPDATE_CALLS) | 2010 | if (command & FTRACE_UPDATE_CALLS) |
| 2012 | ftrace_replace_code(1); | 2011 | ftrace_replace_code(1); |
| @@ -2019,13 +2018,16 @@ void ftrace_modify_all_code(int command) | |||
| 2019 | /* If irqs are disabled, we are in stop machine */ | 2018 | /* If irqs are disabled, we are in stop machine */ |
| 2020 | if (!irqs_disabled()) | 2019 | if (!irqs_disabled()) |
| 2021 | smp_call_function(ftrace_sync_ipi, NULL, 1); | 2020 | smp_call_function(ftrace_sync_ipi, NULL, 1); |
| 2022 | ftrace_update_ftrace_func(ftrace_trace_function); | 2021 | err = ftrace_update_ftrace_func(ftrace_trace_function); |
| 2022 | if (FTRACE_WARN_ON(err)) | ||
| 2023 | return; | ||
| 2023 | } | 2024 | } |
| 2024 | 2025 | ||
| 2025 | if (command & FTRACE_START_FUNC_RET) | 2026 | if (command & FTRACE_START_FUNC_RET) |
| 2026 | ftrace_enable_ftrace_graph_caller(); | 2027 | err = ftrace_enable_ftrace_graph_caller(); |
| 2027 | else if (command & FTRACE_STOP_FUNC_RET) | 2028 | else if (command & FTRACE_STOP_FUNC_RET) |
| 2028 | ftrace_disable_ftrace_graph_caller(); | 2029 | err = ftrace_disable_ftrace_graph_caller(); |
| 2030 | FTRACE_WARN_ON(err); | ||
| 2029 | } | 2031 | } |
| 2030 | 2032 | ||
| 2031 | static int __ftrace_modify_code(void *data) | 2033 | static int __ftrace_modify_code(void *data) |
| @@ -2093,6 +2095,11 @@ static ftrace_func_t saved_ftrace_func; | |||
| 2093 | static int ftrace_start_up; | 2095 | static int ftrace_start_up; |
| 2094 | static int global_start_up; | 2096 | static int global_start_up; |
| 2095 | 2097 | ||
| 2098 | static void control_ops_free(struct ftrace_ops *ops) | ||
| 2099 | { | ||
| 2100 | free_percpu(ops->disabled); | ||
| 2101 | } | ||
| 2102 | |||
| 2096 | static void ftrace_startup_enable(int command) | 2103 | static void ftrace_startup_enable(int command) |
| 2097 | { | 2104 | { |
| 2098 | if (saved_ftrace_func != ftrace_trace_function) { | 2105 | if (saved_ftrace_func != ftrace_trace_function) { |
| @@ -2244,7 +2251,6 @@ static void ftrace_shutdown_sysctl(void) | |||
| 2244 | } | 2251 | } |
| 2245 | 2252 | ||
| 2246 | static cycle_t ftrace_update_time; | 2253 | static cycle_t ftrace_update_time; |
| 2247 | static unsigned long ftrace_update_cnt; | ||
| 2248 | unsigned long ftrace_update_tot_cnt; | 2254 | unsigned long ftrace_update_tot_cnt; |
| 2249 | 2255 | ||
| 2250 | static inline int ops_traces_mod(struct ftrace_ops *ops) | 2256 | static inline int ops_traces_mod(struct ftrace_ops *ops) |
| @@ -2300,11 +2306,12 @@ static int referenced_filters(struct dyn_ftrace *rec) | |||
| 2300 | return cnt; | 2306 | return cnt; |
| 2301 | } | 2307 | } |
| 2302 | 2308 | ||
| 2303 | static int ftrace_update_code(struct module *mod) | 2309 | static int ftrace_update_code(struct module *mod, struct ftrace_page *new_pgs) |
| 2304 | { | 2310 | { |
| 2305 | struct ftrace_page *pg; | 2311 | struct ftrace_page *pg; |
| 2306 | struct dyn_ftrace *p; | 2312 | struct dyn_ftrace *p; |
| 2307 | cycle_t start, stop; | 2313 | cycle_t start, stop; |
| 2314 | unsigned long update_cnt = 0; | ||
| 2308 | unsigned long ref = 0; | 2315 | unsigned long ref = 0; |
| 2309 | bool test = false; | 2316 | bool test = false; |
| 2310 | int i; | 2317 | int i; |
| @@ -2330,9 +2337,8 @@ static int ftrace_update_code(struct module *mod) | |||
| 2330 | } | 2337 | } |
| 2331 | 2338 | ||
| 2332 | start = ftrace_now(raw_smp_processor_id()); | 2339 | start = ftrace_now(raw_smp_processor_id()); |
| 2333 | ftrace_update_cnt = 0; | ||
| 2334 | 2340 | ||
| 2335 | for (pg = ftrace_new_pgs; pg; pg = pg->next) { | 2341 | for (pg = new_pgs; pg; pg = pg->next) { |
| 2336 | 2342 | ||
| 2337 | for (i = 0; i < pg->index; i++) { | 2343 | for (i = 0; i < pg->index; i++) { |
| 2338 | int cnt = ref; | 2344 | int cnt = ref; |
| @@ -2353,7 +2359,7 @@ static int ftrace_update_code(struct module *mod) | |||
| 2353 | if (!ftrace_code_disable(mod, p)) | 2359 | if (!ftrace_code_disable(mod, p)) |
| 2354 | break; | 2360 | break; |
| 2355 | 2361 | ||
| 2356 | ftrace_update_cnt++; | 2362 | update_cnt++; |
| 2357 | 2363 | ||
| 2358 | /* | 2364 | /* |
| 2359 | * If the tracing is enabled, go ahead and enable the record. | 2365 | * If the tracing is enabled, go ahead and enable the record. |
| @@ -2372,11 +2378,9 @@ static int ftrace_update_code(struct module *mod) | |||
| 2372 | } | 2378 | } |
| 2373 | } | 2379 | } |
| 2374 | 2380 | ||
| 2375 | ftrace_new_pgs = NULL; | ||
| 2376 | |||
| 2377 | stop = ftrace_now(raw_smp_processor_id()); | 2381 | stop = ftrace_now(raw_smp_processor_id()); |
| 2378 | ftrace_update_time = stop - start; | 2382 | ftrace_update_time = stop - start; |
| 2379 | ftrace_update_tot_cnt += ftrace_update_cnt; | 2383 | ftrace_update_tot_cnt += update_cnt; |
| 2380 | 2384 | ||
| 2381 | return 0; | 2385 | return 0; |
| 2382 | } | 2386 | } |
| @@ -2468,22 +2472,6 @@ ftrace_allocate_pages(unsigned long num_to_init) | |||
| 2468 | return NULL; | 2472 | return NULL; |
| 2469 | } | 2473 | } |
| 2470 | 2474 | ||
| 2471 | static int __init ftrace_dyn_table_alloc(unsigned long num_to_init) | ||
| 2472 | { | ||
| 2473 | int cnt; | ||
| 2474 | |||
| 2475 | if (!num_to_init) { | ||
| 2476 | pr_info("ftrace: No functions to be traced?\n"); | ||
| 2477 | return -1; | ||
| 2478 | } | ||
| 2479 | |||
| 2480 | cnt = num_to_init / ENTRIES_PER_PAGE; | ||
| 2481 | pr_info("ftrace: allocating %ld entries in %d pages\n", | ||
| 2482 | num_to_init, cnt + 1); | ||
| 2483 | |||
| 2484 | return 0; | ||
| 2485 | } | ||
| 2486 | |||
| 2487 | #define FTRACE_BUFF_MAX (KSYM_SYMBOL_LEN+4) /* room for wildcards */ | 2475 | #define FTRACE_BUFF_MAX (KSYM_SYMBOL_LEN+4) /* room for wildcards */ |
| 2488 | 2476 | ||
| 2489 | struct ftrace_iterator { | 2477 | struct ftrace_iterator { |
| @@ -2871,7 +2859,9 @@ ftrace_regex_open(struct ftrace_ops *ops, int flag, | |||
| 2871 | static int | 2859 | static int |
| 2872 | ftrace_filter_open(struct inode *inode, struct file *file) | 2860 | ftrace_filter_open(struct inode *inode, struct file *file) |
| 2873 | { | 2861 | { |
| 2874 | return ftrace_regex_open(&global_ops, | 2862 | struct ftrace_ops *ops = inode->i_private; |
| 2863 | |||
| 2864 | return ftrace_regex_open(ops, | ||
| 2875 | FTRACE_ITER_FILTER | FTRACE_ITER_DO_HASH, | 2865 | FTRACE_ITER_FILTER | FTRACE_ITER_DO_HASH, |
| 2876 | inode, file); | 2866 | inode, file); |
| 2877 | } | 2867 | } |
| @@ -2879,7 +2869,9 @@ ftrace_filter_open(struct inode *inode, struct file *file) | |||
| 2879 | static int | 2869 | static int |
| 2880 | ftrace_notrace_open(struct inode *inode, struct file *file) | 2870 | ftrace_notrace_open(struct inode *inode, struct file *file) |
| 2881 | { | 2871 | { |
| 2882 | return ftrace_regex_open(&global_ops, FTRACE_ITER_NOTRACE, | 2872 | struct ftrace_ops *ops = inode->i_private; |
| 2873 | |||
| 2874 | return ftrace_regex_open(ops, FTRACE_ITER_NOTRACE, | ||
| 2883 | inode, file); | 2875 | inode, file); |
| 2884 | } | 2876 | } |
| 2885 | 2877 | ||
| @@ -4109,6 +4101,36 @@ static const struct file_operations ftrace_graph_notrace_fops = { | |||
| 4109 | }; | 4101 | }; |
| 4110 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | 4102 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |
| 4111 | 4103 | ||
| 4104 | void ftrace_create_filter_files(struct ftrace_ops *ops, | ||
| 4105 | struct dentry *parent) | ||
| 4106 | { | ||
| 4107 | |||
| 4108 | trace_create_file("set_ftrace_filter", 0644, parent, | ||
| 4109 | ops, &ftrace_filter_fops); | ||
| 4110 | |||
| 4111 | trace_create_file("set_ftrace_notrace", 0644, parent, | ||
| 4112 | ops, &ftrace_notrace_fops); | ||
| 4113 | } | ||
| 4114 | |||
| 4115 | /* | ||
| 4116 | * The name "destroy_filter_files" is really a misnomer. Although | ||
| 4117 | * in the future, it may actualy delete the files, but this is | ||
| 4118 | * really intended to make sure the ops passed in are disabled | ||
| 4119 | * and that when this function returns, the caller is free to | ||
| 4120 | * free the ops. | ||
| 4121 | * | ||
| 4122 | * The "destroy" name is only to match the "create" name that this | ||
| 4123 | * should be paired with. | ||
| 4124 | */ | ||
| 4125 | void ftrace_destroy_filter_files(struct ftrace_ops *ops) | ||
| 4126 | { | ||
| 4127 | mutex_lock(&ftrace_lock); | ||
| 4128 | if (ops->flags & FTRACE_OPS_FL_ENABLED) | ||
| 4129 | ftrace_shutdown(ops, 0); | ||
| 4130 | ops->flags |= FTRACE_OPS_FL_DELETED; | ||
| 4131 | mutex_unlock(&ftrace_lock); | ||
| 4132 | } | ||
| 4133 | |||
| 4112 | static __init int ftrace_init_dyn_debugfs(struct dentry *d_tracer) | 4134 | static __init int ftrace_init_dyn_debugfs(struct dentry *d_tracer) |
| 4113 | { | 4135 | { |
| 4114 | 4136 | ||
| @@ -4118,11 +4140,7 @@ static __init int ftrace_init_dyn_debugfs(struct dentry *d_tracer) | |||
| 4118 | trace_create_file("enabled_functions", 0444, | 4140 | trace_create_file("enabled_functions", 0444, |
| 4119 | d_tracer, NULL, &ftrace_enabled_fops); | 4141 | d_tracer, NULL, &ftrace_enabled_fops); |
| 4120 | 4142 | ||
| 4121 | trace_create_file("set_ftrace_filter", 0644, d_tracer, | 4143 | ftrace_create_filter_files(&global_ops, d_tracer); |
| 4122 | NULL, &ftrace_filter_fops); | ||
| 4123 | |||
| 4124 | trace_create_file("set_ftrace_notrace", 0644, d_tracer, | ||
| 4125 | NULL, &ftrace_notrace_fops); | ||
| 4126 | 4144 | ||
| 4127 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 4145 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
| 4128 | trace_create_file("set_graph_function", 0444, d_tracer, | 4146 | trace_create_file("set_graph_function", 0444, d_tracer, |
| @@ -4238,9 +4256,6 @@ static int ftrace_process_locs(struct module *mod, | |||
| 4238 | /* Assign the last page to ftrace_pages */ | 4256 | /* Assign the last page to ftrace_pages */ |
| 4239 | ftrace_pages = pg; | 4257 | ftrace_pages = pg; |
| 4240 | 4258 | ||
| 4241 | /* These new locations need to be initialized */ | ||
| 4242 | ftrace_new_pgs = start_pg; | ||
| 4243 | |||
| 4244 | /* | 4259 | /* |
| 4245 | * We only need to disable interrupts on start up | 4260 | * We only need to disable interrupts on start up |
| 4246 | * because we are modifying code that an interrupt | 4261 | * because we are modifying code that an interrupt |
| @@ -4251,7 +4266,7 @@ static int ftrace_process_locs(struct module *mod, | |||
| 4251 | */ | 4266 | */ |
| 4252 | if (!mod) | 4267 | if (!mod) |
| 4253 | local_irq_save(flags); | 4268 | local_irq_save(flags); |
| 4254 | ftrace_update_code(mod); | 4269 | ftrace_update_code(mod, start_pg); |
| 4255 | if (!mod) | 4270 | if (!mod) |
| 4256 | local_irq_restore(flags); | 4271 | local_irq_restore(flags); |
| 4257 | ret = 0; | 4272 | ret = 0; |
| @@ -4360,30 +4375,27 @@ struct notifier_block ftrace_module_exit_nb = { | |||
| 4360 | .priority = INT_MIN, /* Run after anything that can remove kprobes */ | 4375 | .priority = INT_MIN, /* Run after anything that can remove kprobes */ |
| 4361 | }; | 4376 | }; |
| 4362 | 4377 | ||
| 4363 | extern unsigned long __start_mcount_loc[]; | ||
| 4364 | extern unsigned long __stop_mcount_loc[]; | ||
| 4365 | |||
| 4366 | void __init ftrace_init(void) | 4378 | void __init ftrace_init(void) |
| 4367 | { | 4379 | { |
| 4368 | unsigned long count, addr, flags; | 4380 | extern unsigned long __start_mcount_loc[]; |
| 4381 | extern unsigned long __stop_mcount_loc[]; | ||
| 4382 | unsigned long count, flags; | ||
| 4369 | int ret; | 4383 | int ret; |
| 4370 | 4384 | ||
| 4371 | /* Keep the ftrace pointer to the stub */ | ||
| 4372 | addr = (unsigned long)ftrace_stub; | ||
| 4373 | |||
| 4374 | local_irq_save(flags); | 4385 | local_irq_save(flags); |
| 4375 | ftrace_dyn_arch_init(&addr); | 4386 | ret = ftrace_dyn_arch_init(); |
| 4376 | local_irq_restore(flags); | 4387 | local_irq_restore(flags); |
| 4377 | 4388 | if (ret) | |
| 4378 | /* ftrace_dyn_arch_init places the return code in addr */ | ||
| 4379 | if (addr) | ||
| 4380 | goto failed; | 4389 | goto failed; |
| 4381 | 4390 | ||
| 4382 | count = __stop_mcount_loc - __start_mcount_loc; | 4391 | count = __stop_mcount_loc - __start_mcount_loc; |
| 4383 | 4392 | if (!count) { | |
| 4384 | ret = ftrace_dyn_table_alloc(count); | 4393 | pr_info("ftrace: No functions to be traced?\n"); |
| 4385 | if (ret) | ||
| 4386 | goto failed; | 4394 | goto failed; |
| 4395 | } | ||
| 4396 | |||
| 4397 | pr_info("ftrace: allocating %ld entries in %ld pages\n", | ||
| 4398 | count, count / ENTRIES_PER_PAGE + 1); | ||
| 4387 | 4399 | ||
| 4388 | last_ftrace_enabled = ftrace_enabled = 1; | 4400 | last_ftrace_enabled = ftrace_enabled = 1; |
| 4389 | 4401 | ||
| @@ -4431,7 +4443,13 @@ static inline void ftrace_startup_enable(int command) { } | |||
| 4431 | (ops)->flags |= FTRACE_OPS_FL_ENABLED; \ | 4443 | (ops)->flags |= FTRACE_OPS_FL_ENABLED; \ |
| 4432 | ___ret; \ | 4444 | ___ret; \ |
| 4433 | }) | 4445 | }) |
| 4434 | # define ftrace_shutdown(ops, command) __unregister_ftrace_function(ops) | 4446 | # define ftrace_shutdown(ops, command) \ |
| 4447 | ({ \ | ||
| 4448 | int ___ret = __unregister_ftrace_function(ops); \ | ||
| 4449 | if (!___ret) \ | ||
| 4450 | (ops)->flags &= ~FTRACE_OPS_FL_ENABLED; \ | ||
| 4451 | ___ret; \ | ||
| 4452 | }) | ||
| 4435 | 4453 | ||
| 4436 | # define ftrace_startup_sysctl() do { } while (0) | 4454 | # define ftrace_startup_sysctl() do { } while (0) |
| 4437 | # define ftrace_shutdown_sysctl() do { } while (0) | 4455 | # define ftrace_shutdown_sysctl() do { } while (0) |
