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, 2024-09-19 at 10:11 +0200, Uwe Kleine-König 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>

Missing Tested-by?

    Acked-by: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx>

> ---
> 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.
> 
This is thermal LVT and runs in hard IRQ context. 

> 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






[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