intel_idle: refactor state->enter manipulation into its own function
Since the 6.4 kernel, the logic for updating a state's enter method based on "environmental conditions" (command line options, cpu sidechannel workarounds etc etc) has gotten pretty complex. This patch refactors this into a seperate small, self contained function (no behavior changes) for improved readability and to make future changes to this logic easier to do and understand. Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
858fd168a9
commit
4622ba923e
@ -1839,6 +1839,32 @@ static bool __init intel_idle_verify_cstate(unsigned int mwait_hint)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void state_update_enter_method(struct cpuidle_state *state, int cstate)
|
||||
{
|
||||
if (state->flags & CPUIDLE_FLAG_INIT_XSTATE) {
|
||||
/*
|
||||
* Combining with XSTATE with IBRS or IRQ_ENABLE flags
|
||||
* is not currently supported but this driver.
|
||||
*/
|
||||
WARN_ON_ONCE(state->flags & CPUIDLE_FLAG_IBRS);
|
||||
WARN_ON_ONCE(state->flags & CPUIDLE_FLAG_IRQ_ENABLE);
|
||||
state->enter = intel_idle_xstate;
|
||||
} else if (cpu_feature_enabled(X86_FEATURE_KERNEL_IBRS) &&
|
||||
state->flags & CPUIDLE_FLAG_IBRS) {
|
||||
/*
|
||||
* IBRS mitigation requires that C-states are entered
|
||||
* with interrupts disabled.
|
||||
*/
|
||||
WARN_ON_ONCE(state->flags & CPUIDLE_FLAG_IRQ_ENABLE);
|
||||
state->enter = intel_idle_ibrs;
|
||||
} else if (state->flags & CPUIDLE_FLAG_IRQ_ENABLE) {
|
||||
state->enter = intel_idle_irq;
|
||||
} else if (force_irq_on) {
|
||||
pr_info("forced intel_idle_irq for state %d\n", cstate);
|
||||
state->enter = intel_idle_irq;
|
||||
}
|
||||
}
|
||||
|
||||
static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv)
|
||||
{
|
||||
int cstate;
|
||||
@ -1894,28 +1920,8 @@ static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv)
|
||||
drv->states[drv->state_count] = cpuidle_state_table[cstate];
|
||||
state = &drv->states[drv->state_count];
|
||||
|
||||
if (state->flags & CPUIDLE_FLAG_INIT_XSTATE) {
|
||||
/*
|
||||
* Combining with XSTATE with IBRS or IRQ_ENABLE flags
|
||||
* is not currently supported but this driver.
|
||||
*/
|
||||
WARN_ON_ONCE(state->flags & CPUIDLE_FLAG_IBRS);
|
||||
WARN_ON_ONCE(state->flags & CPUIDLE_FLAG_IRQ_ENABLE);
|
||||
state->enter = intel_idle_xstate;
|
||||
} else if (cpu_feature_enabled(X86_FEATURE_KERNEL_IBRS) &&
|
||||
state->flags & CPUIDLE_FLAG_IBRS) {
|
||||
/*
|
||||
* IBRS mitigation requires that C-states are entered
|
||||
* with interrupts disabled.
|
||||
*/
|
||||
WARN_ON_ONCE(state->flags & CPUIDLE_FLAG_IRQ_ENABLE);
|
||||
state->enter = intel_idle_ibrs;
|
||||
} else if (state->flags & CPUIDLE_FLAG_IRQ_ENABLE) {
|
||||
state->enter = intel_idle_irq;
|
||||
} else if (force_irq_on) {
|
||||
pr_info("forced intel_idle_irq for state %d\n", cstate);
|
||||
state->enter = intel_idle_irq;
|
||||
}
|
||||
state_update_enter_method(state, cstate);
|
||||
|
||||
|
||||
if ((disabled_states_mask & BIT(drv->state_count)) ||
|
||||
((icpu->use_acpi || force_use_acpi) &&
|
||||
|
Loading…
Reference in New Issue
Block a user