| From efb7942270a2a6dbb558bc7ea12b7e87afb710da Mon Sep 17 00:00:00 2001 |
| From: Peter Zijlstra <peterz@infradead.org> |
| Date: Tue, 7 May 2019 23:25:54 +0200 |
| Subject: [PATCH] x86/entry/32: Clean up return from interrupt preemption path |
| |
| commit 5e1246ff2d3707992e3bf3eaa45551f7fab97983 upstream. |
| |
| The code flow around the return from interrupt preemption point seems |
| needlessly complicated. |
| |
| There is only one site jumping to resume_kernel, and none (outside of |
| resume_kernel) jumping to restore_all_kernel. Inline resume_kernel |
| in restore_all_kernel and avoid the CONFIG_PREEMPT dependent label. |
| |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S |
| index f49e11669271..517e42de9797 100644 |
| --- a/arch/x86/entry/entry_32.S |
| +++ b/arch/x86/entry/entry_32.S |
| @@ -67,7 +67,6 @@ |
| # define preempt_stop(clobbers) DISABLE_INTERRUPTS(clobbers); TRACE_IRQS_OFF |
| #else |
| # define preempt_stop(clobbers) |
| -# define resume_kernel restore_all_kernel |
| #endif |
| |
| .macro TRACE_IRQS_IRET |
| @@ -755,7 +754,7 @@ ret_from_intr: |
| andl $SEGMENT_RPL_MASK, %eax |
| #endif |
| cmpl $USER_RPL, %eax |
| - jb resume_kernel # not returning to v8086 or userspace |
| + jb restore_all_kernel # not returning to v8086 or userspace |
| |
| ENTRY(resume_userspace) |
| DISABLE_INTERRUPTS(CLBR_ANY) |
| @@ -765,18 +764,6 @@ ENTRY(resume_userspace) |
| jmp restore_all |
| END(ret_from_exception) |
| |
| -#ifdef CONFIG_PREEMPT |
| -ENTRY(resume_kernel) |
| - DISABLE_INTERRUPTS(CLBR_ANY) |
| - cmpl $0, PER_CPU_VAR(__preempt_count) |
| - jnz restore_all_kernel |
| - testl $X86_EFLAGS_IF, PT_EFLAGS(%esp) # interrupts off (exception path) ? |
| - jz restore_all_kernel |
| - call preempt_schedule_irq |
| - jmp restore_all_kernel |
| -END(resume_kernel) |
| -#endif |
| - |
| GLOBAL(__begin_SYSENTER_singlestep_region) |
| /* |
| * All code from here through __end_SYSENTER_singlestep_region is subject |
| @@ -1027,6 +1014,15 @@ restore_all: |
| INTERRUPT_RETURN |
| |
| restore_all_kernel: |
| +#ifdef CONFIG_PREEMPT |
| + DISABLE_INTERRUPTS(CLBR_ANY) |
| + cmpl $0, PER_CPU_VAR(__preempt_count) |
| + jnz .Lno_preempt |
| + testl $X86_EFLAGS_IF, PT_EFLAGS(%esp) # interrupts off (exception path) ? |
| + jz .Lno_preempt |
| + call preempt_schedule_irq |
| +.Lno_preempt: |
| +#endif |
| TRACE_IRQS_IRET |
| PARANOID_EXIT_TO_KERNEL_MODE |
| BUG_IF_WRONG_CR3 |
| -- |
| 2.7.4 |
| |