]> xenbits.xensource.com Git - xen.git/commitdiff
cpufreq: fix statistic lock problem
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 26 Mar 2010 08:49:13 +0000 (08:49 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 26 Mar 2010 08:49:13 +0000 (08:49 +0000)
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/drivers/cpufreq/utility.c

index 2d9921dcc5a3e595cadb7c5faeffab38e85b8934..c730df951fc22523303dc6b5eebe3ead4aa03b89 100644 (file)
@@ -63,13 +63,14 @@ void cpufreq_residency_update(unsigned int cpu, uint8_t state)
 
 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 @@ void cpufreq_statistic_update(unsigned int cpu, uint8_t from, uint8_t to)
 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 cpuid)
 
     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 cpuid)
 
 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_exit(unsigned int cpuid)
 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;