Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751504AbeACXmh (ORCPT + 1 other); Wed, 3 Jan 2018 18:42:37 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:43087 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751048AbeACXmf (ORCPT ); Wed, 3 Jan 2018 18:42:35 -0500 X-Google-Smtp-Source: ACJfBosTZriRppTU0PBuXGdZTTn9zLfMUVzLylqkxA1dCbco13pv9GkF+zRttm10VB78CDP4nIYgnw== Subject: Re: [PATCH v2] KVM: x86: do not read FS/GS base MSRs when saving them To: Andy Lutomirski Cc: LKML , kvm list References: <1514901591-12866-1-git-send-email-pbonzini@redhat.com> From: Paolo Bonzini Message-ID: <6d10cdd5-e8d8-f5ed-e039-c71df9d0ea9e@redhat.com> Date: Thu, 4 Jan 2018 00:42:30 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: On 03/01/2018 23:20, Andy Lutomirski wrote: >> On Jan 2, 2018, at 5:59 AM, Paolo Bonzini 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. Note that the value I'm storing in HOST_FS_BASE and HOST_GS_BASE is only used if FS/GS selector is zero. If FS/GS selector is not zero, it is not used. Does that avoid this issue? Certainly worth a comment or clearer code though. >> +#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? True, I'll adopt your name. Paolo >> #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. >