aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2012-08-10 14:41:17 +0200
committerJan Beulich <jbeulich@suse.com>2012-08-10 14:41:17 +0200
commit780e6b71dea3fcb6226aa7763d0aec468d82c4fc (patch)
tree46012904d0be2c276fd38c5cc1c38cf6882afca4
parent700a91d3c162f0af6190e7cb732d85ee2a981550 (diff)
downloadxen-780e6b71dea3fcb6226aa7763d0aec468d82c4fc.tar.gz
xen-780e6b71dea3fcb6226aa7763d0aec468d82c4fc.tar.bz2
xen-780e6b71dea3fcb6226aa7763d0aec468d82c4fc.zip
x86/cpuidle: clean up statistics reporting to user mode
First of all, when no ACPI Cx data was reported, make sure the usage count passed back to user mode is not random. Besides that, fold a lot of redundant code. Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
-rw-r--r--xen/arch/x86/acpi/cpu_idle.c45
1 files changed, 15 insertions, 30 deletions
diff --git a/xen/arch/x86/acpi/cpu_idle.c b/xen/arch/x86/acpi/cpu_idle.c
index cf128a33e1..af19d0687d 100644
--- a/xen/arch/x86/acpi/cpu_idle.c
+++ b/xen/arch/x86/acpi/cpu_idle.c
@@ -1100,36 +1100,23 @@ int pmstat_get_cx_stat(uint32_t cpuid, struct pm_cx_stat *stat)
}
stat->last = power->last_state ? power->last_state->idx : 0;
- stat->nr = power->count;
stat->idle_time = get_cpu_idle_time(cpuid);
/* mimic the stat when detail info hasn't been registered by dom0 */
if ( pm_idle_save == NULL )
{
- /* C1 */
- usage[1] = 1;
- res[1] = stat->idle_time;
+ stat->nr = 2;
- /* C0 */
- res[0] = NOW() - res[1];
+ usage[1] = idle_usage = 1;
+ res[1] = idle_res = stat->idle_time;
- if ( copy_to_guest_offset(stat->triggers, 0, &usage[0], 2) ||
- copy_to_guest_offset(stat->residencies, 0, &res[0], 2) )
- return -EFAULT;
-
- stat->pc2 = 0;
- stat->pc3 = 0;
- stat->pc6 = 0;
- stat->pc7 = 0;
- stat->cc3 = 0;
- stat->cc6 = 0;
- stat->cc7 = 0;
- return 0;
+ memset(&hw_res, 0, sizeof(hw_res));
}
-
- for ( i = power->count - 1; i >= 0; i-- )
+ else
{
- if ( i != 0 )
+ stat->nr = power->count;
+
+ for ( i = 1; i < power->count; i++ )
{
spin_lock_irq(&power->stat_lock);
usage[i] = power->states[i].usage;
@@ -1139,18 +1126,16 @@ int pmstat_get_cx_stat(uint32_t cpuid, struct pm_cx_stat *stat)
idle_usage += usage[i];
idle_res += res[i];
}
- else
- {
- usage[i] = idle_usage;
- res[i] = NOW() - idle_res;
- }
+
+ get_hw_residencies(cpuid, &hw_res);
}
- if ( copy_to_guest_offset(stat->triggers, 0, &usage[0], power->count) ||
- copy_to_guest_offset(stat->residencies, 0, &res[0], power->count) )
- return -EFAULT;
+ usage[0] = idle_usage;
+ res[0] = NOW() - idle_res;
- get_hw_residencies(cpuid, &hw_res);
+ if ( copy_to_guest(stat->triggers, usage, stat->nr) ||
+ copy_to_guest(stat->residencies, res, stat->nr) )
+ return -EFAULT;
stat->pc2 = hw_res.pc2;
stat->pc3 = hw_res.pc3;