Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757315AbbGGNJI (ORCPT ); Tue, 7 Jul 2015 09:09:08 -0400 Received: from mail-wi0-f176.google.com ([209.85.212.176]:36990 "EHLO mail-wi0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756970AbbGGNJE (ORCPT ); Tue, 7 Jul 2015 09:09:04 -0400 Date: Tue, 7 Jul 2015 15:08:59 +0200 From: Anton Arapov To: Oleg Nesterov Cc: Ananth Mavinakayanahalli , David Long , Denys Vlasenko , "Frank Ch. Eigler" , Ingo Molnar , Jan Willeke , Jim Keniston , Mark Wielaard , Pratyush Anand , Srikar Dronamraju , linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 10/11] uprobes: Add the "enum rp_check ctx" arg to arch_uretprobe_is_alive() Message-ID: <20150707130859.GJ5946@troglodyte.intinfra.com> References: <20150707012210.GA7466@redhat.com> <20150707012310.GA7550@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150707012310.GA7550@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3928 Lines: 96 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 Acked-by: Anton Arapov > --- > 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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/