diff options
Diffstat (limited to 'include/linux/srcu.h')
| -rw-r--r-- | include/linux/srcu.h | 15 | 
1 files changed, 11 insertions, 4 deletions
| diff --git a/include/linux/srcu.h b/include/linux/srcu.h index e1b005918bbb..d3d5fa54f25e 100644 --- a/include/linux/srcu.h +++ b/include/linux/srcu.h @@ -99,15 +99,18 @@ long srcu_batches_completed(struct srcu_struct *sp);   * power mode. This way we can notice an extended quiescent state to   * other CPUs that started a grace period. Otherwise we would delay any   * grace period as long as we run in the idle task. + * + * Similarly, we avoid claiming an SRCU read lock held if the current + * CPU is offline.   */  static inline int srcu_read_lock_held(struct srcu_struct *sp)  { -	if (rcu_is_cpu_idle()) -		return 0; -  	if (!debug_lockdep_rcu_enabled())  		return 1; - +	if (rcu_is_cpu_idle()) +		return 0; +	if (!rcu_lockdep_current_cpu_online()) +		return 0;  	return lock_is_held(&sp->dep_map);  } @@ -169,6 +172,8 @@ static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp)  	int retval = __srcu_read_lock(sp);  	rcu_lock_acquire(&(sp)->dep_map); +	rcu_lockdep_assert(!rcu_is_cpu_idle(), +			   "srcu_read_lock() used illegally while idle");  	return retval;  } @@ -182,6 +187,8 @@ static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp)  static inline void srcu_read_unlock(struct srcu_struct *sp, int idx)  	__releases(sp)  { +	rcu_lockdep_assert(!rcu_is_cpu_idle(), +			   "srcu_read_unlock() used illegally while idle");  	rcu_lock_release(&(sp)->dep_map);  	__srcu_read_unlock(sp, idx);  } | 
