Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp3790844ybk; Tue, 19 May 2020 13:02:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyBCN+9d0oP6qSqOYrq5El+Op8Mkfl9YL16rkm+P7n7C8kU8gu3IRquV/dY1gVfS7RzJ5dF X-Received: by 2002:a17:906:2e46:: with SMTP id r6mr818837eji.222.1589918568721; Tue, 19 May 2020 13:02:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589918568; cv=none; d=google.com; s=arc-20160816; b=v8kbl2Y4TAMROb7Cuo//k5SBfhDdIYI0tDhPwK2rNNrapir5vdPDbSsR0bK6QPoYo/ UEnWO5ZZ8wQJpbNG4jvRrJiRXPPFtG8BjM9QOZeVHXBWDafQ2lYD2xjBiXxSWxV165dj gZp3oJVPXr3iKz0d8f5yuSXUJZYBJCGNlGcbHuc38YZUYOZ4UGVNRiR4VMFJxHn69P2o 6BMsqomQQomPCW1Z5QxHbBuMtxpMjBQAm+H6REV6FQ6qH9WEZ7/5gewrQ0Q3WrzmVop1 g7AioO7UQJVCHRJXvh6CSY9wn5/3nxirFv1QJlkKj+9XQgFKIZx8Nk8VJCNBCQb39ot5 z44A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :robot-unsubscribe:robot-id:message-id:mime-version:references :in-reply-to:cc:subject:to:reply-to:from:date; bh=iFZObsEHeVNJnJUiuByWmM0BjOwSPwCKMglmxZoyImU=; b=UnL35GDvc+Ip366ucmeyACC1blZpttRtP5heG/IILNZANYIgKKHnuBEh0qPXIYdSjw SzXTDumK5LQLV6NiBMD1CUJMSmiOjBuaKZihpaKXpjMB5l+v5O/nhr8sPxIRhxJ5f6fI xIaiDwdhQ/y2Y5Qj+nfxWC8UgRxM5Y8PWmg4qraDKHPnQOfO18xgbn0Jmx8xyAfm4bY1 Wav3CcmZqmsTypiyiR8PRVQG8ylnbgoVubA82EDHq6j9Ub+MUb+vCp9aERMwuEM7WzAC So3FlydklvLHb75T+L0RDbh1PTRELnNlmUAzbKi5QKEGyVwV1jP/33b99vrRbLaeQK4c yM7A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m22si536625eje.448.2020.05.19.13.02.12; Tue, 19 May 2020 13:02:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728441AbgEST7V (ORCPT + 99 others); Tue, 19 May 2020 15:59:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52076 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728293AbgEST66 (ORCPT ); Tue, 19 May 2020 15:58:58 -0400 Received: from Galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3E4C3C08C5C4; Tue, 19 May 2020 12:58:58 -0700 (PDT) Received: from [5.158.153.53] (helo=tip-bot2.lab.linutronix.de) by Galois.linutronix.de with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1jb8O4-0008W8-Df; Tue, 19 May 2020 21:58:52 +0200 Received: from [127.0.1.1] (localhost [IPv6:::1]) by tip-bot2.lab.linutronix.de (Postfix) with ESMTP id D02EF1C0854; Tue, 19 May 2020 21:58:38 +0200 (CEST) Date: Tue, 19 May 2020 19:58:38 -0000 From: "tip-bot2 for Thomas Gleixner" Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: x86/entry] x86/traps: Make interrupt enable/disable symmetric in C code Cc: Peter Zijlstra , Thomas Gleixner , Alexandre Chartre , Andy Lutomirski , x86 , LKML In-Reply-To: <20200505134903.622702796@linutronix.de> References: <20200505134903.622702796@linutronix.de> MIME-Version: 1.0 Message-ID: <158991831873.17951.7873689032893572882.tip-bot2@tip-bot2> X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the x86/entry branch of tip: Commit-ID: 1b208500418d351c476e173f2e4bebaaf0959ef0 Gitweb: https://git.kernel.org/tip/1b208500418d351c476e173f2e4bebaaf0959ef0 Author: Thomas Gleixner AuthorDate: Wed, 23 Oct 2019 14:27:10 +02:00 Committer: Thomas Gleixner CommitterDate: Tue, 19 May 2020 16:03:54 +02:00 x86/traps: Make interrupt enable/disable symmetric in C code Traps enable interrupts conditionally but rely on the ASM return code to disable them again. That results in redundant interrupt disable and trace calls. Make the trap handlers disable interrupts before returning to avoid that, which allows simplification of the ASM entry code in follow up changes. Originally-by: Peter Zijlstra Signed-off-by: Thomas Gleixner Reviewed-by: Alexandre Chartre Acked-by: Peter Zijlstra Acked-by: Andy Lutomirski Link: https://lkml.kernel.org/r/20200505134903.622702796@linutronix.de --- arch/x86/kernel/traps.c | 28 +++++++++++++++++++--------- arch/x86/mm/fault.c | 15 +++++++++++++-- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index adcc623..f5f4a76 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -201,6 +201,7 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str, NOTIFY_STOP) { cond_local_irq_enable(regs); do_trap(trapnr, signr, str, regs, error_code, sicode, addr); + cond_local_irq_disable(regs); } } @@ -397,6 +398,8 @@ dotraplinkage void do_bounds(struct pt_regs *regs, long error_code) die("bounds", regs, error_code); do_trap(X86_TRAP_BR, SIGSEGV, "bounds", regs, error_code, 0, NULL); + + cond_local_irq_disable(regs); } enum kernel_gp_hint { @@ -456,12 +459,13 @@ dotraplinkage void do_general_protection(struct pt_regs *regs, long error_code) if (static_cpu_has(X86_FEATURE_UMIP)) { if (user_mode(regs) && fixup_umip_exception(regs)) - return; + goto exit; } if (v8086_mode(regs)) { local_irq_enable(); handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code); + local_irq_disable(); return; } @@ -473,12 +477,11 @@ dotraplinkage void do_general_protection(struct pt_regs *regs, long error_code) show_signal(tsk, SIGSEGV, "", desc, regs, error_code); force_sig(SIGSEGV); - - return; + goto exit; } if (fixup_exception(regs, X86_TRAP_GP, error_code, 0)) - return; + goto exit; tsk->thread.error_code = error_code; tsk->thread.trap_nr = X86_TRAP_GP; @@ -490,11 +493,11 @@ dotraplinkage void do_general_protection(struct pt_regs *regs, long error_code) if (!preemptible() && kprobe_running() && kprobe_fault_handler(regs, X86_TRAP_GP)) - return; + goto exit; ret = notify_die(DIE_GPF, desc, regs, error_code, X86_TRAP_GP, SIGSEGV); if (ret == NOTIFY_STOP) - return; + goto exit; if (error_code) snprintf(desc, sizeof(desc), "segment-related " GPFSTR); @@ -516,6 +519,8 @@ dotraplinkage void do_general_protection(struct pt_regs *regs, long error_code) die_addr(desc, regs, error_code, gp_addr); +exit: + cond_local_irq_disable(regs); } NOKPROBE_SYMBOL(do_general_protection); @@ -773,7 +778,7 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr) if (!user_mode(regs)) { if (fixup_exception(regs, trapnr, error_code, 0)) - return; + goto exit; task->thread.error_code = error_code; task->thread.trap_nr = trapnr; @@ -781,7 +786,7 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr) if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, SIGFPE) != NOTIFY_STOP) die(str, regs, error_code); - return; + goto exit; } /* @@ -795,10 +800,12 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr) si_code = fpu__exception_code(fpu, trapnr); /* Retry when we get spurious exceptions: */ if (!si_code) - return; + goto exit; force_sig_fault(SIGFPE, si_code, (void __user *)uprobe_get_trap_addr(regs)); +exit: + cond_local_irq_disable(regs); } dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code) @@ -853,6 +860,8 @@ do_device_not_available(struct pt_regs *regs, long error_code) info.regs = regs; math_emulate(&info); + + cond_local_irq_disable(regs); return; } #endif @@ -883,6 +892,7 @@ dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code) do_trap(X86_TRAP_IRET, SIGILL, "iret exception", regs, error_code, ILL_BADSTK, (void __user *)NULL); } + local_irq_disable(); } #endif diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 6486cce..0715720 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -927,6 +927,8 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code, force_sig_fault(SIGSEGV, si_code, (void __user *)address); + local_irq_disable(); + return; } @@ -1548,9 +1550,18 @@ do_page_fault(struct pt_regs *regs, unsigned long hw_error_code, return; /* Was the fault on kernel-controlled part of the address space? */ - if (unlikely(fault_in_kernel_space(address))) + if (unlikely(fault_in_kernel_space(address))) { do_kern_addr_fault(regs, hw_error_code, address); - else + } else { do_user_addr_fault(regs, hw_error_code, address); + /* + * User address page fault handling might have reenabled + * interrupts. Fixing up all potential exit points of + * do_user_addr_fault() and its leaf functions is just not + * doable w/o creating an unholy mess or turning the code + * upside down. + */ + local_irq_disable(); + } } NOKPROBE_SYMBOL(do_page_fault);