diff mbox series

rcu: Avoid strict QS reporting in NMI context

Message ID 20220618022255.1697816-1-qiang1.zhang@intel.com (mailing list archive)
State Accepted
Commit 6a69e757b6a65bb81f1f7d12083668dddd3ba930
Headers show
Series rcu: Avoid strict QS reporting in NMI context | expand

Commit Message

Zqiang June 18, 2022, 2:22 a.m. UTC
Avoid invoke rcu_report_qs_rdp() in NMI handlers, in NMI handlers,
acquiring raw_spinlocks should be avoided, prevent NMI handlers
from blocking(spin) unnecessarily.

This commit make rcu_read_unlock_strict() early return when in
NMI context.

Signed-off-by: Zqiang <qiang1.zhang@intel.com>
---
 kernel/rcu/tree_plugin.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Paul E. McKenney June 18, 2022, 2:56 p.m. UTC | #1
On Sat, Jun 18, 2022 at 12:15:23PM +0000, Zhang, Qiang1 wrote:
> Le sam. 18 juin 2022, 04:23, Zqiang <qiang1.zhang@intel.com<mailto:qiang1.zhang@intel.com>> a écrit :
> Avoid invoke rcu_report_qs_rdp() in NMI handlers, in NMI handlers,
> acquiring raw_spinlocks should be avoided, prevent NMI handlers
> from blocking(spin) unnecessarily.
> 
> This commit make rcu_read_unlock_strict() early return when in
> NMI context.
> 
> Signed-off-by: Zqiang <qiang1.zhang@intel.com<mailto:qiang1.zhang@intel.com>>
> ---
>  kernel/rcu/tree_plugin.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
> index dc78726b993f..e7a36e248a8a 100644
> --- a/kernel/rcu/tree_plugin.h
> +++ b/kernel/rcu/tree_plugin.h
> @@ -821,7 +821,7 @@ void rcu_read_unlock_strict(void)
>  {
>         struct rcu_data *rdp;
> 
> -       if (irqs_disabled() || preempt_count() || !rcu_state.gp_kthread)
> +       if (in_nmi() || irqs_disabled() || preempt_count() || !rcu_state.gp_kthread)
> 
> >Doesn't preempt_count() imply in_nmi()?
> >
> 
> 
> 
> It looks like this, thanks Frederic
> 
> #define nmi_count()     (preempt_count() & NMI_MASK)
> #define in_nmi()                (nmi_count())
> 
> Hi Paul, sorry it’s my mistake.

Thank you both for catching this!

I clearly should not be reviewing incoming patches late on Friday
evening!

							Thanx, Paul

> >Thanks.
> 
>                 return;
>         rdp = this_cpu_ptr(&rcu_data);
>         rdp->cpu_no_qs.b.norm = false;
> --
> 2.25.1
diff mbox series

Patch

diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index dc78726b993f..e7a36e248a8a 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -821,7 +821,7 @@  void rcu_read_unlock_strict(void)
 {
 	struct rcu_data *rdp;
 
-	if (irqs_disabled() || preempt_count() || !rcu_state.gp_kthread)
+	if (in_nmi() || irqs_disabled() || preempt_count() || !rcu_state.gp_kthread)
 		return;
 	rdp = this_cpu_ptr(&rcu_data);
 	rdp->cpu_no_qs.b.norm = false;