diff options
Diffstat (limited to 'kernel/trace/ftrace.c')
| -rw-r--r-- | kernel/trace/ftrace.c | 23 | 
1 files changed, 7 insertions, 16 deletions
| diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 3724756e41ca..37ba67e33265 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -1078,14 +1078,9 @@ static void ftrace_replace_code(int enable)  		failed = __ftrace_replace_code(rec, enable);  		if (failed) {  			rec->flags |= FTRACE_FL_FAILED; -			if ((system_state == SYSTEM_BOOTING) || -			    !core_kernel_text(rec->ip)) { -				ftrace_free_rec(rec); -				} else { -				ftrace_bug(failed, rec->ip); -					/* Stop processing */ -					return; -				} +			ftrace_bug(failed, rec->ip); +			/* Stop processing */ +			return;  		}  	} while_for_each_ftrace_rec();  } @@ -2662,19 +2657,17 @@ static int ftrace_convert_nops(struct module *mod,  }  #ifdef CONFIG_MODULES -void ftrace_release(void *start, void *end) +void ftrace_release_mod(struct module *mod)  {  	struct dyn_ftrace *rec;  	struct ftrace_page *pg; -	unsigned long s = (unsigned long)start; -	unsigned long e = (unsigned long)end; -	if (ftrace_disabled || !start || start == end) +	if (ftrace_disabled)  		return;  	mutex_lock(&ftrace_lock);  	do_for_each_ftrace_rec(pg, rec) { -		if ((rec->ip >= s) && (rec->ip < e)) { +		if (within_module_core(rec->ip, mod)) {  			/*  			 * rec->ip is changed in ftrace_free_rec()  			 * It should not between s and e if record was freed. @@ -2706,9 +2699,7 @@ static int ftrace_module_notify(struct notifier_block *self,  				   mod->num_ftrace_callsites);  		break;  	case MODULE_STATE_GOING: -		ftrace_release(mod->ftrace_callsites, -			       mod->ftrace_callsites + -			       mod->num_ftrace_callsites); +		ftrace_release_mod(mod);  		break;  	} |