|
@@ -3318,7 +3318,7 @@ static int ftrace_process_locs(struct module *mod,
|
|
|
{
|
|
|
unsigned long *p;
|
|
|
unsigned long addr;
|
|
|
- unsigned long flags;
|
|
|
+ unsigned long flags = 0; /* Shut up gcc */
|
|
|
|
|
|
mutex_lock(&ftrace_lock);
|
|
|
p = start;
|
|
@@ -3336,12 +3336,18 @@ static int ftrace_process_locs(struct module *mod,
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Disable interrupts to prevent interrupts from executing
|
|
|
- * code that is being modified.
|
|
|
+ * We only need to disable interrupts on start up
|
|
|
+ * because we are modifying code that an interrupt
|
|
|
+ * may execute, and the modification is not atomic.
|
|
|
+ * But for modules, nothing runs the code we modify
|
|
|
+ * until we are finished with it, and there's no
|
|
|
+ * reason to cause large interrupt latencies while we do it.
|
|
|
*/
|
|
|
- local_irq_save(flags);
|
|
|
+ if (!mod)
|
|
|
+ local_irq_save(flags);
|
|
|
ftrace_update_code(mod);
|
|
|
- local_irq_restore(flags);
|
|
|
+ if (!mod)
|
|
|
+ local_irq_restore(flags);
|
|
|
mutex_unlock(&ftrace_lock);
|
|
|
|
|
|
return 0;
|