|
@@ -1744,10 +1744,36 @@ static cycle_t ftrace_update_time;
|
|
|
static unsigned long ftrace_update_cnt;
|
|
|
unsigned long ftrace_update_tot_cnt;
|
|
|
|
|
|
+static int ops_traces_mod(struct ftrace_ops *ops)
|
|
|
+{
|
|
|
+ struct ftrace_hash *hash;
|
|
|
+
|
|
|
+ hash = ops->filter_hash;
|
|
|
+ return !!(!hash || !hash->count);
|
|
|
+}
|
|
|
+
|
|
|
static int ftrace_update_code(struct module *mod)
|
|
|
{
|
|
|
struct dyn_ftrace *p;
|
|
|
cycle_t start, stop;
|
|
|
+ unsigned long ref = 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * When adding a module, we need to check if tracers are
|
|
|
+ * currently enabled and if they are set to trace all functions.
|
|
|
+ * If they are, we need to enable the module functions as well
|
|
|
+ * as update the reference counts for those function records.
|
|
|
+ */
|
|
|
+ if (mod) {
|
|
|
+ struct ftrace_ops *ops;
|
|
|
+
|
|
|
+ for (ops = ftrace_ops_list;
|
|
|
+ ops != &ftrace_list_end; ops = ops->next) {
|
|
|
+ if (ops->flags & FTRACE_OPS_FL_ENABLED &&
|
|
|
+ ops_traces_mod(ops))
|
|
|
+ ref++;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
start = ftrace_now(raw_smp_processor_id());
|
|
|
ftrace_update_cnt = 0;
|
|
@@ -1760,7 +1786,7 @@ static int ftrace_update_code(struct module *mod)
|
|
|
|
|
|
p = ftrace_new_addrs;
|
|
|
ftrace_new_addrs = p->newlist;
|
|
|
- p->flags = 0L;
|
|
|
+ p->flags = ref;
|
|
|
|
|
|
/*
|
|
|
* Do the initial record conversion from mcount jump
|
|
@@ -1783,7 +1809,7 @@ static int ftrace_update_code(struct module *mod)
|
|
|
* conversion puts the module to the correct state, thus
|
|
|
* passing the ftrace_make_call check.
|
|
|
*/
|
|
|
- if (ftrace_start_up) {
|
|
|
+ if (ftrace_start_up && ref) {
|
|
|
int failed = __ftrace_replace_code(p, 1);
|
|
|
if (failed) {
|
|
|
ftrace_bug(failed, p->ip);
|