From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753585AbbC3SLJ (ORCPT ); Mon, 30 Mar 2015 14:11:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46499 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753355AbbC3SKv (ORCPT ); Mon, 30 Mar 2015 14:10:51 -0400 From: Denys Vlasenko To: Ingo Molnar Cc: Denys Vlasenko , Linus Torvalds , Steven Rostedt , Borislav Petkov , "H. Peter Anvin" , Andy Lutomirski , Oleg Nesterov , Frederic Weisbecker , Alexei Starovoitov , Will Drewry , Kees Cook , x86@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 5/5] x86/asm/entry/64: drop exit_intr label Date: Mon, 30 Mar 2015 20:09:35 +0200 Message-Id: <1427738975-7391-6-git-send-email-dvlasenk@redhat.com> In-Reply-To: <1427738975-7391-1-git-send-email-dvlasenk@redhat.com> References: <1427738975-7391-1-git-send-email-dvlasenk@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org At this label, we test whether interrupt/exception was in kernel. If it did, we jump to preemption check. If preemption does happen (IOW if we call preempt_schedule_irq), we go back to exit_intr. But it's pointless, we already know that test succeeded last time, preemption doesn't change the fact that interrupt/exception was in kernel. We can go back directly to checking PER_CPU_VAR(__preempt_count) instead. This makes exit_intr label unused. Dropping it. While at it, tidy up TEST insn width to use shorter insn form, use logically correct JZ mnemonic instead of JE (this doesn't change code), use X86_EFLAGS_IF_BIT instead of literal 9. Signed-off-by: Denys Vlasenko CC: Linus Torvalds CC: Steven Rostedt CC: Ingo Molnar CC: Borislav Petkov CC: "H. Peter Anvin" CC: Andy Lutomirski CC: Oleg Nesterov CC: Frederic Weisbecker CC: Alexei Starovoitov CC: Will Drewry CC: Kees Cook CC: x86@kernel.org CC: linux-kernel@vger.kernel.org --- arch/x86/kernel/entry_64.S | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 16bf357..bc90f63 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -653,9 +653,8 @@ ret_from_intr: CFI_DEF_CFA_REGISTER rsp CFI_ADJUST_CFA_OFFSET RBP -exit_intr: - testl $3,CS(%rsp) - je retint_kernel + testb $3,CS(%rsp) + jz retint_kernel /* Interrupt came from user space */ GET_THREAD_INFO(%rcx) @@ -740,12 +739,12 @@ retint_kernel: #ifdef CONFIG_PREEMPT /* Interrupts are off */ /* Check if we need preemption */ - cmpl $0,PER_CPU_VAR(__preempt_count) - jnz 1f - bt $9,EFLAGS(%rsp) /* interrupts were off? */ + bt $X86_EFLAGS_IF_BIT,EFLAGS(%rsp) /* interrupts were off? */ jnc 1f +0: cmpl $0,PER_CPU_VAR(__preempt_count) + jnz 1f call preempt_schedule_irq - jmp exit_intr + jmp 0b 1: #endif /* -- 1.8.1.4