aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/ftrace.c
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-02-14 01:42:44 -0500
committerSteven Rostedt <srostedt@redhat.com>2009-02-16 18:15:31 -0500
commite6ea44e9b4c12325337cd1c06103cd515a1c02b2 (patch)
tree01d13cb3dfb6031c220b42cedc7df7c84dc116b4 /kernel/trace/ftrace.c
parent52baf11922db7377b580dd5448a07f71c6a35611 (diff)
ftrace: consolidate mutexes
Impact: clean up Now that ftrace_lock is a mutex, there is no reason to have three different mutexes protecting similar data. All the mutex paths are not in hot paths, so having a mutex to cover more data is not a problem. This patch removes the ftrace_sysctl_lock and ftrace_start_lock and uses the ftrace_lock to protect the locations that were protected by these locks. By doing so, this change also removes some of the lock nesting that was taking place. There are still more mutexes in ftrace.c that can probably be consolidated, but they can be dealt with later. We need to be careful about the way the locks are nested, and by consolidating, we can cause a recursive deadlock. Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r--kernel/trace/ftrace.c68
1 files changed, 21 insertions, 47 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 4771732037ee..157d4f68b0e0 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -62,8 +62,6 @@ int function_trace_stop;
62static int ftrace_disabled __read_mostly; 62static int ftrace_disabled __read_mostly;
63 63
64static DEFINE_MUTEX(ftrace_lock); 64static DEFINE_MUTEX(ftrace_lock);
65static DEFINE_MUTEX(ftrace_sysctl_lock);
66static DEFINE_MUTEX(ftrace_start_lock);
67 65
68static struct ftrace_ops ftrace_list_end __read_mostly = 66static struct ftrace_ops ftrace_list_end __read_mostly =
69{ 67{
@@ -134,8 +132,6 @@ static void ftrace_test_stop_func(unsigned long ip, unsigned long parent_ip)
134 132
135static int __register_ftrace_function(struct ftrace_ops *ops) 133static int __register_ftrace_function(struct ftrace_ops *ops)
136{ 134{
137 mutex_lock(&ftrace_lock);
138
139 ops->next = ftrace_list; 135 ops->next = ftrace_list;
140 /* 136 /*
141 * We are entering ops into the ftrace_list but another 137 * We are entering ops into the ftrace_list but another
@@ -171,17 +167,12 @@ static int __register_ftrace_function(struct ftrace_ops *ops)
171#endif 167#endif
172 } 168 }
173 169
174 mutex_unlock(&ftrace_lock);
175
176 return 0; 170 return 0;
177} 171}
178 172
179static int __unregister_ftrace_function(struct ftrace_ops *ops) 173static int __unregister_ftrace_function(struct ftrace_ops *ops)
180{ 174{
181 struct ftrace_ops **p; 175 struct ftrace_ops **p;
182 int ret = 0;
183
184 mutex_lock(&ftrace_lock);
185 176
186 /* 177 /*
187 * If we are removing the last function, then simply point 178 * If we are removing the last function, then simply point
@@ -190,17 +181,15 @@ static int __unregister_ftrace_function(struct ftrace_ops *ops)
190 if (ftrace_list == ops && ops->next == &ftrace_list_end) { 181 if (ftrace_list == ops && ops->next == &ftrace_list_end) {
191 ftrace_trace_function = ftrace_stub; 182 ftrace_trace_function = ftrace_stub;
192 ftrace_list = &ftrace_list_end; 183 ftrace_list = &ftrace_list_end;
193 goto out; 184 return 0;
194 } 185 }
195 186
196 for (p = &ftrace_list; *p != &ftrace_list_end; p = &(*p)->next) 187 for (p = &ftrace_list; *p != &ftrace_list_end; p = &(*p)->next)
197 if (*p == ops) 188 if (*p == ops)
198 break; 189 break;
199 190
200 if (*p != ops) { 191 if (*p != ops)
201 ret = -1; 192 return -1;
202 goto out;
203 }
204 193
205 *p = (*p)->next; 194 *p = (*p)->next;
206 195
@@ -221,10 +210,7 @@ static int __unregister_ftrace_function(struct ftrace_ops *ops)
221 } 210 }
222 } 211 }
223 212
224 out: 213 return 0;
225 mutex_unlock(&ftrace_lock);
226
227 return ret;
228} 214}
229 215
230static void ftrace_update_pid_func(void) 216static void ftrace_update_pid_func(void)
@@ -622,13 +608,10 @@ static void ftrace_startup(int command)
622 if (unlikely(ftrace_disabled)) 608 if (unlikely(ftrace_disabled))
623 return; 609 return;
624 610
625 mutex_lock(&ftrace_start_lock);
626 ftrace_start_up++; 611 ftrace_start_up++;
627 command |= FTRACE_ENABLE_CALLS; 612 command |= FTRACE_ENABLE_CALLS;
628 613
629 ftrace_startup_enable(command); 614 ftrace_startup_enable(command);
630
631 mutex_unlock(&ftrace_start_lock);
632} 615}
633 616
634static void ftrace_shutdown(int command) 617static void ftrace_shutdown(int command)
@@ -636,7 +619,6 @@ static void ftrace_shutdown(int command)
636 if (unlikely(ftrace_disabled)) 619 if (unlikely(ftrace_disabled))
637 return; 620 return;
638 621
639 mutex_lock(&ftrace_start_lock);
640 ftrace_start_up--; 622 ftrace_start_up--;
641 if (!ftrace_start_up) 623 if (!ftrace_start_up)
642 command |= FTRACE_DISABLE_CALLS; 624 command |= FTRACE_DISABLE_CALLS;
@@ -647,11 +629,9 @@ static void ftrace_shutdown(int command)
647 } 629 }
648 630
649 if (!command || !ftrace_enabled) 631 if (!command || !ftrace_enabled)
650 goto out; 632 return;
651 633
652 ftrace_run_update_code(command); 634 ftrace_run_update_code(command);
653 out:
654 mutex_unlock(&ftrace_start_lock);
655} 635}
656 636
657static void ftrace_startup_sysctl(void) 637static void ftrace_startup_sysctl(void)
@@ -661,7 +641,6 @@ static void ftrace_startup_sysctl(void)
661 if (unlikely(ftrace_disabled)) 641 if (unlikely(ftrace_disabled))
662 return; 642 return;
663 643
664 mutex_lock(&ftrace_start_lock);
665 /* Force update next time */ 644 /* Force update next time */
666 saved_ftrace_func = NULL; 645 saved_ftrace_func = NULL;
667 /* ftrace_start_up is true if we want ftrace running */ 646 /* ftrace_start_up is true if we want ftrace running */
@@ -669,7 +648,6 @@ static void ftrace_startup_sysctl(void)
669 command |= FTRACE_ENABLE_CALLS; 648 command |= FTRACE_ENABLE_CALLS;
670 649
671 ftrace_run_update_code(command); 650 ftrace_run_update_code(command);
672 mutex_unlock(&ftrace_start_lock);
673} 651}
674 652
675static void ftrace_shutdown_sysctl(void) 653static void ftrace_shutdown_sysctl(void)
@@ -679,13 +657,11 @@ static void ftrace_shutdown_sysctl(void)
679 if (unlikely(ftrace_disabled)) 657 if (unlikely(ftrace_disabled))
680 return; 658 return;
681 659
682 mutex_lock(&ftrace_start_lock);
683 /* ftrace_start_up is true if ftrace is running */ 660 /* ftrace_start_up is true if ftrace is running */
684 if (ftrace_start_up) 661 if (ftrace_start_up)
685 command |= FTRACE_DISABLE_CALLS; 662 command |= FTRACE_DISABLE_CALLS;
686 663
687 ftrace_run_update_code(command); 664 ftrace_run_update_code(command);
688 mutex_unlock(&ftrace_start_lock);
689} 665}
690 666
691static cycle_t ftrace_update_time; 667static cycle_t ftrace_update_time;
@@ -1502,12 +1478,10 @@ ftrace_regex_release(struct inode *inode, struct file *file, int enable)
1502 ftrace_match_records(iter->buffer, iter->buffer_idx, enable); 1478 ftrace_match_records(iter->buffer, iter->buffer_idx, enable);
1503 } 1479 }
1504 1480
1505 mutex_lock(&ftrace_sysctl_lock); 1481 mutex_lock(&ftrace_lock);
1506 mutex_lock(&ftrace_start_lock);
1507 if (ftrace_start_up && ftrace_enabled) 1482 if (ftrace_start_up && ftrace_enabled)
1508 ftrace_run_update_code(FTRACE_ENABLE_CALLS); 1483 ftrace_run_update_code(FTRACE_ENABLE_CALLS);
1509 mutex_unlock(&ftrace_start_lock); 1484 mutex_unlock(&ftrace_lock);
1510 mutex_unlock(&ftrace_sysctl_lock);
1511 1485
1512 kfree(iter); 1486 kfree(iter);
1513 mutex_unlock(&ftrace_regex_lock); 1487 mutex_unlock(&ftrace_regex_lock);
@@ -1824,7 +1798,7 @@ static int ftrace_convert_nops(struct module *mod,
1824 unsigned long addr; 1798 unsigned long addr;
1825 unsigned long flags; 1799 unsigned long flags;
1826 1800
1827 mutex_lock(&ftrace_start_lock); 1801 mutex_lock(&ftrace_lock);
1828 p = start; 1802 p = start;
1829 while (p < end) { 1803 while (p < end) {
1830 addr = ftrace_call_adjust(*p++); 1804 addr = ftrace_call_adjust(*p++);
@@ -1843,7 +1817,7 @@ static int ftrace_convert_nops(struct module *mod,
1843 local_irq_save(flags); 1817 local_irq_save(flags);
1844 ftrace_update_code(mod); 1818 ftrace_update_code(mod);
1845 local_irq_restore(flags); 1819 local_irq_restore(flags);
1846 mutex_unlock(&ftrace_start_lock); 1820 mutex_unlock(&ftrace_lock);
1847 1821
1848 return 0; 1822 return 0;
1849} 1823}
@@ -2016,7 +1990,7 @@ ftrace_pid_write(struct file *filp, const char __user *ubuf,
2016 if (ret < 0) 1990 if (ret < 0)
2017 return ret; 1991 return ret;
2018 1992
2019 mutex_lock(&ftrace_start_lock); 1993 mutex_lock(&ftrace_lock);
2020 if (val < 0) { 1994 if (val < 0) {
2021 /* disable pid tracing */ 1995 /* disable pid tracing */
2022 if (!ftrace_pid_trace) 1996 if (!ftrace_pid_trace)
@@ -2055,7 +2029,7 @@ ftrace_pid_write(struct file *filp, const char __user *ubuf,
2055 ftrace_startup_enable(0); 2029 ftrace_startup_enable(0);
2056 2030
2057 out: 2031 out:
2058 mutex_unlock(&ftrace_start_lock); 2032 mutex_unlock(&ftrace_lock);
2059 2033
2060 return cnt; 2034 return cnt;
2061} 2035}
@@ -2118,12 +2092,12 @@ int register_ftrace_function(struct ftrace_ops *ops)
2118 if (unlikely(ftrace_disabled)) 2092 if (unlikely(ftrace_disabled))
2119 return -1; 2093 return -1;
2120 2094
2121 mutex_lock(&ftrace_sysctl_lock); 2095 mutex_lock(&ftrace_lock);
2122 2096
2123 ret = __register_ftrace_function(ops); 2097 ret = __register_ftrace_function(ops);
2124 ftrace_startup(0); 2098 ftrace_startup(0);
2125 2099
2126 mutex_unlock(&ftrace_sysctl_lock); 2100 mutex_unlock(&ftrace_lock);
2127 return ret; 2101 return ret;
2128} 2102}
2129 2103
@@ -2137,10 +2111,10 @@ int unregister_ftrace_function(struct ftrace_ops *ops)
2137{ 2111{
2138 int ret; 2112 int ret;
2139 2113
2140 mutex_lock(&ftrace_sysctl_lock); 2114 mutex_lock(&ftrace_lock);
2141 ret = __unregister_ftrace_function(ops); 2115 ret = __unregister_ftrace_function(ops);
2142 ftrace_shutdown(0); 2116 ftrace_shutdown(0);
2143 mutex_unlock(&ftrace_sysctl_lock); 2117 mutex_unlock(&ftrace_lock);
2144 2118
2145 return ret; 2119 return ret;
2146} 2120}
@@ -2155,7 +2129,7 @@ ftrace_enable_sysctl(struct ctl_table *table, int write,
2155 if (unlikely(ftrace_disabled)) 2129 if (unlikely(ftrace_disabled))
2156 return -ENODEV; 2130 return -ENODEV;
2157 2131
2158 mutex_lock(&ftrace_sysctl_lock); 2132 mutex_lock(&ftrace_lock);
2159 2133
2160 ret = proc_dointvec(table, write, file, buffer, lenp, ppos); 2134 ret = proc_dointvec(table, write, file, buffer, lenp, ppos);
2161 2135
@@ -2184,7 +2158,7 @@ ftrace_enable_sysctl(struct ctl_table *table, int write,
2184 } 2158 }
2185 2159
2186 out: 2160 out:
2187 mutex_unlock(&ftrace_sysctl_lock); 2161 mutex_unlock(&ftrace_lock);
2188 return ret; 2162 return ret;
2189} 2163}
2190 2164
@@ -2296,7 +2270,7 @@ int register_ftrace_graph(trace_func_graph_ret_t retfunc,
2296{ 2270{
2297 int ret = 0; 2271 int ret = 0;
2298 2272
2299 mutex_lock(&ftrace_sysctl_lock); 2273 mutex_lock(&ftrace_lock);
2300 2274
2301 ftrace_suspend_notifier.notifier_call = ftrace_suspend_notifier_call; 2275 ftrace_suspend_notifier.notifier_call = ftrace_suspend_notifier_call;
2302 register_pm_notifier(&ftrace_suspend_notifier); 2276 register_pm_notifier(&ftrace_suspend_notifier);
@@ -2314,13 +2288,13 @@ int register_ftrace_graph(trace_func_graph_ret_t retfunc,
2314 ftrace_startup(FTRACE_START_FUNC_RET); 2288 ftrace_startup(FTRACE_START_FUNC_RET);
2315 2289
2316out: 2290out:
2317 mutex_unlock(&ftrace_sysctl_lock); 2291 mutex_unlock(&ftrace_lock);
2318 return ret; 2292 return ret;
2319} 2293}
2320 2294
2321void unregister_ftrace_graph(void) 2295void unregister_ftrace_graph(void)
2322{ 2296{
2323 mutex_lock(&ftrace_sysctl_lock); 2297 mutex_lock(&ftrace_lock);
2324 2298
2325 atomic_dec(&ftrace_graph_active); 2299 atomic_dec(&ftrace_graph_active);
2326 ftrace_graph_return = (trace_func_graph_ret_t)ftrace_stub; 2300 ftrace_graph_return = (trace_func_graph_ret_t)ftrace_stub;
@@ -2328,7 +2302,7 @@ void unregister_ftrace_graph(void)
2328 ftrace_shutdown(FTRACE_STOP_FUNC_RET); 2302 ftrace_shutdown(FTRACE_STOP_FUNC_RET);
2329 unregister_pm_notifier(&ftrace_suspend_notifier); 2303 unregister_pm_notifier(&ftrace_suspend_notifier);
2330 2304
2331 mutex_unlock(&ftrace_sysctl_lock); 2305 mutex_unlock(&ftrace_lock);
2332} 2306}
2333 2307
2334/* Allocate a return stack for newly created task */ 2308/* Allocate a return stack for newly created task */