diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 41541d79e3c8..ed09d4f2a69c 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -1294,6 +1294,10 @@ static void resched_task(struct task_struct *p) | |||
1294 | static void sched_rt_avg_update(struct rq *rq, u64 rt_delta) | 1294 | static void sched_rt_avg_update(struct rq *rq, u64 rt_delta) |
1295 | { | 1295 | { |
1296 | } | 1296 | } |
1297 | |||
1298 | static void sched_avg_update(struct rq *rq) | ||
1299 | { | ||
1300 | } | ||
1297 | #endif /* CONFIG_SMP */ | 1301 | #endif /* CONFIG_SMP */ |
1298 | 1302 | ||
1299 | #if BITS_PER_LONG == 32 | 1303 | #if BITS_PER_LONG == 32 |
@@ -3182,6 +3186,8 @@ static void update_cpu_load(struct rq *this_rq) | |||
3182 | 3186 | ||
3183 | this_rq->cpu_load[i] = (old_load * (scale - 1) + new_load) >> i; | 3187 | this_rq->cpu_load[i] = (old_load * (scale - 1) + new_load) >> i; |
3184 | } | 3188 | } |
3189 | |||
3190 | sched_avg_update(this_rq); | ||
3185 | } | 3191 | } |
3186 | 3192 | ||
3187 | static void update_cpu_load_active(struct rq *this_rq) | 3193 | static void update_cpu_load_active(struct rq *this_rq) |
@@ -3865,8 +3871,16 @@ int mutex_spin_on_owner(struct mutex *lock, struct thread_info *owner) | |||
3865 | /* | 3871 | /* |
3866 | * Owner changed, break to re-assess state. | 3872 | * Owner changed, break to re-assess state. |
3867 | */ | 3873 | */ |
3868 | if (lock->owner != owner) | 3874 | if (lock->owner != owner) { |
3875 | /* | ||
3876 | * If the lock has switched to a different owner, | ||
3877 | * we likely have heavy contention. Return 0 to quit | ||
3878 | * optimistic spinning and not contend further: | ||
3879 | */ | ||
3880 | if (lock->owner) | ||
3881 | return 0; | ||
3869 | break; | 3882 | break; |
3883 | } | ||
3870 | 3884 | ||
3871 | /* | 3885 | /* |
3872 | * Is that owner really running on that cpu? | 3886 | * Is that owner really running on that cpu? |