Message ID | 20230622003603.1188364-3-longman@redhat.com |
---|---|
State | New |
Headers | show |
Series | x86/speculation: Disable IBRS when idle | expand |
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); + } return ret; }
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. Signed-off-by: Waiman Long <longman@redhat.com> --- drivers/idle/intel_idle.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)