|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [V2] x86/cpuidle: get accurate C0 value with xenpm tool
>>> On 04.05.15 at 15:23, <huaitong.han@xxxxxxxxx> wrote:
> On Mon, 2015-05-04 at 09:33 +0100, Jan Beulich wrote:
>> >>> On 04.05.15 at 08:27, <huaitong.han@xxxxxxxxx> wrote:
>> > --- a/xen/arch/x86/acpi/cpu_idle.c
>> > +++ b/xen/arch/x86/acpi/cpu_idle.c
>> > @@ -254,9 +254,10 @@ static char* acpi_cstate_method_name[] =
>> >
>> > static void print_acpi_power(uint32_t cpu, struct acpi_processor_power
>> > *power)
>> > {
>> > - uint32_t i, idle_usage = 0;
>> > - uint64_t res, idle_res = 0;
>> > - u32 usage;
>> > + uint64_t idle_res = 0, idle_usage = 0, last_state_update_time = 0,
>> > now = 0;
>>
>> At least the initializer for "now" seems pointless.
> variable "now" just because now value should be got with
> power->states[i].time,
> otherwise calculation error occurs in the next step.
All understood, and I didn't put the variable's existence in
question, but solely its initializer.
>> > @@ -264,28 +265,36 @@ static void print_acpi_power(uint32_t cpu, struct
>> > acpi_processor_power *power)
>> > printk("active state:\t\tC%d\n", last_state_idx);
>> > printk("max_cstate:\t\tC%d\n", max_cstate);
>> > printk("states:\n");
>> > -
>> > +
>> > + spin_lock_irq(&power->stat_lock);
>> > + now = NOW();
>> > for ( i = 1; i < power->count; i++ )
>> > {
>> > - spin_lock_irq(&power->stat_lock);
>> > - res = tick_to_ns(power->states[i].time);
>> > - usage = power->states[i].usage;
>> > - spin_unlock_irq(&power->stat_lock);
>> > + res[i] = tick_to_ns(power->states[i].time);
>> > + usage[i] = power->states[i].usage;
>> > + }
>> > + last_state_update_time = tick_to_ns(power->last_state_update_tick);
>> > + spin_unlock_irq(&power->stat_lock);
>>
>> It seems to me that doing the tick_to_ns() conversions inside the
>> locked region isn't really necessary.
> doing the tick_to_ns() conversions inside the locked region is better to
> keep
> time value consistency, in case that the spin_unlock_irq of print_acpi_power
> finish and
> the spin_lock_irq of update_idle_stats start.
I don't understand this: Why can't you latch the raw tick values into
local variables and do the conversion later? This won't harm accuracy
afaict.
>> > + for ( i = 1; i < power->count; i++ )
>> > + {
>> > + idle_usage += usage[i];
>> > + idle_res += res[i];
>> >
>> > printk((last_state_idx == i) ? " *" : " ");
>> > printk("C%d:\t", i);
>> > printk("type[C%d] ", power->states[i].type);
>> > printk("latency[%03d] ", power->states[i].latency);
>> > - printk("usage[%08d] ", usage);
>> > + printk("usage[%"PRIu64"] ", usage[i]);
>>
>> Why is the "08" being lost here (and below)?
> usage is defined as "unsigned int" in original code, but usage is sum of
> "unsigned int", uint64 is better.
> usage is cx switch times,and it is little in most of the time, 08 is OK, but
> it seems "08" is no need to
> printk.
Please simply check the old and new output - the question here is
whether readability (perhaps through alignment of fields) is better
with the explicit zero padding. If there's no meaningful difference
I'd be okay with dropping the padding.
>> > @@ -1243,7 +1270,10 @@ int pmstat_get_cx_stat(uint32_t cpuid, struct
>> > pm_cx_stat *stat)
>> > }
>> >
>> > usage[0] = idle_usage;
>> > - res[0] = NOW() - idle_res;
>> > + usage[stat->last] += 1;
>>
>> ++
>>
>> > @@ -571,9 +571,6 @@ static void mwait_idle(void)
>> > if (!(lapic_timer_reliable_states & (1 << cstate)))
>> > lapic_timer_on();
>> >
>> > - /* Now back in C0. */
>> > - power->last_state = &power->states[0];
>>
>> Please don't delete the comment.
> Accepted,the comment will be added to update_idle_stats.
I think it would better stay here.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |