Mailing List Archive

[xen-3.4-testing] cpufreq: fix statistic lock problem
# HG changeset patch
# User Keir Fraser <keir.fraser@citrix.com>
# Date 1269952696 -3600
# Node ID 106fb323c803537762ad436991fb82aabfa2ca73
# Parent a8d1c8013bb69a7f1740d4631ca6b8623d75d9d0
cpufreq: fix statistic lock problem

cpufreq_statistic_lock should not only protect the statistic memory
pointed by cpufreq_statistic_data[cpu], but also have to protect the
pointer in cpufreq_statistic_data[cpu] itself. So move the read
operation of cpufreq_statistic_data[cpu] after
spin_lock(cpufreq_statistic_lock).

Signed-off-by: Wei Gang <gang.wei@intel.com>
xen-unstable changeset: 21071:415c0bf4ac7a
xen-unstable date: Fri Mar 26 08:49:13 2010 +0000
---
xen/drivers/cpufreq/utility.c | 12 ++++++++----
1 files changed, 8 insertions(+), 4 deletions(-)

diff -r a8d1c8013bb6 -r 106fb323c803 xen/drivers/cpufreq/utility.c
--- a/xen/drivers/cpufreq/utility.c Tue Mar 30 13:37:15 2010 +0100
+++ b/xen/drivers/cpufreq/utility.c Tue Mar 30 13:38:16 2010 +0100
@@ -63,13 +63,14 @@ void cpufreq_residency_update(unsigned i

void cpufreq_statistic_update(unsigned int cpu, uint8_t from, uint8_t to)
{
- struct pm_px *pxpt = cpufreq_statistic_data[cpu];
+ struct pm_px *pxpt;
struct processor_pminfo *pmpt = processor_pminfo[cpu];
spinlock_t *cpufreq_statistic_lock =
&per_cpu(cpufreq_statistic_lock, cpu);

spin_lock(cpufreq_statistic_lock);

+ pxpt = cpufreq_statistic_data[cpu];
if ( !pxpt || !pmpt ) {
spin_unlock(cpufreq_statistic_lock);
return;
@@ -89,7 +90,7 @@ int cpufreq_statistic_init(unsigned int
int cpufreq_statistic_init(unsigned int cpuid)
{
uint32_t i, count;
- struct pm_px *pxpt = cpufreq_statistic_data[cpuid];
+ struct pm_px *pxpt;
const struct processor_pminfo *pmpt = processor_pminfo[cpuid];
spinlock_t *cpufreq_statistic_lock =
&per_cpu(cpufreq_statistic_lock, cpuid);
@@ -99,6 +100,7 @@ int cpufreq_statistic_init(unsigned int

spin_lock(cpufreq_statistic_lock);

+ pxpt = cpufreq_statistic_data[cpuid];
if ( pxpt ) {
spin_unlock(cpufreq_statistic_lock);
return 0;
@@ -148,12 +150,13 @@ int cpufreq_statistic_init(unsigned int

void cpufreq_statistic_exit(unsigned int cpuid)
{
- struct pm_px *pxpt = cpufreq_statistic_data[cpuid];
+ struct pm_px *pxpt;
spinlock_t *cpufreq_statistic_lock =
&per_cpu(cpufreq_statistic_lock, cpuid);

spin_lock(cpufreq_statistic_lock);

+ pxpt = cpufreq_statistic_data[cpuid];
if (!pxpt) {
spin_unlock(cpufreq_statistic_lock);
return;
@@ -170,13 +173,14 @@ void cpufreq_statistic_reset(unsigned in
void cpufreq_statistic_reset(unsigned int cpuid)
{
uint32_t i, j, count;
- struct pm_px *pxpt = cpufreq_statistic_data[cpuid];
+ struct pm_px *pxpt;
const struct processor_pminfo *pmpt = processor_pminfo[cpuid];
spinlock_t *cpufreq_statistic_lock =
&per_cpu(cpufreq_statistic_lock, cpuid);

spin_lock(cpufreq_statistic_lock);

+ pxpt = cpufreq_statistic_data[cpuid];
if ( !pmpt || !pxpt || !pxpt->u.pt || !pxpt->u.trans_pt ) {
spin_unlock(cpufreq_statistic_lock);
return;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog