diff options
author | Oleg Nesterov <oleg@redhat.com> | 2015-07-21 09:40:26 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-07-31 04:38:06 -0400 |
commit | 86dcb702e74b8ab7d3b2d36984ef00671cea73b9 (patch) | |
tree | 11ca9d381085a5936368c78203b0f3f505edfe30 /kernel/events | |
parent | a5b7e1a89b820f2b9b23634ca4c59b555e8d9a0d (diff) |
uprobes: Add the "enum rp_check ctx" arg to arch_uretprobe_is_alive()
arch/x86 doesn't care (so far), but as Pratyush Anand pointed
out other architectures might want why arch_uretprobe_is_alive()
was called and use different checks depending on the context.
Add the new argument to distinguish 2 callers.
Tested-by: Pratyush Anand <panand@redhat.com>
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Acked-by: Anton Arapov <arapov@gmail.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20150721134026.GA4779@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/events')
-rw-r--r-- | kernel/events/uprobes.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 7e61c8ca27e0..df5661a44e35 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c | |||
@@ -1514,7 +1514,9 @@ static unsigned long get_trampoline_vaddr(void) | |||
1514 | static void cleanup_return_instances(struct uprobe_task *utask, struct pt_regs *regs) | 1514 | static void cleanup_return_instances(struct uprobe_task *utask, struct pt_regs *regs) |
1515 | { | 1515 | { |
1516 | struct return_instance *ri = utask->return_instances; | 1516 | struct return_instance *ri = utask->return_instances; |
1517 | while (ri && !arch_uretprobe_is_alive(ri, regs)) { | 1517 | enum rp_check ctx = RP_CHECK_CALL; |
1518 | |||
1519 | while (ri && !arch_uretprobe_is_alive(ri, ctx, regs)) { | ||
1518 | ri = free_ret_instance(ri); | 1520 | ri = free_ret_instance(ri); |
1519 | utask->depth--; | 1521 | utask->depth--; |
1520 | } | 1522 | } |
@@ -1805,7 +1807,7 @@ static void handle_trampoline(struct pt_regs *regs) | |||
1805 | * could hit this trampoline on return. TODO: sigaltstack(). | 1807 | * could hit this trampoline on return. TODO: sigaltstack(). |
1806 | */ | 1808 | */ |
1807 | next = find_next_ret_chain(ri); | 1809 | next = find_next_ret_chain(ri); |
1808 | valid = !next || arch_uretprobe_is_alive(next, regs); | 1810 | valid = !next || arch_uretprobe_is_alive(next, RP_CHECK_RET, regs); |
1809 | 1811 | ||
1810 | instruction_pointer_set(regs, ri->orig_ret_vaddr); | 1812 | instruction_pointer_set(regs, ri->orig_ret_vaddr); |
1811 | do { | 1813 | do { |
@@ -1830,7 +1832,8 @@ bool __weak arch_uprobe_ignore(struct arch_uprobe *aup, struct pt_regs *regs) | |||
1830 | return false; | 1832 | return false; |
1831 | } | 1833 | } |
1832 | 1834 | ||
1833 | bool __weak arch_uretprobe_is_alive(struct return_instance *ret, struct pt_regs *regs) | 1835 | bool __weak arch_uretprobe_is_alive(struct return_instance *ret, enum rp_check ctx, |
1836 | struct pt_regs *regs) | ||
1834 | { | 1837 | { |
1835 | return true; | 1838 | return true; |
1836 | } | 1839 | } |