On Tue, Jul 07, 2015 at 03:23:10AM +0200, Oleg Nesterov wrote: > 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. > > Signed-off-by: Oleg Nesterov <o...@redhat.com> Acked-by: Anton Arapov <ara...@gmail.com>
> --- > arch/x86/kernel/uprobes.c | 3 ++- > include/linux/uprobes.h | 7 ++++++- > kernel/events/uprobes.c | 9 ++++++--- > 3 files changed, 14 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c > index 9d5f570..67eb168 100644 > --- a/arch/x86/kernel/uprobes.c > +++ b/arch/x86/kernel/uprobes.c > @@ -994,7 +994,8 @@ arch_uretprobe_hijack_return_addr(unsigned long > trampoline_vaddr, struct pt_regs > return -1; > } > > -bool arch_uretprobe_is_alive(struct return_instance *ret, struct pt_regs > *regs) > +bool arch_uretprobe_is_alive(struct return_instance *ret, enum rp_check ctx, > + struct pt_regs *regs) > { > return regs->sp <= ret->stack; > } > diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h > index 7ab6d2c..c0a5402 100644 > --- a/include/linux/uprobes.h > +++ b/include/linux/uprobes.h > @@ -102,6 +102,11 @@ struct return_instance { > struct return_instance *next; /* keep as stack */ > }; > > +enum rp_check { > + RP_CHECK_CALL, > + RP_CHECK_RET, > +}; > + > struct xol_area; > > struct uprobes_state { > @@ -138,7 +143,7 @@ extern bool arch_uprobe_xol_was_trapped(struct > task_struct *tsk); > extern int arch_uprobe_exception_notify(struct notifier_block *self, > unsigned long val, void *data); > extern void arch_uprobe_abort_xol(struct arch_uprobe *aup, struct pt_regs > *regs); > extern unsigned long arch_uretprobe_hijack_return_addr(unsigned long > trampoline_vaddr, struct pt_regs *regs); > -extern bool arch_uretprobe_is_alive(struct return_instance *ret, struct > pt_regs *regs); > +extern bool arch_uretprobe_is_alive(struct return_instance *ret, enum > rp_check ctx, struct pt_regs *regs); > extern bool arch_uprobe_ignore(struct arch_uprobe *aup, struct pt_regs > *regs); > extern void arch_uprobe_copy_ixol(struct page *page, unsigned long vaddr, > void *src, unsigned long len); > diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c > index 7e61c8c..df5661a 100644 > --- a/kernel/events/uprobes.c > +++ b/kernel/events/uprobes.c > @@ -1514,7 +1514,9 @@ static unsigned long get_trampoline_vaddr(void) > static void cleanup_return_instances(struct uprobe_task *utask, struct > pt_regs *regs) > { > struct return_instance *ri = utask->return_instances; > - while (ri && !arch_uretprobe_is_alive(ri, regs)) { > + enum rp_check ctx = RP_CHECK_CALL; > + > + while (ri && !arch_uretprobe_is_alive(ri, ctx, regs)) { > ri = free_ret_instance(ri); > utask->depth--; > } > @@ -1805,7 +1807,7 @@ static void handle_trampoline(struct pt_regs *regs) > * could hit this trampoline on return. TODO: sigaltstack(). > */ > next = find_next_ret_chain(ri); > - valid = !next || arch_uretprobe_is_alive(next, regs); > + valid = !next || arch_uretprobe_is_alive(next, RP_CHECK_RET, > regs); > > instruction_pointer_set(regs, ri->orig_ret_vaddr); > do { > @@ -1830,7 +1832,8 @@ bool __weak arch_uprobe_ignore(struct arch_uprobe *aup, > struct pt_regs *regs) > return false; > } > > -bool __weak arch_uretprobe_is_alive(struct return_instance *ret, struct > pt_regs *regs) > +bool __weak arch_uretprobe_is_alive(struct return_instance *ret, enum > rp_check ctx, > + struct pt_regs *regs) > { > return true; > } > -- > 1.5.5.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/