lkml.org 
[lkml]   [2022]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE
    Hi Peter,

    On Wed, 08 Jun 2022 16:27:27 +0200, Peter Zijlstra <peterz@infradead.org>
    wrote:

    > Commit c227233ad64c ("intel_idle: enable interrupts before C1 on
    > Xeons") wrecked intel_idle in two ways:
    >
    > - must not have tracing in idle functions
    > - must return with IRQs disabled
    >
    > Additionally, it added a branch for no good reason.
    >
    > Fixes: c227233ad64c ("intel_idle: enable interrupts before C1 on Xeons")
    > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    > ---
    > drivers/idle/intel_idle.c | 48
    > +++++++++++++++++++++++++++++++++++----------- 1 file changed, 37
    > insertions(+), 11 deletions(-)
    >
    > --- a/drivers/idle/intel_idle.c
    > +++ b/drivers/idle/intel_idle.c
    > @@ -129,21 +137,37 @@ static unsigned int mwait_substates __in
    > *
    > * Must be called under local_irq_disable().
    > */
    nit: this comment is no long true, right?

    > +
    > -static __cpuidle int intel_idle(struct cpuidle_device *dev,
    > - struct cpuidle_driver *drv, int index)
    > +static __always_inline int __intel_idle(struct cpuidle_device *dev,
    > + struct cpuidle_driver *drv, int
    > index) {
    > struct cpuidle_state *state = &drv->states[index];
    > unsigned long eax = flg2MWAIT(state->flags);
    > unsigned long ecx = 1; /* break on interrupt flag */
    >
    > - if (state->flags & CPUIDLE_FLAG_IRQ_ENABLE)
    > - local_irq_enable();
    > -
    > mwait_idle_with_hints(eax, ecx);
    >
    > return index;
    > }
    >
    > +static __cpuidle int intel_idle(struct cpuidle_device *dev,
    > + struct cpuidle_driver *drv, int index)
    > +{
    > + return __intel_idle(dev, drv, index);
    > +}
    > +
    > +static __cpuidle int intel_idle_irq(struct cpuidle_device *dev,
    > + struct cpuidle_driver *drv, int
    > index) +{
    > + int ret;
    > +
    > + raw_local_irq_enable();
    > + ret = __intel_idle(dev, drv, index);
    > + raw_local_irq_disable();
    > +
    > + return ret;
    > +}
    > +
    > /**
    > * intel_idle_s2idle - Ask the processor to enter the given idle state.
    > * @dev: cpuidle device of the target CPU.
    > @@ -1801,6 +1824,9 @@ static void __init intel_idle_init_cstat
    > /* Structure copy. */
    > drv->states[drv->state_count] =
    > cpuidle_state_table[cstate];
    > + if (cpuidle_state_table[cstate].flags &
    > CPUIDLE_FLAG_IRQ_ENABLE)
    > + drv->states[drv->state_count].enter =
    > intel_idle_irq; +
    > if ((disabled_states_mask & BIT(drv->state_count)) ||
    > ((icpu->use_acpi || force_use_acpi) &&
    > intel_idle_off_by_default(mwait_hint) &&
    >
    >


    Thanks,

    Jacob

    \
     
     \ /
      Last update: 2022-06-10 01:47    [W:3.116 / U:0.632 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site