Re: [PATCH] cpufreq: intel_pstate: Make hwp_notify_lock a raw spinlock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Sep 19, 2024 at 10:12 AM Uwe Kleine-König <ukleinek@xxxxxxxxxx> wrote:
>
> notify_hwp_interrupt() is called via sysvec_thermal() ->
> smp_thermal_vector() -> intel_thermal_interrupt() in hard irq context.
> For this reason it must not use a simple spin_lock that sleeps with
> PREEMPT_RT enabled. So convert it to a raw spinlock.
>
> Reported-by: xiao sheng wen <atzlinux@xxxxxxxx>
> Link: https://bugs.debian.org/1076483
> Signed-off-by: Uwe Kleine-König <ukleinek@xxxxxxxxxx>
> ---
> Hello,
>
> this is deep in x86 land where I have *very* little experience and
> knowledge. Is sysvec_thermal() (defined in arch/x86/kernel/irq.c) really
> running in hard irq context? The stacktrace in the Debian bug report
> suggests that.
>
> So please double check my reasoning before applying this patch.
>
> Thanks
> Uwe
>
>  drivers/cpufreq/intel_pstate.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
> index aaea9a39eced..b0018f371ea3 100644
> --- a/drivers/cpufreq/intel_pstate.c
> +++ b/drivers/cpufreq/intel_pstate.c
> @@ -1845,7 +1845,7 @@ static void intel_pstate_notify_work(struct work_struct *work)
>         wrmsrl_on_cpu(cpudata->cpu, MSR_HWP_STATUS, 0);
>  }
>
> -static DEFINE_SPINLOCK(hwp_notify_lock);
> +static DEFINE_RAW_SPINLOCK(hwp_notify_lock);
>  static cpumask_t hwp_intr_enable_mask;
>
>  #define HWP_GUARANTEED_PERF_CHANGE_STATUS      BIT(0)
> @@ -1868,7 +1868,7 @@ void notify_hwp_interrupt(void)
>         if (!(value & status_mask))
>                 return;
>
> -       spin_lock_irqsave(&hwp_notify_lock, flags);
> +       raw_spin_lock_irqsave(&hwp_notify_lock, flags);
>
>         if (!cpumask_test_cpu(this_cpu, &hwp_intr_enable_mask))
>                 goto ack_intr;
> @@ -1876,13 +1876,13 @@ void notify_hwp_interrupt(void)
>         schedule_delayed_work(&all_cpu_data[this_cpu]->hwp_notify_work,
>                               msecs_to_jiffies(10));
>
> -       spin_unlock_irqrestore(&hwp_notify_lock, flags);
> +       raw_spin_unlock_irqrestore(&hwp_notify_lock, flags);
>
>         return;
>
>  ack_intr:
>         wrmsrl_safe(MSR_HWP_STATUS, 0);
> -       spin_unlock_irqrestore(&hwp_notify_lock, flags);
> +       raw_spin_unlock_irqrestore(&hwp_notify_lock, flags);
>  }
>
>  static void intel_pstate_disable_hwp_interrupt(struct cpudata *cpudata)
> @@ -1895,9 +1895,9 @@ static void intel_pstate_disable_hwp_interrupt(struct cpudata *cpudata)
>         /* wrmsrl_on_cpu has to be outside spinlock as this can result in IPC */
>         wrmsrl_on_cpu(cpudata->cpu, MSR_HWP_INTERRUPT, 0x00);
>
> -       spin_lock_irq(&hwp_notify_lock);
> +       raw_spin_lock_irq(&hwp_notify_lock);
>         cancel_work = cpumask_test_and_clear_cpu(cpudata->cpu, &hwp_intr_enable_mask);
> -       spin_unlock_irq(&hwp_notify_lock);
> +       raw_spin_unlock_irq(&hwp_notify_lock);
>
>         if (cancel_work)
>                 cancel_delayed_work_sync(&cpudata->hwp_notify_work);
> @@ -1912,10 +1912,10 @@ static void intel_pstate_enable_hwp_interrupt(struct cpudata *cpudata)
>         if (boot_cpu_has(X86_FEATURE_HWP_NOTIFY)) {
>                 u64 interrupt_mask = HWP_GUARANTEED_PERF_CHANGE_REQ;
>
> -               spin_lock_irq(&hwp_notify_lock);
> +               raw_spin_lock_irq(&hwp_notify_lock);
>                 INIT_DELAYED_WORK(&cpudata->hwp_notify_work, intel_pstate_notify_work);
>                 cpumask_set_cpu(cpudata->cpu, &hwp_intr_enable_mask);
> -               spin_unlock_irq(&hwp_notify_lock);
> +               raw_spin_unlock_irq(&hwp_notify_lock);
>
>                 if (cpu_feature_enabled(X86_FEATURE_HWP_HIGHEST_PERF_CHANGE))
>                         interrupt_mask |= HWP_HIGHEST_PERF_CHANGE_REQ;
>
> base-commit: 3621a2c9142bd490af0666c0c02d52d60ce0d2a5
> --

Applied as 6.12-rc material, thanks!





[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux