[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/4] x86/mwait_idle: Allow limiting the sub C-state
Allow limiting the sub C-state using a new command-line parameter, max_substate. The limit only applies to the highest legal C-state. For example: max_cstate = 1, max_substate = 0 ==> C0, C1 okay, but not C1E max_cstate = 1, max_substate = 1 ==> C0, C1 and C1E okay, but not C2 max_cstate = 2, max_substate = 0 ==> C0, C1, C1E, C2 okay, but not C3 max_cstate = 2, max_substate = 1 ==> C0, C1, C1E, C2 okay, but not C3 Signed-off-by: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx> --- xen/arch/x86/acpi/cpu_idle.c | 3 +++ xen/arch/x86/cpu/mwait-idle.c | 4 +++- xen/include/xen/acpi.h | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/acpi/cpu_idle.c b/xen/arch/x86/acpi/cpu_idle.c index b05fb39..96909b3 100644 --- a/xen/arch/x86/acpi/cpu_idle.c +++ b/xen/arch/x86/acpi/cpu_idle.c @@ -106,6 +106,8 @@ static uint64_t (*__read_mostly tick_to_ns)(uint64_t) = acpi_pm_tick_to_ns; void (*__read_mostly pm_idle_save)(void); unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER - 1; integer_param("max_cstate", max_cstate); +unsigned int max_substate __read_mostly = ACPI_PROCESSOR_MAX_POWER - 1; +integer_param("max_substate", max_substate); static bool_t __read_mostly local_apic_timer_c2_ok; boolean_param("lapic_timer_c2_ok", local_apic_timer_c2_ok); @@ -240,6 +242,7 @@ static void print_acpi_power(uint32_t cpu, struct acpi_processor_power *power) last_state_idx = power->last_state ? power->last_state->idx : -1; printk("active state:\t\tC%d\n", last_state_idx); printk("max_cstate:\t\tC%d\n", max_cstate); + printk("max_substate:\t\t%d\n", max_substate); printk("states:\n"); for ( i = 1; i < power->count; i++ ) diff --git a/xen/arch/x86/cpu/mwait-idle.c b/xen/arch/x86/cpu/mwait-idle.c index 38172e5..90c8aea 100644 --- a/xen/arch/x86/cpu/mwait-idle.c +++ b/xen/arch/x86/cpu/mwait-idle.c @@ -330,7 +330,9 @@ static void mwait_idle(void) (next_state = cpuidle_current_governor->select(power)) > 0) { do { cx = &power->states[next_state]; - } while (cx->type > max_cstate && --next_state); + } while ((cx->type > max_cstate || (cx->type == max_cstate && + MWAIT_HINT2SUBSTATE(cx->address) > max_substate)) && + --next_state); if (!next_state) cx = NULL; menu_get_trace_data(&exp, &pred); diff --git a/xen/include/xen/acpi.h b/xen/include/xen/acpi.h index aedec65..b49c4fc 100644 --- a/xen/include/xen/acpi.h +++ b/xen/include/xen/acpi.h @@ -140,6 +140,8 @@ static inline void acpi_set_cstate_limit(unsigned int new_limit) max_cstate = new_limit; return; } + +extern unsigned int max_substate; #else static inline unsigned int acpi_get_cstate_limit(void) { return 0; } static inline void acpi_set_cstate_limit(unsigned int new_limit) { return; } -- 1.9.3 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |