|
Borislav Petkov |
2364cf |
From: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
|
|
Borislav Petkov |
2364cf |
Date: Mon, 4 Apr 2022 17:34:19 -0700
|
|
Borislav Petkov |
2364cf |
Subject: x86/pm: Save the MSR validity status at context setup
|
|
Borislav Petkov |
2364cf |
Git-commit: 73924ec4d560257004d5b5116b22a3647661e364
|
|
Borislav Petkov |
2364cf |
Patch-mainline: v5.18 or v5.18-rc2 (next release)
|
|
Borislav Petkov |
2364cf |
References: bsc#1198400
|
|
Borislav Petkov |
2364cf |
|
|
Borislav Petkov |
2364cf |
The mechanism to save/restore MSRs during S3 suspend/resume checks for
|
|
Borislav Petkov |
2364cf |
the MSR validity during suspend, and only restores the MSR if its a
|
|
Borislav Petkov |
2364cf |
valid MSR. This is not optimal, as an invalid MSR will unnecessarily
|
|
Borislav Petkov |
2364cf |
throw an exception for every suspend cycle. The more invalid MSRs,
|
|
Borislav Petkov |
2364cf |
higher the impact will be.
|
|
Borislav Petkov |
2364cf |
|
|
Borislav Petkov |
2364cf |
Check and save the MSR validity at setup. This ensures that only valid
|
|
Borislav Petkov |
2364cf |
MSRs that are guaranteed to not throw an exception will be attempted
|
|
Borislav Petkov |
2364cf |
during suspend.
|
|
Borislav Petkov |
2364cf |
|
|
Borislav Petkov |
2364cf |
Fixes: 7a9c2dd08ead ("x86/pm: Introduce quirk framework to save/restore extra MSR registers around suspend/resume")
|
|
Borislav Petkov |
2364cf |
Suggested-by: Dave Hansen <dave.hansen@linux.intel.com>
|
|
Borislav Petkov |
2364cf |
Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
|
|
Borislav Petkov |
2364cf |
Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com>
|
|
Borislav Petkov |
2364cf |
Acked-by: Borislav Petkov <bp@suse.de>
|
|
Borislav Petkov |
2364cf |
Cc: stable@vger.kernel.org
|
|
Borislav Petkov |
2364cf |
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
|
Borislav Petkov |
2364cf |
---
|
|
Borislav Petkov |
2364cf |
arch/x86/power/cpu.c | 7 +++++--
|
|
Borislav Petkov |
2364cf |
1 file changed, 5 insertions(+), 2 deletions(-)
|
|
Borislav Petkov |
2364cf |
|
|
Borislav Petkov |
2364cf |
diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c
|
|
Borislav Petkov |
2364cf |
index 9f2b251e83c5..eaec0cb3fe04 100644
|
|
Borislav Petkov |
2364cf |
--- a/arch/x86/power/cpu.c
|
|
Borislav Petkov |
2364cf |
+++ b/arch/x86/power/cpu.c
|
|
Borislav Petkov |
2364cf |
@@ -40,7 +40,8 @@ static void msr_save_context(struct saved_context *ctxt)
|
|
Borislav Petkov |
2364cf |
struct saved_msr *end = msr + ctxt->saved_msrs.num;
|
|
Borislav Petkov |
2364cf |
|
|
Borislav Petkov |
2364cf |
while (msr < end) {
|
|
Borislav Petkov |
2364cf |
- msr->valid = !rdmsrl_safe(msr->info.msr_no, &msr->info.reg.q);
|
|
Borislav Petkov |
2364cf |
+ if (msr->valid)
|
|
Borislav Petkov |
2364cf |
+ rdmsrl(msr->info.msr_no, msr->info.reg.q);
|
|
Borislav Petkov |
2364cf |
msr++;
|
|
Borislav Petkov |
2364cf |
}
|
|
Borislav Petkov |
2364cf |
}
|
|
Borislav Petkov |
2364cf |
@@ -424,8 +425,10 @@ static int msr_build_context(const u32 *msr_id, const int num)
|
|
Borislav Petkov |
2364cf |
}
|
|
Borislav Petkov |
2364cf |
|
|
Borislav Petkov |
2364cf |
for (i = saved_msrs->num, j = 0; i < total_num; i++, j++) {
|
|
Borislav Petkov |
2364cf |
+ u64 dummy;
|
|
Borislav Petkov |
2364cf |
+
|
|
Borislav Petkov |
2364cf |
msr_array[i].info.msr_no = msr_id[j];
|
|
Borislav Petkov |
2364cf |
- msr_array[i].valid = false;
|
|
Borislav Petkov |
2364cf |
+ msr_array[i].valid = !rdmsrl_safe(msr_id[j], &dummy);
|
|
Borislav Petkov |
2364cf |
msr_array[i].info.reg.q = 0;
|
|
Borislav Petkov |
2364cf |
}
|
|
Borislav Petkov |
2364cf |
saved_msrs->num = total_num;
|
|
Borislav Petkov |
2364cf |
|