> On Jan 2, 2018, at 5:59 AM, Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote: > > The FS and userspace GS bases are available in current->thread, while the > kernel GS base is a percpu variable. Skip the expensive rdmsr and just > get the values from memory. That fsbase change is wrong: thread->fsbase is not guaranteed to be correct for current. > > Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> > --- > v1->v2: hide the accessor for 32-bit kernels > > arch/x86/include/asm/desc.h | 8 ++++++++ > arch/x86/include/asm/kvm_host.h | 10 ---------- > arch/x86/kernel/cpu/common.c | 1 + > arch/x86/kvm/svm.c | 2 +- > arch/x86/kvm/vmx.c | 17 +++-------------- > 5 files changed, 13 insertions(+), 25 deletions(-) > > diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h > index 4011cb03ef08..6ef8c47d0baa 100644 > --- a/arch/x86/include/asm/desc.h > +++ b/arch/x86/include/asm/desc.h > @@ -85,6 +85,14 @@ static inline phys_addr_t get_cpu_gdt_paddr(unsigned int cpu) > return per_cpu_ptr_to_phys(get_cpu_gdt_rw(cpu)); > } > > +#ifdef CONFIG_X86_64 > +/* Provide the current kernel GS base. */ > +static inline void *get_current_kernel_gs_base(void) > +{ > + return this_cpu_ptr(irq_stack_union.gs_base); > +} > +#endif This is an awful name because MSR_KERNEL_GS_BASE means the user gs base. How about calling it something like get_this_cpu_kernelmode_gs_base() or similar? > #ifdef CONFIG_X86_64 > - vmcs_writel(HOST_FS_BASE, read_msr(MSR_FS_BASE)); > - vmcs_writel(HOST_GS_BASE, read_msr(MSR_GS_BASE)); > + vmcs_writel(HOST_FS_BASE, current->thread.fsbase); That's wrong. thread->fsbase isn't kept up to date while the thread is running. You could potentially try to expose an interface to get save_base_legacy() called to update it.