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;
|
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)
|
static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv)
|
||||||
{
|
{
|
||||||
int cstate;
|
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];
|
drv->states[drv->state_count] = cpuidle_state_table[cstate];
|
||||||
state = &drv->states[drv->state_count];
|
state = &drv->states[drv->state_count];
|
||||||
|
|
||||||
if (state->flags & CPUIDLE_FLAG_INIT_XSTATE) {
|
state_update_enter_method(state, cstate);
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((disabled_states_mask & BIT(drv->state_count)) ||
|
if ((disabled_states_mask & BIT(drv->state_count)) ||
|
||||||
((icpu->use_acpi || force_use_acpi) &&
|
((icpu->use_acpi || force_use_acpi) &&
|
||||||
|
Loading…
Reference in New Issue
Block a user