diff options
Diffstat (limited to 'kernel/rcu/tree.c')
| -rw-r--r-- | kernel/rcu/tree.c | 10 | 
1 files changed, 10 insertions, 0 deletions
| diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 1250e4bd4b85..b0ad62b0e7b8 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -882,6 +882,11 @@ void rcu_irq_exit(void)  	RCU_LOCKDEP_WARN(!irqs_disabled(), "rcu_irq_exit() invoked with irqs enabled!!!");  	rdtp = this_cpu_ptr(&rcu_dynticks); + +	/* Page faults can happen in NMI handlers, so check... */ +	if (rdtp->dynticks_nmi_nesting) +		return; +  	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&  		     rdtp->dynticks_nesting < 1);  	if (rdtp->dynticks_nesting <= 1) { @@ -1015,6 +1020,11 @@ void rcu_irq_enter(void)  	RCU_LOCKDEP_WARN(!irqs_disabled(), "rcu_irq_enter() invoked with irqs enabled!!!");  	rdtp = this_cpu_ptr(&rcu_dynticks); + +	/* Page faults can happen in NMI handlers, so check... */ +	if (rdtp->dynticks_nmi_nesting) +		return; +  	oldval = rdtp->dynticks_nesting;  	rdtp->dynticks_nesting++;  	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && | 
