Re: [PATCH v3 2/3] intel_idle: Sync up the SPEC_CTRL MSR value to x86_spec_ctrl_current

From: Waiman Long
Date: Thu Jun 22 2023 - 08:32:47 EST


On 6/22/23 01:46, Josh Poimboeuf wrote:
On Wed, Jun 21, 2023 at 08:36:02PM -0400, Waiman Long wrote:
When intel_idle_ibrs() is called, it modifies the SPEC_CTRL MSR to
0 in order disable IBRS. However, the new MSR value isn't reflected
in x86_spec_ctrl_current which is at odd with the other code that
keep track of its state in that percpu variable. Fix that by updating
x86_spec_ctrl_current percpu value to always match the content of the
SPEC_CTRL MSR.
Is this fixing an actual bug or is there some other reason for doing
this?
It is not a bug per se. It is mainly to make the per cpu variable more up to date.

Signed-off-by: Waiman Long <longman@xxxxxxxxxx>
---
drivers/idle/intel_idle.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
index aa2d19db2b1d..07fa23707b3c 100644
--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -181,13 +181,17 @@ static __cpuidle int intel_idle_ibrs(struct cpuidle_device *dev,
u64 spec_ctrl = spec_ctrl_current();
int ret;
- if (smt_active)
+ if (smt_active) {
+ __this_cpu_write(x86_spec_ctrl_current, 0);
native_wrmsrl(MSR_IA32_SPEC_CTRL, 0);
+ }
ret = __intel_idle(dev, drv, index);
- if (smt_active)
+ if (smt_active) {
native_wrmsrl(MSR_IA32_SPEC_CTRL, spec_ctrl);
+ __this_cpu_write(x86_spec_ctrl_current, spec_ctrl);
+ }
More candidates for update_spec_ctrl()?

I don't think we can use update_spec_ctrl() here simply because of the noinstr requirement. See commit 9b461a6faae7 ("cpuidle, intel_idle: Fix CPUIDLE_FLAG_IBRS").

Cheers,
Longman