diff options
author | Steven Rostedt <srostedt@redhat.com> | 2011-08-16 09:57:10 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2012-04-27 21:10:44 -0400 |
commit | 08d636b6d4fb80647fe8869ea1cd97b2c26a4751 (patch) | |
tree | eb85c37e3a67e1c21df9b82e2d302d5d1899343a /include/linux/ftrace.h | |
parent | 438ced1720b584000a9e8a4349d1f6bb7ee3ad6d (diff) |
ftrace/x86: Have arch x86_64 use breakpoints instead of stop machine
This method changes x86 to add a breakpoint to the mcount locations
instead of calling stop machine.
Now that iret can be handled by NMIs, we perform the following to
update code:
1) Add a breakpoint to all locations that will be modified
2) Sync all cores
3) Update all locations to be either a nop or call (except breakpoint
op)
4) Sync all cores
5) Remove the breakpoint with the new code.
6) Sync all cores
[
Added updates that Masami suggested:
Use unlikely(modifying_ftrace_code) in int3 trap to keep kprobes efficient.
Don't use NOTIFY_* in ftrace handler in int3 as it is not a notifier.
]
Cc: H. Peter Anvin <hpa@zytor.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'include/linux/ftrace.h')
-rw-r--r-- | include/linux/ftrace.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 72a6cabb4d5b..0b5590330bca 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -286,6 +286,12 @@ struct ftrace_rec_iter *ftrace_rec_iter_start(void); | |||
286 | struct ftrace_rec_iter *ftrace_rec_iter_next(struct ftrace_rec_iter *iter); | 286 | struct ftrace_rec_iter *ftrace_rec_iter_next(struct ftrace_rec_iter *iter); |
287 | struct dyn_ftrace *ftrace_rec_iter_record(struct ftrace_rec_iter *iter); | 287 | struct dyn_ftrace *ftrace_rec_iter_record(struct ftrace_rec_iter *iter); |
288 | 288 | ||
289 | #define for_ftrace_rec_iter(iter) \ | ||
290 | for (iter = ftrace_rec_iter_start(); \ | ||
291 | iter; \ | ||
292 | iter = ftrace_rec_iter_next(iter)) | ||
293 | |||
294 | |||
289 | int ftrace_update_record(struct dyn_ftrace *rec, int enable); | 295 | int ftrace_update_record(struct dyn_ftrace *rec, int enable); |
290 | int ftrace_test_record(struct dyn_ftrace *rec, int enable); | 296 | int ftrace_test_record(struct dyn_ftrace *rec, int enable); |
291 | void ftrace_run_stop_machine(int command); | 297 | void ftrace_run_stop_machine(int command); |