From: Hou Wenlong <houwenlong.hwl@xxxxxxxxxxxx> On PVM guest, SWAPGS doesn't work. So let __rdgsbase_inactive() and __wrgsbase_inactive() to use rdmsrl()/wrmsrl() on PVM guest. Signed-off-by: Hou Wenlong <houwenlong.hwl@xxxxxxxxxxxx> Signed-off-by: Lai Jiangshan <jiangshan.ljs@xxxxxxxxxxxx> --- arch/x86/kernel/process_64.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 33b268747bb7..9a56bcef515e 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -157,7 +157,7 @@ enum which_selector { * traced or probed than any access to a per CPU variable happens with * the wrong GS. * - * It is not used on Xen paravirt. When paravirt support is needed, it + * It is not used on Xen/PVM paravirt. When paravirt support is needed, it * needs to be renamed with native_ prefix. */ static noinstr unsigned long __rdgsbase_inactive(void) @@ -166,7 +166,8 @@ static noinstr unsigned long __rdgsbase_inactive(void) lockdep_assert_irqs_disabled(); - if (!cpu_feature_enabled(X86_FEATURE_XENPV)) { + if (!cpu_feature_enabled(X86_FEATURE_XENPV) && + !cpu_feature_enabled(X86_FEATURE_KVM_PVM_GUEST)) { native_swapgs(); gsbase = rdgsbase(); native_swapgs(); @@ -184,14 +185,15 @@ static noinstr unsigned long __rdgsbase_inactive(void) * traced or probed than any access to a per CPU variable happens with * the wrong GS. * - * It is not used on Xen paravirt. When paravirt support is needed, it + * It is not used on Xen/PVM paravirt. When paravirt support is needed, it * needs to be renamed with native_ prefix. */ static noinstr void __wrgsbase_inactive(unsigned long gsbase) { lockdep_assert_irqs_disabled(); - if (!cpu_feature_enabled(X86_FEATURE_XENPV)) { + if (!cpu_feature_enabled(X86_FEATURE_XENPV) && + !cpu_feature_enabled(X86_FEATURE_KVM_PVM_GUEST)) { native_swapgs(); wrgsbase(gsbase); native_swapgs(); -- 2.19.1.6.gb485710b