aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched.c')
-rw-r--r--kernel/sched.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 524285e46fa7..ba4c88088f62 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -4945,19 +4945,15 @@ EXPORT_SYMBOL(_cond_resched);
4945 */ 4945 */
4946int cond_resched_lock(spinlock_t *lock) 4946int cond_resched_lock(spinlock_t *lock)
4947{ 4947{
4948 int resched = need_resched() && system_state == SYSTEM_RUNNING;
4948 int ret = 0; 4949 int ret = 0;
4949 4950
4950 if (need_lockbreak(lock)) { 4951 if (spin_needbreak(lock) || resched) {
4951 spin_unlock(lock); 4952 spin_unlock(lock);
4952 cpu_relax(); 4953 if (resched && need_resched())
4953 ret = 1; 4954 __cond_resched();
4954 spin_lock(lock); 4955 else
4955 } 4956 cpu_relax();
4956 if (need_resched() && system_state == SYSTEM_RUNNING) {
4957 spin_release(&lock->dep_map, 1, _THIS_IP_);
4958 _raw_spin_unlock(lock);
4959 preempt_enable_no_resched();
4960 __cond_resched();
4961 ret = 1; 4957 ret = 1;
4962 spin_lock(lock); 4958 spin_lock(lock);
4963 } 4959 }