|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [V4] x86/cpuidle: get accurate C0 value with xenpm tool
>>> On 11.05.15 at 11:34, <huaitong.han@xxxxxxxxx> wrote:
> ---
> ChangeLog:
> V4:
> delete pointless initializers and hard tabs.
Thanks, but ...
> V3:
> 1.Don't use tick_to_ns inside lock in print_acpi_power.
... note that this also was not fully done:
> --- 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_tick, now;
> + uint64_t usage[ACPI_PROCESSOR_MAX_POWER] = { 0 };
> + uint64_t res[ACPI_PROCESSOR_MAX_POWER] = { 0 };
> + unsigned int i;
> u8 last_state_idx;
>
> printk("==cpu%d==\n", cpu);
> @@ -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);
This one still sits in a locked region.
> + usage[i] = power->states[i].usage;
> + }
> + last_state_update_tick = power->last_state_update_tick;
> + spin_unlock_irq(&power->stat_lock);
> +
> + res[last_state_idx] += now - tick_to_ns(last_state_update_tick);
> + usage[last_state_idx] += 1;
I'm also pretty certain that I had asked to use ++ in cases like this.
> @@ -1203,16 +1226,18 @@ int pmstat_get_cx_stat(uint32_t cpuid, struct
> pm_cx_stat *stat)
>
> stat->nr = power->count;
>
> + spin_lock_irq(&power->stat_lock);
> + now = NOW();
> for ( i = 1; i < nr; i++ )
> {
> - spin_lock_irq(&power->stat_lock);
> usage[i] = power->states[i].usage;
> res[i] = tick_to_ns(power->states[i].time);
> - spin_unlock_irq(&power->stat_lock);
> -
> idle_usage += usage[i];
> idle_res += res[i];
> }
> + last_state_update_time = tick_to_ns(power->last_state_update_tick);
> + stat->last = power->last_state ? power->last_state->idx : 0;
> + spin_unlock_irq(&power->stat_lock);
And just like in the other case the loop above should be split, such
that the lock gets dropped as quickly as possible.
> @@ -554,6 +553,8 @@ static void mwait_idle(void)
>
> before = cpuidle_get_tick();
> TRACE_4D(TRC_PM_IDLE_ENTRY, cx->type, before, exp, pred);
> + /* Now in CX */
> + update_last_cx_stat(power, cx, before);
>
> if (cpu_is_haltable(cpu))
> mwait_idle_with_hints(eax, MWAIT_ECX_INTERRUPT_BREAK);
> @@ -565,15 +566,13 @@ static void mwait_idle(void)
> TRACE_6D(TRC_PM_IDLE_EXIT, cx->type, after,
> irq_traced[0], irq_traced[1], irq_traced[2], irq_traced[3]);
>
> + /* Now back in C0 */
> update_idle_stats(power, cx, before, after);
> local_irq_enable();
>
> if (!(lapic_timer_reliable_states & (1 << cstate)))
> lapic_timer_on();
>
> - /* Now back in C0. */
> - power->last_state = &power->states[0];
Please obey coding style, even more so when the comment was
well formed so far.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |