summaryrefslogtreecommitdiff
path: root/arch/x86
diff options
context:
space:
mode:
authorPetr Mladek <pmladek@suse.cz>2014-02-24 17:12:20 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-05-06 07:55:28 -0700
commita42fa0bbf7260c1301a40f59e9bb9394a1d495d9 (patch)
treedd7e62a01c1b3b94a4d7f6f02e637f6efbfbc411 /arch/x86
parent0d267970ad9fb54e59f080d8ff80bcd1cd3a0039 (diff)
downloadlinux-3.10-a42fa0bbf7260c1301a40f59e9bb9394a1d495d9.tar.gz
linux-3.10-a42fa0bbf7260c1301a40f59e9bb9394a1d495d9.tar.bz2
linux-3.10-a42fa0bbf7260c1301a40f59e9bb9394a1d495d9.zip
ftrace/x86: One more missing sync after fixup of function modification failure
commit 12729f14d8357fb845d75155228b21e76360272d upstream. If a failure occurs while modifying ftrace function, it bails out and will remove the tracepoints to be back to what the code originally was. There is missing the final sync run across the CPUs after the fix up is done and before the ftrace int3 handler flag is reset. Here's the description of the problem: CPU0 CPU1 ---- ---- remove_breakpoint(); modifying_ftrace_code = 0; [still sees breakpoint] <takes trap> [sees modifying_ftrace_code as zero] [no breakpoint handler] [goto failed case] [trap exception - kernel breakpoint, no handler] BUG() Link: http://lkml.kernel.org/r/1393258342-29978-2-git-send-email-pmladek@suse.cz Fixes: 8a4d0a687a5 "ftrace: Use breakpoint method to update ftrace caller" Acked-by: Frederic Weisbecker <fweisbec@gmail.com> Acked-by: H. Peter Anvin <hpa@linux.intel.com> Signed-off-by: Petr Mladek <pmladek@suse.cz> Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kernel/ftrace.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c
index e6253195a30..1ffc32dbe45 100644
--- a/arch/x86/kernel/ftrace.c
+++ b/arch/x86/kernel/ftrace.c
@@ -659,8 +659,8 @@ ftrace_modify_code(unsigned long ip, unsigned const char *old_code,
ret = -EPERM;
goto out;
}
- run_sync();
out:
+ run_sync();
return ret;
fail_update: