Merge branch 'core-rseq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull restartable sequence support from Thomas Gleixner: "The restartable sequences syscall (finally): After a lot of back and forth discussion and massive delays caused by the speculative distraction of maintainers, the core set of restartable sequences has finally reached a consensus. It comes with the basic non disputed core implementation along with support for arm, powerpc and x86 and a full set of selftests It was exposed to linux-next earlier this week, so it does not fully comply with the merge window requirements, but there is really no point to drag it out for yet another cycle" * 'core-rseq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: rseq/selftests: Provide Makefile, scripts, gitignore rseq/selftests: Provide parametrized tests rseq/selftests: Provide basic percpu ops test rseq/selftests: Provide basic test rseq/selftests: Provide rseq library selftests/lib.mk: Introduce OVERRIDE_TARGETS powerpc: Wire up restartable sequences system call powerpc: Add syscall detection for restartable sequences powerpc: Add support for restartable sequences x86: Wire up restartable sequence system call x86: Add support for restartable sequences arm: Wire up restartable sequences system call arm: Add syscall detection for restartable sequences arm: Add restartable sequences support rseq: Introduce restartable sequences system call uapi/headers: Provide types_32_64.h
This commit is contained in:
@@ -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]
|
||||
|
Reference in New Issue
Block a user