diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 911829966534..ae4db0185bb2 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -308,6 +308,13 @@ static inline void finish_lock_switch(runqueue_t *rq, task_t *prev) | |||
308 | /* this is a valid case when another task releases the spinlock */ | 308 | /* this is a valid case when another task releases the spinlock */ |
309 | rq->lock.owner = current; | 309 | rq->lock.owner = current; |
310 | #endif | 310 | #endif |
311 | /* | ||
312 | * If we are tracking spinlock dependencies then we have to | ||
313 | * fix up the runqueue lock - which gets 'carried over' from | ||
314 | * prev into current: | ||
315 | */ | ||
316 | spin_acquire(&rq->lock.dep_map, 0, 0, _THIS_IP_); | ||
317 | |||
311 | spin_unlock_irq(&rq->lock); | 318 | spin_unlock_irq(&rq->lock); |
312 | } | 319 | } |
313 | 320 | ||
@@ -1778,6 +1785,7 @@ task_t * context_switch(runqueue_t *rq, task_t *prev, task_t *next) | |||
1778 | WARN_ON(rq->prev_mm); | 1785 | WARN_ON(rq->prev_mm); |
1779 | rq->prev_mm = oldmm; | 1786 | rq->prev_mm = oldmm; |
1780 | } | 1787 | } |
1788 | spin_release(&rq->lock.dep_map, 1, _THIS_IP_); | ||
1781 | 1789 | ||
1782 | /* Here we just switch the register state and the stack. */ | 1790 | /* Here we just switch the register state and the stack. */ |
1783 | switch_to(prev, next, prev); | 1791 | switch_to(prev, next, prev); |
@@ -4384,6 +4392,7 @@ asmlinkage long sys_sched_yield(void) | |||
4384 | * no need to preempt or enable interrupts: | 4392 | * no need to preempt or enable interrupts: |
4385 | */ | 4393 | */ |
4386 | __release(rq->lock); | 4394 | __release(rq->lock); |
4395 | spin_release(&rq->lock.dep_map, 1, _THIS_IP_); | ||
4387 | _raw_spin_unlock(&rq->lock); | 4396 | _raw_spin_unlock(&rq->lock); |
4388 | preempt_enable_no_resched(); | 4397 | preempt_enable_no_resched(); |
4389 | 4398 | ||
@@ -4447,6 +4456,7 @@ int cond_resched_lock(spinlock_t *lock) | |||
4447 | spin_lock(lock); | 4456 | spin_lock(lock); |
4448 | } | 4457 | } |
4449 | if (need_resched() && __resched_legal()) { | 4458 | if (need_resched() && __resched_legal()) { |
4459 | spin_release(&lock->dep_map, 1, _THIS_IP_); | ||
4450 | _raw_spin_unlock(lock); | 4460 | _raw_spin_unlock(lock); |
4451 | preempt_enable_no_resched(); | 4461 | preempt_enable_no_resched(); |
4452 | __cond_resched(); | 4462 | __cond_resched(); |