Skip to content

Commit

Permalink
[CPUFREQ] Fix PCC driver error path
Browse files Browse the repository at this point in the history
The PCC cpufreq driver unmaps the mailbox address range if any CPUs fail to
initialise, but doesn't do anything to remove the registered CPUs from the
cpufreq core resulting in failures further down the line. We're better off
simply returning a failure - the cpufreq core will unregister us cleanly if
we end up with no successfully registered CPUs. Tidy up the failure path
and also add a sanity check to ensure that the firmware gives us a realistic
frequency - the core deals badly with that being set to 0.

Signed-off-by: Matthew Garrett <mjg@redhat.com>
Cc: Naga Chumbalkar <nagananda.chumbalkar@hp.com>
Signed-off-by: Dave Jones <davej@redhat.com>
  • Loading branch information
Matthew Garrett authored and Dave Jones committed Jul 26, 2010
1 parent 3847d22 commit 179ee43
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions arch/x86/kernel/cpu/cpufreq/pcc-cpufreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -541,13 +541,13 @@ static int pcc_cpufreq_cpu_init(struct cpufreq_policy *policy)

if (!pcch_virt_addr) {
result = -1;
goto pcch_null;
goto out;
}

result = pcc_get_offset(cpu);
if (result) {
dprintk("init: PCCP evaluation failed\n");
goto free;
goto out;
}

policy->max = policy->cpuinfo.max_freq =
Expand All @@ -556,14 +556,15 @@ static int pcc_cpufreq_cpu_init(struct cpufreq_policy *policy)
ioread32(&pcch_hdr->minimum_frequency) * 1000;
policy->cur = pcc_get_freq(cpu);

if (!policy->cur) {
dprintk("init: Unable to get current CPU frequency\n");
result = -EINVAL;
goto out;
}

dprintk("init: policy->max is %d, policy->min is %d\n",
policy->max, policy->min);

return 0;
free:
pcc_clear_mapping();
free_percpu(pcc_cpu_info);
pcch_null:
out:
return result;
}

Expand Down

0 comments on commit 179ee43

Please sign in to comment.