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