Jan Beulich
2012-Aug-09 15:07 UTC
[PATCH] 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>
--- 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, s
}
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;
-
- /* C0 */
- res[0] = NOW() - res[1];
-
- 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;
- }
+ stat->nr = 2;
+
+ usage[1] = idle_usage = 1;
+ res[1] = idle_res = stat->idle_time;
- for ( i = power->count - 1; i >= 0; i-- )
+ memset(&hw_res, 0, sizeof(hw_res));
+ }
+ 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, s
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;
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
Keir Fraser
2012-Aug-10 12:16 UTC
Re: [PATCH] x86/cpuidle: clean up statistics reporting to user mode
On 09/08/2012 16:07, "Jan Beulich" <JBeulich@suse.com> wrote:> 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>I don;t know a great deal about this code, but this looks good to me, so for what it''s worth you can have my ack. Acked-by: Keir Fraser <keir@xen.org>> --- 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, s > } > > 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; > - > - /* C0 */ > - res[0] = NOW() - res[1]; > - > - 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; > - } > + stat->nr = 2; > + > + usage[1] = idle_usage = 1; > + res[1] = idle_res = stat->idle_time; > > - for ( i = power->count - 1; i >= 0; i-- ) > + memset(&hw_res, 0, sizeof(hw_res)); > + } > + 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, s > 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; > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel