From: srinivas pandruvada <srinivas.pandruvada@linux.intel.com>
To: "Uwe Kleine-König" <ukleinek@debian.org>,
"Len Brown" <lenb@kernel.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
"Viresh Kumar" <viresh.kumar@linaro.org>,
"Thomas Gleixner" <tglx@linutronix.de>,
"Ingo Molnar" <mingo@redhat.com>,
"Borislav Petkov" <bp@alien8.de>,
"Dave Hansen" <dave.hansen@linux.intel.com>
Cc: linux-pm@vger.kernel.org, x86@kernel.org,
"H. Peter Anvin" <hpa@zytor.com>,
linux-rt-users@vger.kernel.org,
xiao sheng wen <atzlinux@sina.com>
Subject: Re: [PATCH] cpufreq: intel_pstate: Make hwp_notify_lock a raw spinlock
Date: Fri, 27 Sep 2024 03:47:08 -0700 [thread overview]
Message-ID: <229b9ff9ef6cf201b4e56d6ccb03c028c2d8f51f.camel@linux.intel.com> (raw)
In-Reply-To: <20240919081121.10784-2-ukleinek@debian.org>
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@sina.com>
> Link: https://bugs.debian.org/1076483
> Signed-off-by: Uwe Kleine-König <ukleinek@debian.org>
Missing Tested-by?
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> ---
> 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
next prev parent reply other threads:[~2024-09-27 10:47 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-19 8:11 [PATCH] cpufreq: intel_pstate: Make hwp_notify_lock a raw spinlock Uwe Kleine-König
2024-09-23 1:53 ` xiao sheng wen(肖盛文)
2024-09-26 7:48 ` Uwe Kleine-König
2024-09-27 9:43 ` xiao sheng wen(肖盛文)
2024-09-27 10:47 ` srinivas pandruvada [this message]
2024-09-28 11:51 ` Uwe Kleine-König
2024-10-01 1:44 ` xiao sheng wen(肖盛文)
2024-09-30 10:56 ` Sebastian Andrzej Siewior
2024-10-01 18:39 ` Rafael J. Wysocki
2024-10-02 8:24 ` Uwe Kleine-König
2024-10-02 12:12 ` Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=229b9ff9ef6cf201b4e56d6ccb03c028c2d8f51f.camel@linux.intel.com \
--to=srinivas.pandruvada@linux.intel.com \
--cc=atzlinux@sina.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=lenb@kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-rt-users@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=rafael@kernel.org \
--cc=tglx@linutronix.de \
--cc=ukleinek@debian.org \
--cc=viresh.kumar@linaro.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.