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 /kernel/trace | |
| 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>
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/ftrace.c | 42 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 2 |
2 files changed, 3 insertions, 41 deletions
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); |
