diff options
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index dbfe219667d3..82ecbe39dfb0 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -952,9 +952,20 @@ static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu) | |||
| 952 | if (cpu == policy->cpu) | 952 | if (cpu == policy->cpu) |
| 953 | return; | 953 | return; |
| 954 | 954 | ||
| 955 | /* | ||
| 956 | * Take direct locks as lock_policy_rwsem_write wouldn't work here. | ||
| 957 | * Also lock for last cpu is enough here as contention will happen only | ||
| 958 | * after policy->cpu is changed and after it is changed, other threads | ||
| 959 | * will try to acquire lock for new cpu. And policy is already updated | ||
| 960 | * by then. | ||
| 961 | */ | ||
| 962 | down_write(&per_cpu(cpu_policy_rwsem, policy->cpu)); | ||
| 963 | |||
| 955 | policy->last_cpu = policy->cpu; | 964 | policy->last_cpu = policy->cpu; |
| 956 | policy->cpu = cpu; | 965 | policy->cpu = cpu; |
| 957 | 966 | ||
| 967 | up_write(&per_cpu(cpu_policy_rwsem, policy->last_cpu)); | ||
| 968 | |||
| 958 | #ifdef CONFIG_CPU_FREQ_TABLE | 969 | #ifdef CONFIG_CPU_FREQ_TABLE |
| 959 | cpufreq_frequency_table_update_policy_cpu(policy); | 970 | cpufreq_frequency_table_update_policy_cpu(policy); |
| 960 | #endif | 971 | #endif |
| @@ -1200,9 +1211,7 @@ static int __cpufreq_remove_dev_prepare(struct device *dev, | |||
| 1200 | 1211 | ||
| 1201 | new_cpu = cpufreq_nominate_new_policy_cpu(policy, cpu, frozen); | 1212 | new_cpu = cpufreq_nominate_new_policy_cpu(policy, cpu, frozen); |
| 1202 | if (new_cpu >= 0) { | 1213 | if (new_cpu >= 0) { |
| 1203 | WARN_ON(lock_policy_rwsem_write(cpu)); | ||
| 1204 | update_policy_cpu(policy, new_cpu); | 1214 | update_policy_cpu(policy, new_cpu); |
| 1205 | unlock_policy_rwsem_write(cpu); | ||
| 1206 | 1215 | ||
| 1207 | if (!frozen) { | 1216 | if (!frozen) { |
| 1208 | pr_debug("%s: policy Kobject moved to cpu: %d " | 1217 | pr_debug("%s: policy Kobject moved to cpu: %d " |
