[PATCH 5/8] x86/msr: Consolidate {rd,wr}msr[q]_safe() implementations

From: Dave Hansen

Date: Fri Mar 20 2026 - 15:08:32 EST



From: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>

These should be very familiar by now. Use the "raw_" indirection
to consolidate the duplicate implementations. Do four at once now
because these are quite straightforward.

Signed-off-by: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
---

b/arch/x86/include/asm/msr.h | 44 +++++++++++++++++++-------------------
b/arch/x86/include/asm/paravirt.h | 20 -----------------
2 files changed, 23 insertions(+), 41 deletions(-)

diff -puN arch/x86/include/asm/msr.h~rdmsr-dups-6 arch/x86/include/asm/msr.h
--- a/arch/x86/include/asm/msr.h~rdmsr-dups-6 2026-03-20 11:24:20.448855576 -0700
+++ b/arch/x86/include/asm/msr.h 2026-03-20 11:24:20.455855887 -0700
@@ -174,6 +174,8 @@ static inline u64 native_read_pmc(int co

#define raw_read_msr paravirt_read_msr
#define raw_read_msr_safe paravirt_read_msr_safe
+#define raw_write_msr paravirt_write_msr
+#define raw_write_msr_safe paravirt_write_msr_safe

#else
#include <linux/errno.h>
@@ -189,27 +191,6 @@ static inline u64 native_read_pmc(int co
* pointer indirection), this allows gcc to optimize better
*/

-static inline void wrmsr(u32 msr, u32 low, u32 high)
-{
- raw_write_msr(msr, (u64)high << 32 | low);
-}
-
-static inline void wrmsrq(u32 msr, u64 val)
-{
- raw_write_msr(msr, val);
-}
-
-/* wrmsr with exception handling */
-static inline int wrmsrq_safe(u32 msr, u64 val)
-{
- return raw_write_msr_safe(msr, val);
-}
-
-static inline int rdmsrq_safe(u32 msr, u64 *p)
-{
- return raw_read_msr_safe(msr, p);
-}
-
static __always_inline u64 rdpmc(int counter)
{
return native_read_pmc(counter);
@@ -240,6 +221,27 @@ do { \
#define rdmsrq(msr, val) \
((val) = raw_read_msr((msr)))

+static inline int rdmsrq_safe(u32 msr, u64 *p)
+{
+ return raw_read_msr_safe(msr, p);
+}
+
+/* wrmsr with exception handling */
+static inline int wrmsrq_safe(u32 msr, u64 val)
+{
+ return raw_write_msr_safe(msr, val);
+}
+
+static inline void wrmsr(u32 msr, u32 low, u32 high)
+{
+ raw_write_msr(msr, (u64)high << 32 | low);
+}
+
+static inline void wrmsrq(u32 msr, u64 val)
+{
+ raw_write_msr(msr, val);
+}
+
/* Instruction opcode for WRMSRNS supported in binutils >= 2.40 */
#define ASM_WRMSRNS _ASM_BYTES(0x0f,0x01,0xc6)

diff -puN arch/x86/include/asm/paravirt.h~rdmsr-dups-6 arch/x86/include/asm/paravirt.h
--- a/arch/x86/include/asm/paravirt.h~rdmsr-dups-6 2026-03-20 11:24:20.452855754 -0700
+++ b/arch/x86/include/asm/paravirt.h 2026-03-20 11:24:20.455855887 -0700
@@ -161,26 +161,6 @@ static inline int paravirt_write_msr_saf
return PVOP_CALL2(int, pv_ops, cpu.write_msr_safe, msr, val);
}

-static __always_inline void wrmsr(u32 msr, u32 low, u32 high)
-{
- paravirt_write_msr(msr, (u64)high << 32 | low);
-}
-
-static inline void wrmsrq(u32 msr, u64 val)
-{
- paravirt_write_msr(msr, val);
-}
-
-static inline int wrmsrq_safe(u32 msr, u64 val)
-{
- return paravirt_write_msr_safe(msr, val);
-}
-
-static __always_inline int rdmsrq_safe(u32 msr, u64 *p)
-{
- return paravirt_read_msr_safe(msr, p);
-}
-
static __always_inline u64 rdpmc(int counter)
{
return PVOP_CALL1(u64, pv_ops, cpu.read_pmc, counter);
_