Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp3785020ybk; Tue, 19 May 2020 12:54:34 -0700 (PDT) X-Google-Smtp-Source: ABdhPJymlb1/sKGmquwMGUr6NnSb6nqM8DSWAWcNb/meQccP4K3O7+Vcks8ByS2g/+1Pdbqu5Ojm X-Received: by 2002:a05:6402:1aca:: with SMTP id ba10mr509578edb.100.1589918073888; Tue, 19 May 2020 12:54:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589918073; cv=none; d=google.com; s=arc-20160816; b=rrLTxc6e0uGXldCqpFqAB9FB+nzR+3OeUU92QkA34Rn1bot/wm5nocQ6r3EstEnD0/ P2jxsvWmU0pvrC0okRZSZEVKmHUtGkBVXFvpQEMQbLndx1LW2smyLgBIR91db+Z2i+sp SL8R8UuG45fe79Kwhn4Tb1udjdBhgcDpYsNSnBcxEdtVtNQhRERFIyuXtLjWetiilTaC xDxOk35Z1ovhaeO3tCLpaS6gvvZVhhBfk+oXEyTu7WG3WTPOiL31L96xp+OV0u+PiFeP A7n9WJyTn5UID8R4sh/0X7VslPGSClRB61+2ckDm9XMBhDtM8cwxmNBVCbBXDO1VZ9mc M2JA== 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=oRigGiUP5dAJkh639PI+gGAQkTseIDveHUJOyW54/JQ=; b=EvWBZUMvLrgBdYVcevTAtD6JKkfZe0z9uEyEoWepW9ScDfiB59yLlFObQPz8eilSF1 LMW9q8IJbHJuEVCvPskDN4hJllkapWxL8d5/Y+mxWwAqkTuDARWErJDKD0jzE7FYBn7y 4Fo0RPhZAC6B+LNOsS4toSnp1DG0cDciYrDGSfVhR1TIzxy4DWxi8ke7jyMTEXxG8dqW Y33o6ZNhPFalN06UzmhznXU6u/iecG5K/478qjkdLzfhlfg3J3EFvQs2f9bSCwGxu+20 Wrd7Gz5lM6uBLzZ2BlleJXABesmFxbOgBFPfzHrqo9YZHvKNcFv18bxyP+DVEeCOF1Rv VcPA== 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 og21si479872ejb.64.2020.05.19.12.54.10; Tue, 19 May 2020 12:54:33 -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 S1727796AbgESTwp (ORCPT + 99 others); Tue, 19 May 2020 15:52:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50982 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726940AbgESTwk (ORCPT ); Tue, 19 May 2020 15:52:40 -0400 Received: from Galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 788BAC08C5C3; Tue, 19 May 2020 12:52:40 -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 1jb8Hx-0007pB-3o; Tue, 19 May 2020 21:52:33 +0200 Received: from [127.0.1.1] (localhost [IPv6:::1]) by tip-bot2.lab.linutronix.de (Postfix) with ESMTP id 9ADB81C0178; Tue, 19 May 2020 21:52:32 +0200 (CEST) Date: Tue, 19 May 2020 19:52:32 -0000 From: "tip-bot2 for Paul E. McKenney" Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: core/rcu] rcu: Make RCU IRQ enter/exit functions rely on in_nmi() Cc: "Paul E. McKenney" , "Peter Zijlstra (Intel)" , Thomas Gleixner , Alexandre Chartre , x86 , LKML In-Reply-To: <20200505134101.617130349@linutronix.de> References: <20200505134101.617130349@linutronix.de> MIME-Version: 1.0 Message-ID: <158991795254.17951.5903947139387946517.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 core/rcu branch of tip: Commit-ID: 9ea366f669ded353ae49754216c042e7d2f72ba6 Gitweb: https://git.kernel.org/tip/9ea366f669ded353ae49754216c042e7d2f72ba6 Author: Paul E. McKenney AuthorDate: Thu, 13 Feb 2020 12:31:16 -08:00 Committer: Thomas Gleixner CommitterDate: Tue, 19 May 2020 15:51:21 +02:00 rcu: Make RCU IRQ enter/exit functions rely on in_nmi() The rcu_nmi_enter_common() and rcu_nmi_exit_common() functions take an "irq" parameter that indicates whether these functions have been invoked from an irq handler (irq==true) or an NMI handler (irq==false). However, recent changes have applied notrace to a few critical functions such that rcu_nmi_enter_common() and rcu_nmi_exit_common() many now rely on in_nmi(). Note that in_nmi() works no differently than before, but rather that tracing is now prohibited in code regions where in_nmi() would incorrectly report NMI state. Therefore remove the "irq" parameter and inline rcu_nmi_enter_common() and rcu_nmi_exit_common() into rcu_nmi_enter() and rcu_nmi_exit(), respectively. Signed-off-by: Paul E. McKenney Signed-off-by: Peter Zijlstra (Intel) Signed-off-by: Thomas Gleixner Reviewed-by: Alexandre Chartre Link: https://lkml.kernel.org/r/20200505134101.617130349@linutronix.de --- kernel/rcu/tree.c | 47 ++++++++++++++-------------------------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 0713ef3..9454016 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -664,16 +664,18 @@ noinstr void rcu_user_enter(void) } #endif /* CONFIG_NO_HZ_FULL */ -/* +/** + * rcu_nmi_exit - inform RCU of exit from NMI context + * * If we are returning from the outermost NMI handler that interrupted an * RCU-idle period, update rdp->dynticks and rdp->dynticks_nmi_nesting * to let the RCU grace-period handling know that the CPU is back to * being RCU-idle. * - * If you add or remove a call to rcu_nmi_exit_common(), be sure to test + * If you add or remove a call to rcu_nmi_exit(), be sure to test * with CONFIG_RCU_EQS_DEBUG=y. */ -static __always_inline void rcu_nmi_exit_common(bool irq) +noinstr void rcu_nmi_exit(void) { struct rcu_data *rdp = this_cpu_ptr(&rcu_data); @@ -704,7 +706,7 @@ static __always_inline void rcu_nmi_exit_common(bool irq) trace_rcu_dyntick(TPS("Startirq"), rdp->dynticks_nmi_nesting, 0, atomic_read(&rdp->dynticks)); WRITE_ONCE(rdp->dynticks_nmi_nesting, 0); /* Avoid store tearing. */ - if (irq) + if (!in_nmi()) rcu_prepare_for_idle(); instrumentation_end(); @@ -712,22 +714,11 @@ static __always_inline void rcu_nmi_exit_common(bool irq) rcu_dynticks_eqs_enter(); // ... but is no longer watching here. - if (irq) + if (!in_nmi()) rcu_dynticks_task_enter(); } /** - * rcu_nmi_exit - inform RCU of exit from NMI context - * - * If you add or remove a call to rcu_nmi_exit(), be sure to test - * with CONFIG_RCU_EQS_DEBUG=y. - */ -void noinstr rcu_nmi_exit(void) -{ - rcu_nmi_exit_common(false); -} - -/** * rcu_irq_exit - inform RCU that current CPU is exiting irq towards idle * * Exit from an interrupt handler, which might possibly result in entering @@ -749,7 +740,7 @@ void noinstr rcu_nmi_exit(void) void noinstr rcu_irq_exit(void) { lockdep_assert_irqs_disabled(); - rcu_nmi_exit_common(true); + rcu_nmi_exit(); } /* @@ -838,7 +829,7 @@ void noinstr rcu_user_exit(void) #endif /* CONFIG_NO_HZ_FULL */ /** - * rcu_nmi_enter_common - inform RCU of entry to NMI context + * rcu_nmi_enter - inform RCU of entry to NMI context * @irq: Is this call from rcu_irq_enter? * * If the CPU was idle from RCU's viewpoint, update rdp->dynticks and @@ -847,10 +838,10 @@ void noinstr rcu_user_exit(void) * long as the nesting level does not overflow an int. (You will probably * run out of stack space first.) * - * If you add or remove a call to rcu_nmi_enter_common(), be sure to test + * If you add or remove a call to rcu_nmi_enter(), be sure to test * with CONFIG_RCU_EQS_DEBUG=y. */ -static __always_inline void rcu_nmi_enter_common(bool irq) +noinstr void rcu_nmi_enter(void) { long incby = 2; struct rcu_data *rdp = this_cpu_ptr(&rcu_data); @@ -868,18 +859,18 @@ static __always_inline void rcu_nmi_enter_common(bool irq) */ if (rcu_dynticks_curr_cpu_in_eqs()) { - if (irq) + if (!in_nmi()) rcu_dynticks_task_exit(); // RCU is not watching here ... rcu_dynticks_eqs_exit(); // ... but is watching here. - if (irq) + if (!in_nmi()) rcu_cleanup_after_idle(); incby = 1; - } else if (irq) { + } else if (!in_nmi()) { instrumentation_begin(); if (tick_nohz_full_cpu(rdp->cpu) && rdp->dynticks_nmi_nesting == DYNTICK_IRQ_NONIDLE && @@ -914,14 +905,6 @@ static __always_inline void rcu_nmi_enter_common(bool irq) } /** - * rcu_nmi_enter - inform RCU of entry to NMI context - */ -noinstr void rcu_nmi_enter(void) -{ - rcu_nmi_enter_common(false); -} - -/** * rcu_irq_enter - inform RCU that current CPU is entering irq away from idle * * Enter an interrupt handler, which might possibly result in exiting @@ -946,7 +929,7 @@ noinstr void rcu_nmi_enter(void) noinstr void rcu_irq_enter(void) { lockdep_assert_irqs_disabled(); - rcu_nmi_enter_common(true); + rcu_nmi_enter(); } /*