[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-3.4-testing] cpufreq: fix statistic lock problem
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # 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@xxxxxxxxx> 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@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |