diff options
author | Steven Rostedt <rostedt@goodmis.org> | 2008-10-23 09:33:02 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-10-23 10:00:19 -0400 |
commit | 81adbdc029ecc416d56563e7f159100181dd711d (patch) | |
tree | ff7ed7b0fb284c22eb30e690a85e2e9e083c4162 | |
parent | ab9a0918cbf0fa8883301838df8dbc8fc085ff50 (diff) |
ftrace: only have ftrace_kill atomic
When an anomaly is detected, we need a way to completely disable
ftrace. Right now we have two functions: ftrace_kill and ftrace_kill_atomic.
The ftrace_kill tries to do it in a "nice" way by converting everything
back to a nop.
The "nice" way is dangerous itself, so this patch removes it and only
has the "atomic" version, which is all that is needed.
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | include/linux/ftrace.h | 3 | ||||
-rw-r--r-- | kernel/trace/ftrace.c | 42 | ||||
-rw-r--r-- | kernel/trace/trace.c | 2 |
3 files changed, 4 insertions, 43 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 79fa10cbdcfb..ac58e94668b7 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -40,7 +40,7 @@ extern void ftrace_stub(unsigned long a0, unsigned long a1); | |||
40 | # define register_ftrace_function(ops) do { } while (0) | 40 | # define register_ftrace_function(ops) do { } while (0) |
41 | # define unregister_ftrace_function(ops) do { } while (0) | 41 | # define unregister_ftrace_function(ops) do { } while (0) |
42 | # define clear_ftrace_function(ops) do { } while (0) | 42 | # define clear_ftrace_function(ops) do { } while (0) |
43 | static inline void ftrace_kill_atomic(void) { } | 43 | static inline void ftrace_kill(void) { } |
44 | #endif /* CONFIG_FUNCTION_TRACER */ | 44 | #endif /* CONFIG_FUNCTION_TRACER */ |
45 | 45 | ||
46 | #ifdef CONFIG_DYNAMIC_FTRACE | 46 | #ifdef CONFIG_DYNAMIC_FTRACE |
@@ -117,7 +117,6 @@ static inline void ftrace_release(void *start, unsigned long size) { } | |||
117 | 117 | ||
118 | /* totally disable ftrace - can not re-enable after this */ | 118 | /* totally disable ftrace - can not re-enable after this */ |
119 | void ftrace_kill(void); | 119 | void ftrace_kill(void); |
120 | void ftrace_kill_atomic(void); | ||
121 | 120 | ||
122 | static inline void tracer_disable(void) | 121 | static inline void tracer_disable(void) |
123 | { | 122 | { |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index b2de8de77356..93245ae046e1 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -1549,22 +1549,6 @@ int ftrace_force_update(void) | |||
1549 | return ret; | 1549 | return ret; |
1550 | } | 1550 | } |
1551 | 1551 | ||
1552 | static void ftrace_force_shutdown(void) | ||
1553 | { | ||
1554 | struct task_struct *task; | ||
1555 | int command = FTRACE_DISABLE_CALLS | FTRACE_UPDATE_TRACE_FUNC; | ||
1556 | |||
1557 | mutex_lock(&ftraced_lock); | ||
1558 | task = ftraced_task; | ||
1559 | ftraced_task = NULL; | ||
1560 | ftraced_suspend = -1; | ||
1561 | ftrace_run_update_code(command); | ||
1562 | mutex_unlock(&ftraced_lock); | ||
1563 | |||
1564 | if (task) | ||
1565 | kthread_stop(task); | ||
1566 | } | ||
1567 | |||
1568 | static __init int ftrace_init_debugfs(void) | 1552 | static __init int ftrace_init_debugfs(void) |
1569 | { | 1553 | { |
1570 | struct dentry *d_tracer; | 1554 | struct dentry *d_tracer; |
@@ -1795,17 +1779,16 @@ core_initcall(ftrace_dynamic_init); | |||
1795 | # define ftrace_shutdown() do { } while (0) | 1779 | # define ftrace_shutdown() do { } while (0) |
1796 | # define ftrace_startup_sysctl() do { } while (0) | 1780 | # define ftrace_startup_sysctl() do { } while (0) |
1797 | # define ftrace_shutdown_sysctl() do { } while (0) | 1781 | # define ftrace_shutdown_sysctl() do { } while (0) |
1798 | # define ftrace_force_shutdown() do { } while (0) | ||
1799 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 1782 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
1800 | 1783 | ||
1801 | /** | 1784 | /** |
1802 | * ftrace_kill_atomic - kill ftrace from critical sections | 1785 | * ftrace_kill - kill ftrace |
1803 | * | 1786 | * |
1804 | * This function should be used by panic code. It stops ftrace | 1787 | * This function should be used by panic code. It stops ftrace |
1805 | * but in a not so nice way. If you need to simply kill ftrace | 1788 | * but in a not so nice way. If you need to simply kill ftrace |
1806 | * from a non-atomic section, use ftrace_kill. | 1789 | * from a non-atomic section, use ftrace_kill. |
1807 | */ | 1790 | */ |
1808 | void ftrace_kill_atomic(void) | 1791 | void ftrace_kill(void) |
1809 | { | 1792 | { |
1810 | ftrace_disabled = 1; | 1793 | ftrace_disabled = 1; |
1811 | ftrace_enabled = 0; | 1794 | ftrace_enabled = 0; |
@@ -1816,27 +1799,6 @@ void ftrace_kill_atomic(void) | |||
1816 | } | 1799 | } |
1817 | 1800 | ||
1818 | /** | 1801 | /** |
1819 | * ftrace_kill - totally shutdown ftrace | ||
1820 | * | ||
1821 | * This is a safety measure. If something was detected that seems | ||
1822 | * wrong, calling this function will keep ftrace from doing | ||
1823 | * any more modifications, and updates. | ||
1824 | * used when something went wrong. | ||
1825 | */ | ||
1826 | void ftrace_kill(void) | ||
1827 | { | ||
1828 | mutex_lock(&ftrace_sysctl_lock); | ||
1829 | ftrace_disabled = 1; | ||
1830 | ftrace_enabled = 0; | ||
1831 | |||
1832 | clear_ftrace_function(); | ||
1833 | mutex_unlock(&ftrace_sysctl_lock); | ||
1834 | |||
1835 | /* Try to totally disable ftrace */ | ||
1836 | ftrace_force_shutdown(); | ||
1837 | } | ||
1838 | |||
1839 | /** | ||
1840 | * register_ftrace_function - register a function for profiling | 1802 | * register_ftrace_function - register a function for profiling |
1841 | * @ops - ops structure that holds the function for profiling. | 1803 | * @ops - ops structure that holds the function for profiling. |
1842 | * | 1804 | * |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index aeb2f2505bc5..333a5162149b 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -3097,7 +3097,7 @@ void ftrace_dump(void) | |||
3097 | dump_ran = 1; | 3097 | dump_ran = 1; |
3098 | 3098 | ||
3099 | /* No turning back! */ | 3099 | /* No turning back! */ |
3100 | ftrace_kill_atomic(); | 3100 | ftrace_kill(); |
3101 | 3101 | ||
3102 | for_each_tracing_cpu(cpu) { | 3102 | for_each_tracing_cpu(cpu) { |
3103 | atomic_inc(&global_trace.data[cpu]->disabled); | 3103 | atomic_inc(&global_trace.data[cpu]->disabled); |