diff options
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/ftrace.c | 30 |
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; | |||
| 1744 | static unsigned long ftrace_update_cnt; | 1744 | static unsigned long ftrace_update_cnt; |
| 1745 | unsigned long ftrace_update_tot_cnt; | 1745 | unsigned long ftrace_update_tot_cnt; |
| 1746 | 1746 | ||
| 1747 | static 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 | |||
| 1747 | static int ftrace_update_code(struct module *mod) | 1755 | static 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); |
