diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/extable.c | 4 | ||||
| -rw-r--r-- | kernel/padata.c | 9 | ||||
| -rw-r--r-- | kernel/trace/ftrace.c | 64 |
3 files changed, 41 insertions, 36 deletions
diff --git a/kernel/extable.c b/kernel/extable.c index 832cb28105bb..763faf037ec1 100644 --- a/kernel/extable.c +++ b/kernel/extable.c | |||
| @@ -61,7 +61,7 @@ const struct exception_table_entry *search_exception_tables(unsigned long addr) | |||
| 61 | static inline int init_kernel_text(unsigned long addr) | 61 | static inline int init_kernel_text(unsigned long addr) |
| 62 | { | 62 | { |
| 63 | if (addr >= (unsigned long)_sinittext && | 63 | if (addr >= (unsigned long)_sinittext && |
| 64 | addr <= (unsigned long)_einittext) | 64 | addr < (unsigned long)_einittext) |
| 65 | return 1; | 65 | return 1; |
| 66 | return 0; | 66 | return 0; |
| 67 | } | 67 | } |
| @@ -69,7 +69,7 @@ static inline int init_kernel_text(unsigned long addr) | |||
| 69 | int core_kernel_text(unsigned long addr) | 69 | int core_kernel_text(unsigned long addr) |
| 70 | { | 70 | { |
| 71 | if (addr >= (unsigned long)_stext && | 71 | if (addr >= (unsigned long)_stext && |
| 72 | addr <= (unsigned long)_etext) | 72 | addr < (unsigned long)_etext) |
| 73 | return 1; | 73 | return 1; |
| 74 | 74 | ||
| 75 | if (system_state == SYSTEM_BOOTING && | 75 | if (system_state == SYSTEM_BOOTING && |
diff --git a/kernel/padata.c b/kernel/padata.c index 07af2c95dcfe..2abd25d79cc8 100644 --- a/kernel/padata.c +++ b/kernel/padata.c | |||
| @@ -46,6 +46,7 @@ static int padata_index_to_cpu(struct parallel_data *pd, int cpu_index) | |||
| 46 | 46 | ||
| 47 | static int padata_cpu_hash(struct parallel_data *pd) | 47 | static int padata_cpu_hash(struct parallel_data *pd) |
| 48 | { | 48 | { |
| 49 | unsigned int seq_nr; | ||
| 49 | int cpu_index; | 50 | int cpu_index; |
| 50 | 51 | ||
| 51 | /* | 52 | /* |
| @@ -53,10 +54,8 @@ static int padata_cpu_hash(struct parallel_data *pd) | |||
| 53 | * seq_nr mod. number of cpus in use. | 54 | * seq_nr mod. number of cpus in use. |
| 54 | */ | 55 | */ |
| 55 | 56 | ||
| 56 | spin_lock(&pd->seq_lock); | 57 | seq_nr = atomic_inc_return(&pd->seq_nr); |
| 57 | cpu_index = pd->seq_nr % cpumask_weight(pd->cpumask.pcpu); | 58 | cpu_index = seq_nr % cpumask_weight(pd->cpumask.pcpu); |
| 58 | pd->seq_nr++; | ||
| 59 | spin_unlock(&pd->seq_lock); | ||
| 60 | 59 | ||
| 61 | return padata_index_to_cpu(pd, cpu_index); | 60 | return padata_index_to_cpu(pd, cpu_index); |
| 62 | } | 61 | } |
| @@ -429,7 +428,7 @@ static struct parallel_data *padata_alloc_pd(struct padata_instance *pinst, | |||
| 429 | padata_init_pqueues(pd); | 428 | padata_init_pqueues(pd); |
| 430 | padata_init_squeues(pd); | 429 | padata_init_squeues(pd); |
| 431 | setup_timer(&pd->timer, padata_reorder_timer, (unsigned long)pd); | 430 | setup_timer(&pd->timer, padata_reorder_timer, (unsigned long)pd); |
| 432 | pd->seq_nr = 0; | 431 | atomic_set(&pd->seq_nr, -1); |
| 433 | atomic_set(&pd->reorder_objects, 0); | 432 | atomic_set(&pd->reorder_objects, 0); |
| 434 | atomic_set(&pd->refcnt, 0); | 433 | atomic_set(&pd->refcnt, 0); |
| 435 | pd->pinst = pinst; | 434 | pd->pinst = pinst; |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 22fa55696760..0e9f9eaade2f 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -367,9 +367,6 @@ static int remove_ftrace_list_ops(struct ftrace_ops **list, | |||
| 367 | 367 | ||
| 368 | static int __register_ftrace_function(struct ftrace_ops *ops) | 368 | static int __register_ftrace_function(struct ftrace_ops *ops) |
| 369 | { | 369 | { |
| 370 | if (unlikely(ftrace_disabled)) | ||
| 371 | return -ENODEV; | ||
| 372 | |||
| 373 | if (FTRACE_WARN_ON(ops == &global_ops)) | 370 | if (FTRACE_WARN_ON(ops == &global_ops)) |
| 374 | return -EINVAL; | 371 | return -EINVAL; |
| 375 | 372 | ||
| @@ -428,9 +425,6 @@ static int __unregister_ftrace_function(struct ftrace_ops *ops) | |||
| 428 | { | 425 | { |
| 429 | int ret; | 426 | int ret; |
| 430 | 427 | ||
| 431 | if (ftrace_disabled) | ||
| 432 | return -ENODEV; | ||
| 433 | |||
| 434 | if (WARN_ON(!(ops->flags & FTRACE_OPS_FL_ENABLED))) | 428 | if (WARN_ON(!(ops->flags & FTRACE_OPS_FL_ENABLED))) |
| 435 | return -EBUSY; | 429 | return -EBUSY; |
| 436 | 430 | ||
| @@ -2088,10 +2082,15 @@ static void ftrace_startup_enable(int command) | |||
| 2088 | static int ftrace_startup(struct ftrace_ops *ops, int command) | 2082 | static int ftrace_startup(struct ftrace_ops *ops, int command) |
| 2089 | { | 2083 | { |
| 2090 | bool hash_enable = true; | 2084 | bool hash_enable = true; |
| 2085 | int ret; | ||
| 2091 | 2086 | ||
| 2092 | if (unlikely(ftrace_disabled)) | 2087 | if (unlikely(ftrace_disabled)) |
| 2093 | return -ENODEV; | 2088 | return -ENODEV; |
| 2094 | 2089 | ||
| 2090 | ret = __register_ftrace_function(ops); | ||
| 2091 | if (ret) | ||
| 2092 | return ret; | ||
| 2093 | |||
| 2095 | ftrace_start_up++; | 2094 | ftrace_start_up++; |
| 2096 | command |= FTRACE_UPDATE_CALLS; | 2095 | command |= FTRACE_UPDATE_CALLS; |
| 2097 | 2096 | ||
| @@ -2113,12 +2112,17 @@ static int ftrace_startup(struct ftrace_ops *ops, int command) | |||
| 2113 | return 0; | 2112 | return 0; |
| 2114 | } | 2113 | } |
| 2115 | 2114 | ||
| 2116 | static void ftrace_shutdown(struct ftrace_ops *ops, int command) | 2115 | static int ftrace_shutdown(struct ftrace_ops *ops, int command) |
| 2117 | { | 2116 | { |
| 2118 | bool hash_disable = true; | 2117 | bool hash_disable = true; |
| 2118 | int ret; | ||
| 2119 | 2119 | ||
| 2120 | if (unlikely(ftrace_disabled)) | 2120 | if (unlikely(ftrace_disabled)) |
| 2121 | return; | 2121 | return -ENODEV; |
| 2122 | |||
| 2123 | ret = __unregister_ftrace_function(ops); | ||
| 2124 | if (ret) | ||
| 2125 | return ret; | ||
| 2122 | 2126 | ||
| 2123 | ftrace_start_up--; | 2127 | ftrace_start_up--; |
| 2124 | /* | 2128 | /* |
| @@ -2153,9 +2157,10 @@ static void ftrace_shutdown(struct ftrace_ops *ops, int command) | |||
| 2153 | } | 2157 | } |
| 2154 | 2158 | ||
| 2155 | if (!command || !ftrace_enabled) | 2159 | if (!command || !ftrace_enabled) |
| 2156 | return; | 2160 | return 0; |
| 2157 | 2161 | ||
| 2158 | ftrace_run_update_code(command); | 2162 | ftrace_run_update_code(command); |
| 2163 | return 0; | ||
| 2159 | } | 2164 | } |
| 2160 | 2165 | ||
| 2161 | static void ftrace_startup_sysctl(void) | 2166 | static void ftrace_startup_sysctl(void) |
| @@ -3060,16 +3065,13 @@ static void __enable_ftrace_function_probe(void) | |||
| 3060 | if (i == FTRACE_FUNC_HASHSIZE) | 3065 | if (i == FTRACE_FUNC_HASHSIZE) |
| 3061 | return; | 3066 | return; |
| 3062 | 3067 | ||
| 3063 | ret = __register_ftrace_function(&trace_probe_ops); | 3068 | ret = ftrace_startup(&trace_probe_ops, 0); |
| 3064 | if (!ret) | ||
| 3065 | ret = ftrace_startup(&trace_probe_ops, 0); | ||
| 3066 | 3069 | ||
| 3067 | ftrace_probe_registered = 1; | 3070 | ftrace_probe_registered = 1; |
| 3068 | } | 3071 | } |
| 3069 | 3072 | ||
| 3070 | static void __disable_ftrace_function_probe(void) | 3073 | static void __disable_ftrace_function_probe(void) |
| 3071 | { | 3074 | { |
| 3072 | int ret; | ||
| 3073 | int i; | 3075 | int i; |
| 3074 | 3076 | ||
| 3075 | if (!ftrace_probe_registered) | 3077 | if (!ftrace_probe_registered) |
| @@ -3082,9 +3084,7 @@ static void __disable_ftrace_function_probe(void) | |||
| 3082 | } | 3084 | } |
| 3083 | 3085 | ||
| 3084 | /* no more funcs left */ | 3086 | /* no more funcs left */ |
| 3085 | ret = __unregister_ftrace_function(&trace_probe_ops); | 3087 | ftrace_shutdown(&trace_probe_ops, 0); |
| 3086 | if (!ret) | ||
| 3087 | ftrace_shutdown(&trace_probe_ops, 0); | ||
| 3088 | 3088 | ||
| 3089 | ftrace_probe_registered = 0; | 3089 | ftrace_probe_registered = 0; |
| 3090 | } | 3090 | } |
| @@ -4366,12 +4366,15 @@ core_initcall(ftrace_nodyn_init); | |||
| 4366 | static inline int ftrace_init_dyn_debugfs(struct dentry *d_tracer) { return 0; } | 4366 | static inline int ftrace_init_dyn_debugfs(struct dentry *d_tracer) { return 0; } |
| 4367 | static inline void ftrace_startup_enable(int command) { } | 4367 | static inline void ftrace_startup_enable(int command) { } |
| 4368 | /* Keep as macros so we do not need to define the commands */ | 4368 | /* Keep as macros so we do not need to define the commands */ |
| 4369 | # define ftrace_startup(ops, command) \ | 4369 | # define ftrace_startup(ops, command) \ |
| 4370 | ({ \ | 4370 | ({ \ |
| 4371 | (ops)->flags |= FTRACE_OPS_FL_ENABLED; \ | 4371 | int ___ret = __register_ftrace_function(ops); \ |
| 4372 | 0; \ | 4372 | if (!___ret) \ |
| 4373 | (ops)->flags |= FTRACE_OPS_FL_ENABLED; \ | ||
| 4374 | ___ret; \ | ||
| 4373 | }) | 4375 | }) |
| 4374 | # define ftrace_shutdown(ops, command) do { } while (0) | 4376 | # define ftrace_shutdown(ops, command) __unregister_ftrace_function(ops) |
| 4377 | |||
| 4375 | # define ftrace_startup_sysctl() do { } while (0) | 4378 | # define ftrace_startup_sysctl() do { } while (0) |
| 4376 | # define ftrace_shutdown_sysctl() do { } while (0) | 4379 | # define ftrace_shutdown_sysctl() do { } while (0) |
| 4377 | 4380 | ||
| @@ -4780,9 +4783,7 @@ int register_ftrace_function(struct ftrace_ops *ops) | |||
| 4780 | 4783 | ||
| 4781 | mutex_lock(&ftrace_lock); | 4784 | mutex_lock(&ftrace_lock); |
| 4782 | 4785 | ||
| 4783 | ret = __register_ftrace_function(ops); | 4786 | ret = ftrace_startup(ops, 0); |
| 4784 | if (!ret) | ||
| 4785 | ret = ftrace_startup(ops, 0); | ||
| 4786 | 4787 | ||
| 4787 | mutex_unlock(&ftrace_lock); | 4788 | mutex_unlock(&ftrace_lock); |
| 4788 | 4789 | ||
| @@ -4801,9 +4802,7 @@ int unregister_ftrace_function(struct ftrace_ops *ops) | |||
| 4801 | int ret; | 4802 | int ret; |
| 4802 | 4803 | ||
| 4803 | mutex_lock(&ftrace_lock); | 4804 | mutex_lock(&ftrace_lock); |
| 4804 | ret = __unregister_ftrace_function(ops); | 4805 | ret = ftrace_shutdown(ops, 0); |
| 4805 | if (!ret) | ||
| 4806 | ftrace_shutdown(ops, 0); | ||
| 4807 | mutex_unlock(&ftrace_lock); | 4806 | mutex_unlock(&ftrace_lock); |
| 4808 | 4807 | ||
| 4809 | return ret; | 4808 | return ret; |
| @@ -4997,6 +4996,13 @@ ftrace_suspend_notifier_call(struct notifier_block *bl, unsigned long state, | |||
| 4997 | return NOTIFY_DONE; | 4996 | return NOTIFY_DONE; |
| 4998 | } | 4997 | } |
| 4999 | 4998 | ||
| 4999 | /* Just a place holder for function graph */ | ||
| 5000 | static struct ftrace_ops fgraph_ops __read_mostly = { | ||
| 5001 | .func = ftrace_stub, | ||
| 5002 | .flags = FTRACE_OPS_FL_STUB | FTRACE_OPS_FL_GLOBAL | | ||
| 5003 | FTRACE_OPS_FL_RECURSION_SAFE, | ||
| 5004 | }; | ||
| 5005 | |||
| 5000 | int register_ftrace_graph(trace_func_graph_ret_t retfunc, | 5006 | int register_ftrace_graph(trace_func_graph_ret_t retfunc, |
| 5001 | trace_func_graph_ent_t entryfunc) | 5007 | trace_func_graph_ent_t entryfunc) |
| 5002 | { | 5008 | { |
| @@ -5023,7 +5029,7 @@ int register_ftrace_graph(trace_func_graph_ret_t retfunc, | |||
| 5023 | ftrace_graph_return = retfunc; | 5029 | ftrace_graph_return = retfunc; |
| 5024 | ftrace_graph_entry = entryfunc; | 5030 | ftrace_graph_entry = entryfunc; |
| 5025 | 5031 | ||
| 5026 | ret = ftrace_startup(&global_ops, FTRACE_START_FUNC_RET); | 5032 | ret = ftrace_startup(&fgraph_ops, FTRACE_START_FUNC_RET); |
| 5027 | 5033 | ||
| 5028 | out: | 5034 | out: |
| 5029 | mutex_unlock(&ftrace_lock); | 5035 | mutex_unlock(&ftrace_lock); |
| @@ -5040,7 +5046,7 @@ void unregister_ftrace_graph(void) | |||
| 5040 | ftrace_graph_active--; | 5046 | ftrace_graph_active--; |
| 5041 | ftrace_graph_return = (trace_func_graph_ret_t)ftrace_stub; | 5047 | ftrace_graph_return = (trace_func_graph_ret_t)ftrace_stub; |
| 5042 | ftrace_graph_entry = ftrace_graph_entry_stub; | 5048 | ftrace_graph_entry = ftrace_graph_entry_stub; |
| 5043 | ftrace_shutdown(&global_ops, FTRACE_STOP_FUNC_RET); | 5049 | ftrace_shutdown(&fgraph_ops, FTRACE_STOP_FUNC_RET); |
| 5044 | unregister_pm_notifier(&ftrace_suspend_notifier); | 5050 | unregister_pm_notifier(&ftrace_suspend_notifier); |
| 5045 | unregister_trace_sched_switch(ftrace_graph_probe_sched_switch, NULL); | 5051 | unregister_trace_sched_switch(ftrace_graph_probe_sched_switch, NULL); |
| 5046 | 5052 | ||
