### max_cstate (x86)
> `= <integer>`
+Specify the deepest C-state CPUs are permitted to be placed in.
+
### max_gsi_irqs (x86)
> `= <integer>`
" set-sched-smt enable|disable enable/disable scheduler smt power saving\n"
" set-vcpu-migration-delay <num> set scheduler vcpu migration delay in us\n"
" get-vcpu-migration-delay get scheduler vcpu migration delay\n"
- " set-max-cstate <num> set the C-State limitation (<num> >= 0)\n"
+ " set-max-cstate <num>|'unlimited' set the C-State limitation (<num> >= 0)\n"
" start [seconds] start collect Cx/Px statistics,\n"
" output after CTRL-C or SIGINT or several seconds.\n"
" enable-turbo-mode [cpuid] enable Turbo Mode for processors that support it.\n"
if ( (ret = xc_get_cpuidle_max_cstate(xc_handle, &value)) )
return ret;
- printf("Max possible C-state: C%d\n\n", value);
+ if ( value < XEN_SYSCTL_CX_UNLIMITED )
+ printf("Max possible C-state: C%"PRIu32"\n\n", value);
+ else
+ printf("All C-states allowed\n\n");
+
return 0;
}
void set_max_cstate_func(int argc, char *argv[])
{
int value;
+ char buf[12];
- if ( argc != 1 || sscanf(argv[0], "%d", &value) != 1 || value < 0 )
+ if ( argc != 1 ||
+ (sscanf(argv[0], "%d", &value) == 1
+ ? value < 0
+ : (value = XEN_SYSCTL_CX_UNLIMITED, strcmp(argv[0], "unlimited"))) )
{
- fprintf(stderr, "Missing or invalid argument(s)\n");
+ fprintf(stderr, "Missing, excess, or invalid argument(s)\n");
exit(EINVAL);
}
+ snprintf(buf, ARRAY_SIZE(buf), "C%d", value);
+
if ( !xc_set_cpuidle_max_cstate(xc_handle, (uint32_t)value) )
- printf("set max_cstate to C%d succeeded\n", value);
+ printf("max C-state set to %s\n", value >= 0 ? buf : argv[0]);
else
- fprintf(stderr, "set max_cstate to C%d failed (%d - %s)\n",
- value, errno, strerror(errno));
+ fprintf(stderr, "Failed to set max C-state to %s (%d - %s)\n",
+ value >= 0 ? buf : argv[0], errno, strerror(errno));
}
void enable_turbo_mode(int argc, char *argv[])
}
void (*__read_mostly pm_idle_save)(void);
-unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER - 1;
+unsigned int max_cstate __read_mostly = UINT_MAX;
integer_param("max_cstate", max_cstate);
static bool __read_mostly local_apic_timer_c2_ok;
boolean_param("lapic_timer_c2_ok", local_apic_timer_c2_ok);
unsigned int cpu;
printk("'%c' pressed -> printing ACPI Cx structures\n", key);
- printk("max cstate: C%u\n", max_cstate);
+ if ( max_cstate < UINT_MAX )
+ printk("max state: C%u\n", max_cstate);
+ else
+ printk("max state: unlimited\n");
for_each_present_cpu ( cpu )
{
struct acpi_processor_power *power = processor_powers[cpu];
if ( max_cstate > 0 && power && !sched_has_urgent_vcpu() &&
(next_state = cpuidle_current_governor->select(power)) > 0 )
{
- cx = &power->states[next_state];
- if ( cx->type == ACPI_STATE_C3 && power->flags.bm_check &&
- acpi_idle_bm_check() )
- cx = power->safe_state;
- if ( cx->idx > max_cstate )
- cx = &power->states[max_cstate];
- menu_get_trace_data(&exp, &pred);
+ do {
+ cx = &power->states[next_state];
+ } while ( cx->type > max_cstate && --next_state );
+ if ( next_state )
+ {
+ if ( cx->type == ACPI_STATE_C3 && power->flags.bm_check &&
+ acpi_idle_bm_check() )
+ cx = power->safe_state;
+ if ( tb_init_done )
+ menu_get_trace_data(&exp, &pred);
+ }
+ else
+ cx = NULL;
}
if ( !cx )
{
void cpuidle_disable_deep_cstate(void)
{
- if ( max_cstate > 1 )
+ if ( max_cstate > ACPI_STATE_C1 )
{
if ( local_apic_timer_c2_ok )
- max_cstate = 2;
+ max_cstate = ACPI_STATE_C2;
else
- max_cstate = 1;
+ max_cstate = ACPI_STATE_C1;
}
hpet_disable_legacy_broadcast();
bool cpuidle_using_deep_cstate(void)
{
- return xen_cpuidle && max_cstate > (local_apic_timer_c2_ok ? 2 : 1);
+ return xen_cpuidle && max_cstate > (local_apic_timer_c2_ok ? ACPI_STATE_C2
+ : ACPI_STATE_C1);
}
static int cpu_callback(
} while (cx->type > max_cstate && --next_state);
if (!next_state)
cx = NULL;
- menu_get_trace_data(&exp, &pred);
+ else if (tb_init_done)
+ menu_get_trace_data(&exp, &pred);
}
if (!cx) {
if (pm_idle_save)
else if ( boot_cpu_has(X86_FEATURE_CONSTANT_TSC ) )
{
printk("TSC has constant rate, ");
- if (max_cstate <= 2 && tsc_max_warp == 0)
+ if ( max_cstate <= ACPI_STATE_C2 && tsc_max_warp == 0 )
printk("no deep Cstates, passed warp test, deemed reliable, ");
else
printk("deep Cstates possible, so not reliable, ");
case XEN_SYSCTL_pm_op_get_max_cstate:
{
+ BUILD_BUG_ON(XEN_SYSCTL_CX_UNLIMITED != UINT_MAX);
op->u.get_max_cstate = acpi_get_cstate_limit();
break;
}
struct xen_set_cpufreq_para set_para;
uint64_aligned_t get_avgfreq;
uint32_t set_sched_opt_smt;
+#define XEN_SYSCTL_CX_UNLIMITED 0xffffffff
uint32_t get_max_cstate;
uint32_t set_max_cstate;
} u;