From: Kan Liang <kan.li...@intel.com> There is no exported kernel interfaces which can flip a MSR bit. It has to do read-modify-write operation on the MSR through rd/wrmsr* interfaces. But the method is not atomic.
There is already __flip_bit support. Just rename and expose it. Suggested-by: Thomas Gleixner <t...@linutronix.de> Signed-off-by: Kan Liang <kan.li...@intel.com> --- arch/x86/include/asm/msr.h | 1 + arch/x86/lib/msr.c | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h index 898dba2..c1e3026 100644 --- a/arch/x86/include/asm/msr.h +++ b/arch/x86/include/asm/msr.h @@ -312,6 +312,7 @@ struct msr *msrs_alloc(void); void msrs_free(struct msr *msrs); int msr_set_bit(u32 msr, u8 bit); int msr_clear_bit(u32 msr, u8 bit); +int msr_flip_bit(u32 msr, u8 bit, bool set); #ifdef CONFIG_SMP int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h); diff --git a/arch/x86/lib/msr.c b/arch/x86/lib/msr.c index 0776425..9bda539 100644 --- a/arch/x86/lib/msr.c +++ b/arch/x86/lib/msr.c @@ -58,7 +58,7 @@ int msr_write(u32 msr, struct msr *m) return wrmsrl_safe(msr, m->q); } -static inline int __flip_bit(u32 msr, u8 bit, bool set) +int msr_flip_bit(u32 msr, u8 bit, bool set) { struct msr m, m1; int err = -EINVAL; @@ -85,6 +85,7 @@ static inline int __flip_bit(u32 msr, u8 bit, bool set) return 1; } +EXPORT_SYMBOL_GPL(msr_flip_bit); /** * Set @bit in a MSR @msr. @@ -96,7 +97,7 @@ static inline int __flip_bit(u32 msr, u8 bit, bool set) */ int msr_set_bit(u32 msr, u8 bit) { - return __flip_bit(msr, bit, true); + return msr_flip_bit(msr, bit, true); } /** @@ -109,7 +110,7 @@ int msr_set_bit(u32 msr, u8 bit) */ int msr_clear_bit(u32 msr, u8 bit) { - return __flip_bit(msr, bit, false); + return msr_flip_bit(msr, bit, false); } #ifdef CONFIG_TRACEPOINTS -- 2.7.4