|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v3 2/2] x86/mwait-idle: squash stats update when not actually entering C-state
While we don't want to skip calling update_idle_stats(), arrange for it
to not increment the overall time spent in the state we didn't really
enter.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---
RFC: If we wanted to also move the tracing, then I think the part ahead
of the if() also would need moving. At that point we could as well
move update_last_cx_stat(), too, which afaict would allow skipping
update_idle_stats() on the "else" path (which therefore would go
away). Yet then, with the setting of power->safe_state moved up a
little (which imo it should have been anyway) the two
cpu_is_haltable() invocations would only have the lapic_timer_off()
invocation left in between. This would then seem to call for simply
ditching the 2nd one - acpi-idle also doesn't have a 2nd instance.
TBD: For the tracing I wonder if that really needs to come ahead of the
local_irq_enable(). Maybe trace_exit_reason() needs to, but quite
certainly TRACE_6D() doesn't.
---
v3: Also move cstate_restore_tsc() invocation and split ones to
update_idle_stats().
v2: New.
--- a/xen/arch/x86/cpu/mwait-idle.c
+++ b/xen/arch/x86/cpu/mwait-idle.c
@@ -854,17 +854,23 @@ static void mwait_idle(void)
mwait_idle_with_hints(cx->address, MWAIT_ECX_INTERRUPT_BREAK);
local_irq_disable();
- }
- after = alternative_call(cpuidle_get_tick);
+ after = alternative_call(cpuidle_get_tick);
+
+ cstate_restore_tsc();
+
+ /* Now back in C0. */
+ update_idle_stats(power, cx, before, after);
+ } else {
+ /* Never left C0. */
+ after = alternative_call(cpuidle_get_tick);
+ update_idle_stats(power, cx, after, after);
+ }
- cstate_restore_tsc();
trace_exit_reason(irq_traced);
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 << cx->type)))
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |