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