diff options
Diffstat (limited to 'kernel/rcupdate.c')
| -rw-r--r-- | kernel/rcupdate.c | 32 | 
1 files changed, 24 insertions, 8 deletions
| diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index f3240e987928..7784bd216b6a 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c @@ -142,10 +142,17 @@ static int rcuhead_fixup_init(void *addr, enum debug_obj_state state)  		 * Ensure that queued callbacks are all executed.  		 * If we detect that we are nested in a RCU read-side critical  		 * section, we should simply fail, otherwise we would deadlock. +		 * In !PREEMPT configurations, there is no way to tell if we are +		 * in a RCU read-side critical section or not, so we never +		 * attempt any fixup and just print a warning.  		 */ +#ifndef CONFIG_PREEMPT +		WARN_ON_ONCE(1); +		return 0; +#endif  		if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||  		    irqs_disabled()) { -			WARN_ON(1); +			WARN_ON_ONCE(1);  			return 0;  		}  		rcu_barrier(); @@ -184,10 +191,17 @@ static int rcuhead_fixup_activate(void *addr, enum debug_obj_state state)  		 * Ensure that queued callbacks are all executed.  		 * If we detect that we are nested in a RCU read-side critical  		 * section, we should simply fail, otherwise we would deadlock. +		 * In !PREEMPT configurations, there is no way to tell if we are +		 * in a RCU read-side critical section or not, so we never +		 * attempt any fixup and just print a warning.  		 */ +#ifndef CONFIG_PREEMPT +		WARN_ON_ONCE(1); +		return 0; +#endif  		if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||  		    irqs_disabled()) { -			WARN_ON(1); +			WARN_ON_ONCE(1);  			return 0;  		}  		rcu_barrier(); @@ -214,15 +228,17 @@ static int rcuhead_fixup_free(void *addr, enum debug_obj_state state)  		 * Ensure that queued callbacks are all executed.  		 * If we detect that we are nested in a RCU read-side critical  		 * section, we should simply fail, otherwise we would deadlock. -		 * Note that the machinery to reliably determine whether -		 * or not we are in an RCU read-side critical section -		 * exists only in the preemptible RCU implementations -		 * (TINY_PREEMPT_RCU and TREE_PREEMPT_RCU), which is why -		 * DEBUG_OBJECTS_RCU_HEAD is disallowed if !PREEMPT. +		 * In !PREEMPT configurations, there is no way to tell if we are +		 * in a RCU read-side critical section or not, so we never +		 * attempt any fixup and just print a warning.  		 */ +#ifndef CONFIG_PREEMPT +		WARN_ON_ONCE(1); +		return 0; +#endif  		if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||  		    irqs_disabled()) { -			WARN_ON(1); +			WARN_ON_ONCE(1);  			return 0;  		}  		rcu_barrier(); | 
