aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <rostedt@goodmis.org>2008-10-23 09:33:02 -0400
committerIngo Molnar <mingo@elte.hu>2008-10-23 10:00:19 -0400
commit81adbdc029ecc416d56563e7f159100181dd711d (patch)
treeff7ed7b0fb284c22eb30e690a85e2e9e083c4162
parentab9a0918cbf0fa8883301838df8dbc8fc085ff50 (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.h3
-rw-r--r--kernel/trace/ftrace.c42
-rw-r--r--kernel/trace/trace.c2
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)
43static inline void ftrace_kill_atomic(void) { } 43static 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 */
119void ftrace_kill(void); 119void ftrace_kill(void);
120void ftrace_kill_atomic(void);
121 120
122static inline void tracer_disable(void) 121static 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
1552static 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
1568static __init int ftrace_init_debugfs(void) 1552static __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 */
1808void ftrace_kill_atomic(void) 1791void 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 */
1826void 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);