diff options
Diffstat (limited to 'kernel/sched.c')
| -rw-r--r-- | kernel/sched.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 04160d277e7a..ace566bdfc68 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -600,7 +600,6 @@ struct rq { | |||
| 600 | /* BKL stats */ | 600 | /* BKL stats */ |
| 601 | unsigned int bkl_count; | 601 | unsigned int bkl_count; |
| 602 | #endif | 602 | #endif |
| 603 | struct lock_class_key rq_lock_key; | ||
| 604 | }; | 603 | }; |
| 605 | 604 | ||
| 606 | static DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); | 605 | static DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); |
| @@ -2759,10 +2758,10 @@ static void double_rq_lock(struct rq *rq1, struct rq *rq2) | |||
| 2759 | } else { | 2758 | } else { |
| 2760 | if (rq1 < rq2) { | 2759 | if (rq1 < rq2) { |
| 2761 | spin_lock(&rq1->lock); | 2760 | spin_lock(&rq1->lock); |
| 2762 | spin_lock(&rq2->lock); | 2761 | spin_lock_nested(&rq2->lock, SINGLE_DEPTH_NESTING); |
| 2763 | } else { | 2762 | } else { |
| 2764 | spin_lock(&rq2->lock); | 2763 | spin_lock(&rq2->lock); |
| 2765 | spin_lock(&rq1->lock); | 2764 | spin_lock_nested(&rq1->lock, SINGLE_DEPTH_NESTING); |
| 2766 | } | 2765 | } |
| 2767 | } | 2766 | } |
| 2768 | update_rq_clock(rq1); | 2767 | update_rq_clock(rq1); |
| @@ -2805,14 +2804,21 @@ static int double_lock_balance(struct rq *this_rq, struct rq *busiest) | |||
| 2805 | if (busiest < this_rq) { | 2804 | if (busiest < this_rq) { |
| 2806 | spin_unlock(&this_rq->lock); | 2805 | spin_unlock(&this_rq->lock); |
| 2807 | spin_lock(&busiest->lock); | 2806 | spin_lock(&busiest->lock); |
| 2808 | spin_lock(&this_rq->lock); | 2807 | spin_lock_nested(&this_rq->lock, SINGLE_DEPTH_NESTING); |
| 2809 | ret = 1; | 2808 | ret = 1; |
| 2810 | } else | 2809 | } else |
| 2811 | spin_lock(&busiest->lock); | 2810 | spin_lock_nested(&busiest->lock, SINGLE_DEPTH_NESTING); |
| 2812 | } | 2811 | } |
| 2813 | return ret; | 2812 | return ret; |
| 2814 | } | 2813 | } |
| 2815 | 2814 | ||
| 2815 | static void double_unlock_balance(struct rq *this_rq, struct rq *busiest) | ||
| 2816 | __releases(busiest->lock) | ||
| 2817 | { | ||
| 2818 | spin_unlock(&busiest->lock); | ||
| 2819 | lock_set_subclass(&this_rq->lock.dep_map, 0, _RET_IP_); | ||
| 2820 | } | ||
| 2821 | |||
| 2816 | /* | 2822 | /* |
| 2817 | * If dest_cpu is allowed for this process, migrate the task to it. | 2823 | * If dest_cpu is allowed for this process, migrate the task to it. |
| 2818 | * This is accomplished by forcing the cpu_allowed mask to only | 2824 | * This is accomplished by forcing the cpu_allowed mask to only |
| @@ -3637,7 +3643,7 @@ redo: | |||
| 3637 | ld_moved = move_tasks(this_rq, this_cpu, busiest, | 3643 | ld_moved = move_tasks(this_rq, this_cpu, busiest, |
| 3638 | imbalance, sd, CPU_NEWLY_IDLE, | 3644 | imbalance, sd, CPU_NEWLY_IDLE, |
| 3639 | &all_pinned); | 3645 | &all_pinned); |
| 3640 | spin_unlock(&busiest->lock); | 3646 | double_unlock_balance(this_rq, busiest); |
| 3641 | 3647 | ||
| 3642 | if (unlikely(all_pinned)) { | 3648 | if (unlikely(all_pinned)) { |
| 3643 | cpu_clear(cpu_of(busiest), *cpus); | 3649 | cpu_clear(cpu_of(busiest), *cpus); |
| @@ -3752,7 +3758,7 @@ static void active_load_balance(struct rq *busiest_rq, int busiest_cpu) | |||
| 3752 | else | 3758 | else |
| 3753 | schedstat_inc(sd, alb_failed); | 3759 | schedstat_inc(sd, alb_failed); |
| 3754 | } | 3760 | } |
| 3755 | spin_unlock(&target_rq->lock); | 3761 | double_unlock_balance(busiest_rq, target_rq); |
| 3756 | } | 3762 | } |
| 3757 | 3763 | ||
| 3758 | #ifdef CONFIG_NO_HZ | 3764 | #ifdef CONFIG_NO_HZ |
| @@ -8000,7 +8006,6 @@ void __init sched_init(void) | |||
| 8000 | 8006 | ||
| 8001 | rq = cpu_rq(i); | 8007 | rq = cpu_rq(i); |
| 8002 | spin_lock_init(&rq->lock); | 8008 | spin_lock_init(&rq->lock); |
| 8003 | lockdep_set_class(&rq->lock, &rq->rq_lock_key); | ||
| 8004 | rq->nr_running = 0; | 8009 | rq->nr_running = 0; |
| 8005 | init_cfs_rq(&rq->cfs, rq); | 8010 | init_cfs_rq(&rq->cfs, rq); |
| 8006 | init_rt_rq(&rq->rt, rq); | 8011 | init_rt_rq(&rq->rt, rq); |
