diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-08-20 18:13:37 +0300 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-08-25 12:32:48 +0300 |
commit | 3302caddf10ad50710dbb7a94ccbdb3ad5bf1412 (patch) | |
tree | 4a25e5f4dffa272d4c86450290bbeff3c7be6005 /arch/arm/kernel/signal.c | |
parent | 01e09a28167c338684606b70797422da3bbb6650 (diff) | |
download | linux-3302caddf10ad50710dbb7a94ccbdb3ad5bf1412.tar.xz |
ARM: entry: efficiency cleanups
Make the "fast" syscall return path fast again. The addition of IRQ
tracing and context tracking has made this path grossly inefficient.
We can do much better if these options are enabled if we save the
syscall return code on the stack - we then don't need to save a bunch
of registers around every single callout to C code.
Acked-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/signal.c')
-rw-r--r-- | arch/arm/kernel/signal.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 423663e23791..b6cda06b455f 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -562,6 +562,12 @@ static int do_signal(struct pt_regs *regs, int syscall) asmlinkage int do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall) { + /* + * The assembly code enters us with IRQs off, but it hasn't + * informed the tracing code of that for efficiency reasons. + * Update the trace code with the current status. + */ + trace_hardirqs_off(); do { if (likely(thread_flags & _TIF_NEED_RESCHED)) { schedule(); |