diff options
Diffstat (limited to 'kernel/sched')
| -rw-r--r-- | kernel/sched/core.c | 23 | ||||
| -rw-r--r-- | kernel/sched/cpupri.c | 6 | ||||
| -rw-r--r-- | kernel/sched/wait.c | 2 | 
3 files changed, 26 insertions, 5 deletions
| diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 321d800e4baa..913c6d6cc2c1 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -90,6 +90,22 @@  #define CREATE_TRACE_POINTS  #include <trace/events/sched.h> +#ifdef smp_mb__before_atomic +void __smp_mb__before_atomic(void) +{ +	smp_mb__before_atomic(); +} +EXPORT_SYMBOL(__smp_mb__before_atomic); +#endif + +#ifdef smp_mb__after_atomic +void __smp_mb__after_atomic(void) +{ +	smp_mb__after_atomic(); +} +EXPORT_SYMBOL(__smp_mb__after_atomic); +#endif +  void start_bandwidth_timer(struct hrtimer *period_timer, ktime_t period)  {  	unsigned long delta; @@ -4101,6 +4117,7 @@ static void __cond_resched(void)  int __sched _cond_resched(void)  { +	rcu_cond_resched();  	if (should_resched()) {  		__cond_resched();  		return 1; @@ -4119,15 +4136,18 @@ EXPORT_SYMBOL(_cond_resched);   */  int __cond_resched_lock(spinlock_t *lock)  { +	bool need_rcu_resched = rcu_should_resched();  	int resched = should_resched();  	int ret = 0;  	lockdep_assert_held(lock); -	if (spin_needbreak(lock) || resched) { +	if (spin_needbreak(lock) || resched || need_rcu_resched) {  		spin_unlock(lock);  		if (resched)  			__cond_resched(); +		else if (unlikely(need_rcu_resched)) +			rcu_resched();  		else  			cpu_relax();  		ret = 1; @@ -4141,6 +4161,7 @@ int __sched __cond_resched_softirq(void)  {  	BUG_ON(!in_softirq()); +	rcu_cond_resched();  /* BH disabled OK, just recording QSes. */  	if (should_resched()) {  		local_bh_enable();  		__cond_resched(); diff --git a/kernel/sched/cpupri.c b/kernel/sched/cpupri.c index 8834243abee2..981fcd7dc394 100644 --- a/kernel/sched/cpupri.c +++ b/kernel/sched/cpupri.c @@ -165,7 +165,7 @@ void cpupri_set(struct cpupri *cp, int cpu, int newpri)  		 * do a write memory barrier, and then update the count, to  		 * make sure the vector is visible when count is set.  		 */ -		smp_mb__before_atomic_inc(); +		smp_mb__before_atomic();  		atomic_inc(&(vec)->count);  		do_mb = 1;  	} @@ -185,14 +185,14 @@ void cpupri_set(struct cpupri *cp, int cpu, int newpri)  		 * the new priority vec.  		 */  		if (do_mb) -			smp_mb__after_atomic_inc(); +			smp_mb__after_atomic();  		/*  		 * When removing from the vector, we decrement the counter first  		 * do a memory barrier and then clear the mask.  		 */  		atomic_dec(&(vec)->count); -		smp_mb__after_atomic_inc(); +		smp_mb__after_atomic();  		cpumask_clear_cpu(cpu, vec->mask);  	} diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c index 7d50f794e248..0ffa20ae657b 100644 --- a/kernel/sched/wait.c +++ b/kernel/sched/wait.c @@ -394,7 +394,7 @@ EXPORT_SYMBOL(__wake_up_bit);   *   * In order for this to function properly, as it uses waitqueue_active()   * internally, some kind of memory barrier must be done prior to calling - * this. Typically, this will be smp_mb__after_clear_bit(), but in some + * this. Typically, this will be smp_mb__after_atomic(), but in some   * cases where bitflags are manipulated non-atomically under a lock, one   * may need to use a less regular barrier, such fs/inode.c's smp_mb(),   * because spin_unlock() does not guarantee a memory barrier. | 
