]> www.infradead.org Git - linux.git/commitdiff
rcu: Clamp ->dynticks_nmi_nesting at eqs entry/exit
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 3 Oct 2017 15:28:04 +0000 (08:28 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 27 Nov 2017 16:40:10 +0000 (08:40 -0800)
In preparation for merging dyntick-idle irq handling into the NMI
algorithm, clamp ->dynticks_nmi_nesting value to allow for interrupts
that enter but never leave and vice versa.

It is important that the clamping happen outside of the extended quiescent
state.  Otherwise, there will be short windows where irqs and NMIs fail
to convince RCU to start watching.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcu/rcu.h
kernel/rcu/tree.c

index 59c471de342a05140c7c5271c6fa4ce16f364361..f4a411964c417ffa2fbe68e38744b9d182018831 100644 (file)
@@ -56,6 +56,8 @@
 #define DYNTICK_TASK_EXIT_IDLE    (DYNTICK_TASK_NEST_VALUE + \
                                    DYNTICK_TASK_FLAG)
 
+#define DYNTICK_IRQ_NONIDLE    ((INT_MAX / 2) + 1)
+
 
 /*
  * Grace-period counter management.
index 419f3c38e1b6cba26cf1ff1fee8ea4cd77724dfe..142cdd4a50c980b91d7042957b90f99179283cfa 100644 (file)
@@ -818,6 +818,7 @@ static void rcu_eqs_enter(bool user)
        struct rcu_dynticks *rdtp;
 
        rdtp = this_cpu_ptr(&rcu_dynticks);
+       WRITE_ONCE(rdtp->dynticks_nmi_nesting, 0);
        WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
                     (rdtp->dynticks_nesting & DYNTICK_TASK_NEST_MASK) == 0);
        if ((rdtp->dynticks_nesting & DYNTICK_TASK_NEST_MASK) == DYNTICK_TASK_NEST_VALUE)
@@ -1008,6 +1009,7 @@ static void rcu_eqs_exit(bool user)
                rcu_eqs_exit_common(DYNTICK_TASK_EXIT_IDLE, user);
                rdtp->dynticks_nesting = DYNTICK_TASK_EXIT_IDLE;
                __this_cpu_dec(disable_rcu_irq_enter);
+               WRITE_ONCE(rdtp->dynticks_nmi_nesting, DYNTICK_IRQ_NONIDLE);
        }
 }