Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp3789691ybk; Tue, 19 May 2020 13:01:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy3rLHq+islM5aZ8m5249jchPk9NiAuYVzpAieVT7LbUzJevmPzqYD5o52fFpradWqQnUG6 X-Received: by 2002:a17:906:409:: with SMTP id d9mr755196eja.445.1589918482836; Tue, 19 May 2020 13:01:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589918482; cv=none; d=google.com; s=arc-20160816; b=05vpUtE8522kBQSelkP04uueZ1qgJ8ptMXYzv3oQ9negDLGWOHfxj2p7epA3eJR5FS /UZ+YCLTbvpBT9Z94Ncsbr1yZsHlj+Q0SKjOGkydiMSGR59R0VpOORDtIBHJ4yYkG5fq 17bksCEM8hsExunq5P+mpx24tEPagAwy5TWGdfQY26PrBVZ3+rMCCAZ09B2QE5gpaBMO zPs6tu5Vh0kXEcoaVBz9LzV9/JnwsMZd8JfTi+y3CzKYeBSGE5QAUzl30pegAiL4d+is ODhIJmIwWnFKIQ7q69ZwxRvisAR7JrDyZ9Y95e+Zoyr4v+LJcD3n9VgDiLdlTizEUES3 NePw== 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=qctu2vfOCgieVISHC9MLMvGyEVZvscBnHcOFL8DU6zU=; b=mBY2MFOianP9JnT/WiOVpjVBxYTKKxKTjqwKS0zr5e8FNV92cjgfZWD7H4HS3ZiVQ2 tkqFdpG7gFMCM1fAmvDO/CI/I0ujEn7hNlvBT2LV8+clr9i6gGCjxY/u92XEPBMV3Cgr eeMW1qsx23uo0g1k5z0nI+TGmZ/A+/owrmPt6lm8O1dWKL7ufiAKvgWlzz5wG7Gmnba3 tPphGuMzaaU8aOgCgpyw6pXG72K5ZDORYFGSclnHHoKM/xAq/rk+nt7VTLouVonr6YCq d0i5mStTvCE0kLpQo2Ui4IQ8OyQ2yM4ZqH9AezQ1WXkE52hvcHfgLRGPL+En8Wz9e2m+ CnNQ== 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 f22si501347ejq.720.2020.05.19.13.00.57; Tue, 19 May 2020 13:01:22 -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 S1728305AbgEST67 (ORCPT + 99 others); Tue, 19 May 2020 15:58:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52024 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728199AbgEST6s (ORCPT ); Tue, 19 May 2020 15:58:48 -0400 Received: from Galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 42C44C08C5C0; Tue, 19 May 2020 12:58:48 -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 1jb8Nv-0008Rd-8a; Tue, 19 May 2020 21:58:43 +0200 Received: from [127.0.1.1] (localhost [IPv6:::1]) by tip-bot2.lab.linutronix.de (Postfix) with ESMTP id BC4AB1C0178; Tue, 19 May 2020 21:58:35 +0200 (CEST) Date: Tue, 19 May 2020 19:58:35 -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/entry/common: Provide idtentry_enter/exit() Cc: Thomas Gleixner , Alexandre Chartre , Peter Zijlstra , Andy Lutomirski , x86 , LKML In-Reply-To: <20200505134904.457578656@linutronix.de> References: <20200505134904.457578656@linutronix.de> MIME-Version: 1.0 Message-ID: <158991831562.17951.6216563865898704227.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: eadb831607477ba774b3314bdc956331b41817d6 Gitweb: https://git.kernel.org/tip/eadb831607477ba774b3314bdc956331b41817d6 Author: Thomas Gleixner AuthorDate: Thu, 26 Mar 2020 16:28:52 +01:00 Committer: Thomas Gleixner CommitterDate: Tue, 19 May 2020 16:03:57 +02:00 x86/entry/common: Provide idtentry_enter/exit() Provide functions which handle the low level entry and exit similar to enter/exit from user mode. Signed-off-by: Thomas Gleixner Reviewed-by: Alexandre Chartre Acked-by: Peter Zijlstra Acked-by: Andy Lutomirski Link: https://lkml.kernel.org/r/20200505134904.457578656@linutronix.de --- arch/x86/entry/common.c | 99 +++++++++++++++++++++++++++++++- arch/x86/include/asm/idtentry.h | 3 +- 2 files changed, 102 insertions(+) diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c index e4f9f5f..9ebe334 100644 --- a/arch/x86/entry/common.c +++ b/arch/x86/entry/common.c @@ -510,3 +510,102 @@ SYSCALL_DEFINE0(ni_syscall) { return -ENOSYS; } + +/** + * idtentry_enter - Handle state tracking on idtentry + * @regs: Pointer to pt_regs of interrupted context + * + * Invokes: + * - lockdep irqflag state tracking as low level ASM entry disabled + * interrupts. + * + * - Context tracking if the exception hit user mode. + * + * - RCU notification if the exception hit kernel mode. + * + * - The hardirq tracer to keep the state consistent as low level ASM + * entry disabled interrupts. + */ +void noinstr idtentry_enter(struct pt_regs *regs) +{ + if (user_mode(regs)) { + enter_from_user_mode(); + } else { + lockdep_hardirqs_off(CALLER_ADDR0); + rcu_irq_enter(); + instrumentation_begin(); + trace_hardirqs_off_prepare(); + instrumentation_end(); + } +} + +/** + * idtentry_exit - Common code to handle return from exceptions + * @regs: Pointer to pt_regs (exception entry regs) + * + * Depending on the return target (kernel/user) this runs the necessary + * preemption and work checks if possible and required and returns to + * the caller with interrupts disabled and no further work pending. + * + * This is the last action before returning to the low level ASM code which + * just needs to return to the appropriate context. + * + * Invoked by all exception/interrupt IDTENTRY handlers which are not + * returning through the paranoid exit path (all except NMI, #DF and the IST + * variants of #MC and #DB) and are therefore on the thread stack. + */ +void noinstr idtentry_exit(struct pt_regs *regs) +{ + lockdep_assert_irqs_disabled(); + + /* Check whether this returns to user mode */ + if (user_mode(regs)) { + prepare_exit_to_usermode(regs); + } else if (regs->flags & X86_EFLAGS_IF) { + /* Check kernel preemption, if enabled */ + if (IS_ENABLED(CONFIG_PREEMPTION)) { + /* + * This needs to be done very carefully. + * idtentry_enter() invoked rcu_irq_enter(). This + * needs to be undone before scheduling. + * + * Preemption is disabled inside of RCU idle + * sections. When the task returns from + * preempt_schedule_irq(), RCU is still watching. + * + * rcu_irq_exit_preempt() has additional state + * checking if CONFIG_PROVE_RCU=y + */ + if (!preempt_count()) { + if (IS_ENABLED(CONFIG_DEBUG_ENTRY)) + WARN_ON_ONCE(!on_thread_stack()); + instrumentation_begin(); + rcu_irq_exit_preempt(); + if (need_resched()) + preempt_schedule_irq(); + /* Covers both tracing and lockdep */ + trace_hardirqs_on(); + instrumentation_end(); + return; + } + } + /* + * If preemption is disabled then this needs to be done + * carefully with respect to RCU. The exception might come + * from a RCU idle section in the idle task due to the fact + * that safe_halt() enables interrupts. So this needs the + * same ordering of lockdep/tracing and RCU as the return + * to user mode path. + */ + instrumentation_begin(); + /* Tell the tracer that IRET will enable interrupts */ + trace_hardirqs_on_prepare(); + lockdep_hardirqs_on_prepare(CALLER_ADDR0); + instrumentation_end(); + rcu_irq_exit(); + lockdep_hardirqs_on(CALLER_ADDR0); + } else { + /* IRQ flags state is correct already. Just tell RCU */ + rcu_irq_exit(); + } +} diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h index bbd81e2..2adfd80 100644 --- a/arch/x86/include/asm/idtentry.h +++ b/arch/x86/include/asm/idtentry.h @@ -7,6 +7,9 @@ #ifndef __ASSEMBLY__ +void idtentry_enter(struct pt_regs *regs); +void idtentry_exit(struct pt_regs *regs); + /** * DECLARE_IDTENTRY - Declare functions for simple IDT entry points * No error code pushed by hardware