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>
This commit is contained in:
Jan Beulich committed 2012-08-10 14:41:17 +02:00
1 parent 700a91d3c1
commit 780e6b71de
1 file changed
+15 -30
+15 -30
View File
@@ -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;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.