From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> To: Will Deacon <will.deacon@arm.com>, Russell King <linux@arm.linux.org.uk> Cc: Peter Zijlstra <peterz@infradead.org>, "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>, Boqun Feng <boqun.feng@gmail.com>, Andy Lutomirski <luto@amacapital.net>, Dave Watson <davejwatson@fb.com>, linux-kernel <linux-kernel@vger.kernel.org>, linux-api <linux-api@vger.kernel.org>, Paul Turner <pjt@google.com>, Andrew Morton <akpm@linux-foundation.org>, Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>, Andrew Hunter <ahh@google.com>, Andi Kleen <andi@firstfloor.org>, Chris Lameter <cl@linux.com>, Ben Maurer <bmaurer@fb.com>, rostedt <rostedt@goodmis.org>, Josh Triplett <josh@joshtriplett.org>, Linus Torvalds <torvalds@linux-foundation.org>, Catalin Marinas <catalin.marinas@arm.com>, Michael Kerrisk <mtk.manpages@gmail.com>, Joel Fernandes <joelaf@google.com> Subject: Re: [PATCH 03/14] arm: Add restartable sequences support Date: Tue, 22 May 2018 14:19:33 -0400 (EDT) [thread overview] Message-ID: <1564615700.2786.1527013173112.JavaMail.zimbra@efficios.com> (raw) In-Reply-To: <2135166002.2147.1526571001678.JavaMail.zimbra@efficios.com> ----- On May 17, 2018, at 11:30 AM, Mathieu Desnoyers mathieu.desnoyers@efficios.com wrote: [...] > > Or as proposed by Boqun, we can simply call rseq_syscall in a CONFIG_DEBUG_RSEQ > ifdef. Given that this is a debug option, is it worth it to add the > current->rseq > test for NULL in assembly before the call, or do we want to favor simplicity ? > Based on advice from Will Deacon, I alternatively tried to add a new TIF_RSEQ thread flags, but unfortunately bits 1 through 8 are already used, and this is all that fits in an immediate operand on arm32 for the fast-path thread flag syscall work mask check in assembly. So considering that this is a kernel debug option, I took the approach of adding a call at the very beginning of return from syscall fast and slow paths, which is only compiled in if CONFIG_DEBUG_RSEQ=y. Does the following approach make sense ? arm: Add syscall detection for restartable sequences Syscalls are not allowed inside restartable sequences, so add a call to rseq_syscall() at the very beginning of system call exiting path for CONFIG_DEBUG_RSEQ=y kernel. This could help us to detect whether there is a syscall issued inside restartable sequences. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> --- diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 3c4f887..b427ef8 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -39,12 +39,13 @@ saved_pc .req lr .section .entry.text,"ax",%progbits .align 5 -#if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING)) +#if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING) || \ + IS_ENABLED(CONFIG_DEBUG_RSEQ)) /* * This is the fast syscall return path. We do as little as possible here, * such as avoiding writing r0 to the stack. We only use this path if we - * have tracing and context tracking disabled - the overheads from those - * features make this path too inefficient. + * have tracing, context tracking and rseq debug disabled - the overheads + * from those features make this path too inefficient. */ ret_fast_syscall: UNWIND(.fnstart ) @@ -71,14 +72,20 @@ fast_work_pending: /* fall through to work_pending */ #else /* - * The "replacement" ret_fast_syscall for when tracing or context tracking - * is enabled. As we will need to call out to some C functions, we save - * r0 first to avoid needing to save registers around each C function call. + * The "replacement" ret_fast_syscall for when tracing, context tracking, + * or rseq debug is enabled. As we will need to call out to some C functions, + * we save r0 first to avoid needing to save registers around each C function + * call. */ ret_fast_syscall: UNWIND(.fnstart ) UNWIND(.cantunwind ) str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 +#if IS_ENABLED(CONFIG_DEBUG_RSEQ) + /* do_rseq_syscall needs interrupts enabled. */ + mov r0, sp @ 'regs' + bl do_rseq_syscall +#endif disable_irq_notrace @ disable interrupts ldr r2, [tsk, #TI_ADDR_LIMIT] cmp r2, #TASK_SIZE @@ -113,6 +120,12 @@ ENDPROC(ret_fast_syscall) */ ENTRY(ret_to_user) ret_slow_syscall: +#if IS_ENABLED(CONFIG_DEBUG_RSEQ) + /* do_rseq_syscall needs interrupts enabled. */ + enable_irq_notrace @ enable interrupts + mov r0, sp @ 'regs' + bl do_rseq_syscall +#endif disable_irq_notrace @ disable interrupts ENTRY(ret_to_user_from_irq) ldr r2, [tsk, #TI_ADDR_LIMIT] diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 5879ab3..f09e9d66 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -710,3 +710,10 @@ asmlinkage void addr_limit_check_failed(void) { addr_limit_user_check(); } + +#ifdef CONFIG_DEBUG_RSEQ +asmlinkage void do_rseq_syscall(struct pt_regs *regs) +{ + rseq_syscall(regs); +} +#endif -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com
WARNING: multiple messages have this Message-ID (diff)
From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> To: Will Deacon <will.deacon@arm.com>, Russell King <linux@arm.linux.org.uk> Cc: Peter Zijlstra <peterz@infradead.org>, "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>, Boqun Feng <boqun.feng@gmail.com>, Andy Lutomirski <luto@amacapital.net>, Dave Watson <davejwatson@fb.com>, linux-kernel <linux-kernel@vger.kernel.org>, linux-api <linux-api@vger.kernel.org>, Paul Turner <pjt@google.com>, Andrew Morton <akpm@linux-foundation.org>, Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>, Andrew Hunter <ahh@google.com>, Andi Kleen <andi@firstfloor.org>, Chris Lameter <cl@linux.com>, Ben Maurer <bmaurer@fb.com>, rostedt <rostedt@goodmis.org>, Josh Triplett <josh@joshtriplett.org>, Linus Torvalds <torvalds@linux-foundation.org>, Catalin Marinas <catalin.marinas@arm.com> Subject: Re: [PATCH 03/14] arm: Add restartable sequences support Date: Tue, 22 May 2018 14:19:33 -0400 (EDT) [thread overview] Message-ID: <1564615700.2786.1527013173112.JavaMail.zimbra@efficios.com> (raw) In-Reply-To: <2135166002.2147.1526571001678.JavaMail.zimbra@efficios.com> ----- On May 17, 2018, at 11:30 AM, Mathieu Desnoyers mathieu.desnoyers@efficios.com wrote: [...] > > Or as proposed by Boqun, we can simply call rseq_syscall in a CONFIG_DEBUG_RSEQ > ifdef. Given that this is a debug option, is it worth it to add the > current->rseq > test for NULL in assembly before the call, or do we want to favor simplicity ? > Based on advice from Will Deacon, I alternatively tried to add a new TIF_RSEQ thread flags, but unfortunately bits 1 through 8 are already used, and this is all that fits in an immediate operand on arm32 for the fast-path thread flag syscall work mask check in assembly. So considering that this is a kernel debug option, I took the approach of adding a call at the very beginning of return from syscall fast and slow paths, which is only compiled in if CONFIG_DEBUG_RSEQ=y. Does the following approach make sense ? arm: Add syscall detection for restartable sequences Syscalls are not allowed inside restartable sequences, so add a call to rseq_syscall() at the very beginning of system call exiting path for CONFIG_DEBUG_RSEQ=y kernel. This could help us to detect whether there is a syscall issued inside restartable sequences. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> --- diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 3c4f887..b427ef8 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -39,12 +39,13 @@ saved_pc .req lr .section .entry.text,"ax",%progbits .align 5 -#if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING)) +#if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING) || \ + IS_ENABLED(CONFIG_DEBUG_RSEQ)) /* * This is the fast syscall return path. We do as little as possible here, * such as avoiding writing r0 to the stack. We only use this path if we - * have tracing and context tracking disabled - the overheads from those - * features make this path too inefficient. + * have tracing, context tracking and rseq debug disabled - the overheads + * from those features make this path too inefficient. */ ret_fast_syscall: UNWIND(.fnstart ) @@ -71,14 +72,20 @@ fast_work_pending: /* fall through to work_pending */ #else /* - * The "replacement" ret_fast_syscall for when tracing or context tracking - * is enabled. As we will need to call out to some C functions, we save - * r0 first to avoid needing to save registers around each C function call. + * The "replacement" ret_fast_syscall for when tracing, context tracking, + * or rseq debug is enabled. As we will need to call out to some C functions, + * we save r0 first to avoid needing to save registers around each C function + * call. */ ret_fast_syscall: UNWIND(.fnstart ) UNWIND(.cantunwind ) str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 +#if IS_ENABLED(CONFIG_DEBUG_RSEQ) + /* do_rseq_syscall needs interrupts enabled. */ + mov r0, sp @ 'regs' + bl do_rseq_syscall +#endif disable_irq_notrace @ disable interrupts ldr r2, [tsk, #TI_ADDR_LIMIT] cmp r2, #TASK_SIZE @@ -113,6 +120,12 @@ ENDPROC(ret_fast_syscall) */ ENTRY(ret_to_user) ret_slow_syscall: +#if IS_ENABLED(CONFIG_DEBUG_RSEQ) + /* do_rseq_syscall needs interrupts enabled. */ + enable_irq_notrace @ enable interrupts + mov r0, sp @ 'regs' + bl do_rseq_syscall +#endif disable_irq_notrace @ disable interrupts ENTRY(ret_to_user_from_irq) ldr r2, [tsk, #TI_ADDR_LIMIT] diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 5879ab3..f09e9d66 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -710,3 +710,10 @@ asmlinkage void addr_limit_check_failed(void) { addr_limit_user_check(); } + +#ifdef CONFIG_DEBUG_RSEQ +asmlinkage void do_rseq_syscall(struct pt_regs *regs) +{ + rseq_syscall(regs); +} +#endif -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com
next prev parent reply other threads:[~2018-05-22 18:19 UTC|newest] Thread overview: 105+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-04-30 22:44 [RFC PATCH for 4.18 00/14] Restartable Sequences Mathieu Desnoyers 2018-04-30 22:44 ` [PATCH 01/14] uapi headers: Provide types_32_64.h (v2) Mathieu Desnoyers 2018-04-30 22:44 ` [PATCH 02/14] rseq: Introduce restartable sequences system call (v13) Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-05-16 16:24 ` Peter Zijlstra 2018-05-16 16:24 ` Peter Zijlstra 2018-05-16 20:18 ` Mathieu Desnoyers 2018-05-16 20:18 ` Mathieu Desnoyers 2018-04-30 22:44 ` [PATCH 03/14] arm: Add restartable sequences support Mathieu Desnoyers 2018-05-16 16:18 ` Peter Zijlstra 2018-05-16 16:18 ` Peter Zijlstra 2018-05-16 20:13 ` Mathieu Desnoyers 2018-05-16 20:13 ` Mathieu Desnoyers 2018-05-17 13:32 ` Will Deacon 2018-05-17 13:32 ` Will Deacon 2018-05-17 15:30 ` Mathieu Desnoyers 2018-05-17 15:30 ` Mathieu Desnoyers 2018-05-22 18:19 ` Mathieu Desnoyers [this message] 2018-05-22 18:19 ` Mathieu Desnoyers 2018-04-30 22:44 ` [PATCH 04/14] arm: Wire up restartable sequences system call Mathieu Desnoyers 2018-04-30 22:44 ` [PATCH 05/14] x86: Add support for restartable sequences (v2) Mathieu Desnoyers 2018-04-30 22:44 ` [PATCH 06/14] x86: Wire up restartable sequence system call Mathieu Desnoyers 2018-04-30 22:44 ` [PATCH 07/14] powerpc: Add support for restartable sequences Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-05-16 16:18 ` Peter Zijlstra 2018-05-16 16:18 ` Peter Zijlstra 2018-05-16 20:13 ` Mathieu Desnoyers 2018-05-16 20:13 ` Mathieu Desnoyers 2018-05-17 1:19 ` Boqun Feng 2018-05-17 1:19 ` Boqun Feng 2018-05-17 1:19 ` Boqun Feng 2018-05-17 7:43 ` Peter Zijlstra 2018-05-17 7:43 ` Peter Zijlstra 2018-05-17 15:28 ` Mathieu Desnoyers 2018-05-17 15:28 ` Mathieu Desnoyers 2018-05-17 23:50 ` Boqun Feng 2018-05-17 23:50 ` Boqun Feng 2018-05-18 18:17 ` Mathieu Desnoyers 2018-05-18 18:17 ` Mathieu Desnoyers 2018-05-20 14:08 ` Boqun Feng 2018-05-20 14:08 ` Boqun Feng 2018-05-20 14:08 ` Boqun Feng 2018-05-23 20:14 ` Mathieu Desnoyers 2018-05-23 20:14 ` Mathieu Desnoyers 2018-05-23 20:46 ` Paul E. McKenney 2018-05-23 20:46 ` Paul E. McKenney 2018-05-23 21:29 ` Mathieu Desnoyers 2018-05-23 21:29 ` Mathieu Desnoyers 2018-05-24 1:03 ` Michael Ellerman 2018-05-24 1:03 ` Michael Ellerman 2018-05-28 7:00 ` Mathieu Desnoyers 2018-05-28 7:00 ` Mathieu Desnoyers 2018-05-18 12:38 ` Michael Ellerman 2018-05-18 12:38 ` Michael Ellerman 2018-04-30 22:44 ` [PATCH 08/14] powerpc: Wire up restartable sequences system call Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` [PATCH 09/14] selftests: lib.mk: Introduce OVERRIDE_TARGETS Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` mathieu.desnoyers 2018-04-30 22:44 ` [PATCH 10/14] rseq: selftests: Provide rseq library (v5) Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` mathieu.desnoyers 2018-04-30 22:44 ` [PATCH 11/14] rseq: selftests: Provide basic test Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` mathieu.desnoyers 2018-04-30 22:44 ` [PATCH 12/14] rseq: selftests: Provide basic percpu ops test (v2) Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` mathieu.desnoyers 2018-04-30 22:44 ` [PATCH 13/14] rseq: selftests: Provide parametrized tests (v2) Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` mathieu.desnoyers 2018-04-30 22:44 ` [PATCH 14/14] rseq: selftests: Provide Makefile, scripts, gitignore (v2) Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` Mathieu Desnoyers 2018-04-30 22:44 ` mathieu.desnoyers 2018-05-02 3:53 ` [RFC PATCH for 4.18 00/14] Restartable Sequences Daniel Colascione 2018-05-02 8:43 ` Peter Zijlstra 2018-05-02 16:03 ` Mathieu Desnoyers 2018-05-02 16:03 ` Mathieu Desnoyers 2018-05-02 16:07 ` Daniel Colascione 2018-05-02 16:42 ` Steven Rostedt 2018-05-02 16:55 ` Daniel Colascione 2018-05-03 16:12 ` Mathieu Desnoyers 2018-05-03 16:12 ` Mathieu Desnoyers 2018-05-03 16:22 ` Daniel Colascione 2018-05-03 18:04 ` Mathieu Desnoyers 2018-05-03 18:04 ` Mathieu Desnoyers 2018-05-03 16:48 ` Joel Fernandes 2018-05-03 17:18 ` Daniel Colascione 2018-05-03 17:46 ` Joel Fernandes 2018-05-03 17:46 ` Joel Fernandes 2018-05-04 22:17 ` Ben Maurer 2018-05-04 22:17 ` Ben Maurer 2018-05-02 17:22 ` Peter Zijlstra 2018-05-02 18:27 ` Daniel Colascione 2018-05-02 20:22 ` Peter Zijlstra 2018-05-02 20:37 ` Daniel Colascione 2018-05-03 1:15 ` Steven Rostedt 2018-05-03 8:49 ` Peter Zijlstra 2018-05-06 10:03 ` Thomas Gleixner
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1564615700.2786.1527013173112.JavaMail.zimbra@efficios.com \ --to=mathieu.desnoyers@efficios.com \ --cc=ahh@google.com \ --cc=akpm@linux-foundation.org \ --cc=andi@firstfloor.org \ --cc=bmaurer@fb.com \ --cc=boqun.feng@gmail.com \ --cc=catalin.marinas@arm.com \ --cc=cl@linux.com \ --cc=davejwatson@fb.com \ --cc=hpa@zytor.com \ --cc=joelaf@google.com \ --cc=josh@joshtriplett.org \ --cc=linux-api@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux@arm.linux.org.uk \ --cc=luto@amacapital.net \ --cc=mingo@redhat.com \ --cc=mtk.manpages@gmail.com \ --cc=paulmck@linux.vnet.ibm.com \ --cc=peterz@infradead.org \ --cc=pjt@google.com \ --cc=rostedt@goodmis.org \ --cc=tglx@linutronix.de \ --cc=torvalds@linux-foundation.org \ --cc=will.deacon@arm.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.