aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace')
-rw-r--r--kernel/trace/ftrace.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 1c4c0b087e1d..ef9271b69b4f 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1744,10 +1744,36 @@ static cycle_t ftrace_update_time;
1744static unsigned long ftrace_update_cnt; 1744static unsigned long ftrace_update_cnt;
1745unsigned long ftrace_update_tot_cnt; 1745unsigned long ftrace_update_tot_cnt;
1746 1746
1747static int ops_traces_mod(struct ftrace_ops *ops)
1748{
1749 struct ftrace_hash *hash;
1750
1751 hash = ops->filter_hash;
1752 return !!(!hash || !hash->count);
1753}
1754
1747static int ftrace_update_code(struct module *mod) 1755static int ftrace_update_code(struct module *mod)
1748{ 1756{
1749 struct dyn_ftrace *p; 1757 struct dyn_ftrace *p;
1750 cycle_t start, stop; 1758 cycle_t start, stop;
1759 unsigned long ref = 0;
1760
1761 /*
1762 * When adding a module, we need to check if tracers are
1763 * currently enabled and if they are set to trace all functions.
1764 * If they are, we need to enable the module functions as well
1765 * as update the reference counts for those function records.
1766 */
1767 if (mod) {
1768 struct ftrace_ops *ops;
1769
1770 for (ops = ftrace_ops_list;
1771 ops != &ftrace_list_end; ops = ops->next) {
1772 if (ops->flags & FTRACE_OPS_FL_ENABLED &&
1773 ops_traces_mod(ops))
1774 ref++;
1775 }
1776 }
1751 1777
1752 start = ftrace_now(raw_smp_processor_id()); 1778 start = ftrace_now(raw_smp_processor_id());
1753 ftrace_update_cnt = 0; 1779 ftrace_update_cnt = 0;
@@ -1760,7 +1786,7 @@ static int ftrace_update_code(struct module *mod)
1760 1786
1761 p = ftrace_new_addrs; 1787 p = ftrace_new_addrs;
1762 ftrace_new_addrs = p->newlist; 1788 ftrace_new_addrs = p->newlist;
1763 p->flags = 0L; 1789 p->flags = ref;
1764 1790
1765 /* 1791 /*
1766 * Do the initial record conversion from mcount jump 1792 * Do the initial record conversion from mcount jump
@@ -1783,7 +1809,7 @@ static int ftrace_update_code(struct module *mod)
1783 * conversion puts the module to the correct state, thus 1809 * conversion puts the module to the correct state, thus
1784 * passing the ftrace_make_call check. 1810 * passing the ftrace_make_call check.
1785 */ 1811 */
1786 if (ftrace_start_up) { 1812 if (ftrace_start_up && ref) {
1787 int failed = __ftrace_replace_code(p, 1); 1813 int failed = __ftrace_replace_code(p, 1);
1788 if (failed) { 1814 if (failed) {
1789 ftrace_bug(failed, p->ip); 1815 ftrace_bug(failed, p->ip);