From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933625AbeAXMuL (ORCPT ); Wed, 24 Jan 2018 07:50:11 -0500 Received: from terminus.zytor.com ([65.50.211.136]:59511 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933386AbeAXMuJ (ORCPT ); Wed, 24 Jan 2018 07:50:09 -0500 Date: Wed, 24 Jan 2018 04:48:58 -0800 From: tip-bot for Vitaly Kuznetsov Message-ID: Cc: dazhan@microsoft.com, haiyangz@microsoft.com, kys@microsoft.com, hpa@zytor.com, linux-kernel@vger.kernel.org, luto@kernel.org, vkuznets@redhat.com, mingo@kernel.org, sthemmin@microsoft.com, tglx@linutronix.de, adityabh@microsoft.com, Michael.H.Kelley@microsoft.com Reply-To: dazhan@microsoft.com, haiyangz@microsoft.com, kys@microsoft.com, linux-kernel@vger.kernel.org, hpa@zytor.com, luto@kernel.org, vkuznets@redhat.com, tglx@linutronix.de, Michael.H.Kelley@microsoft.com, adityabh@microsoft.com, mingo@kernel.org, sthemmin@microsoft.com In-Reply-To: <20180124103629.29980-1-vkuznets@redhat.com> References: <20180124103629.29980-1-vkuznets@redhat.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:x86/hyperv] x86/hyperv: Stop suppressing X86_FEATURE_PCID Git-Commit-ID: 04651dd978a8749e59065df14b970a127f219ac2 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 04651dd978a8749e59065df14b970a127f219ac2 Gitweb: https://git.kernel.org/tip/04651dd978a8749e59065df14b970a127f219ac2 Author: Vitaly Kuznetsov AuthorDate: Wed, 24 Jan 2018 11:36:29 +0100 Committer: Thomas Gleixner CommitDate: Wed, 24 Jan 2018 13:44:57 +0100 x86/hyperv: Stop suppressing X86_FEATURE_PCID When hypercall-based TLB flush was enabled for Hyper-V guests PCID feature was deliberately suppressed as a precaution: back then PCID was never exposed to Hyper-V guests and it wasn't clear what will happen if some day it becomes available. The day came and PCID/INVPCID features are already exposed on certain Hyper-V hosts. >>From TLFS (as of 5.0b) it is unclear how TLB flush hypercalls combine with PCID. In particular the usage of PCID is per-cpu based: the same mm gets different CR3 values on different CPUs. If the hypercall does exact matching this will fail. However, this is not the case. David Zhang explains: "In practice, the AddressSpace argument is ignored on any VM that supports PCIDs. Architecturally, the AddressSpace argument must match the CR3 with PCID bits stripped out (i.e., the low 12 bits of AddressSpace should be 0 in long mode). The flush hypercalls flush all PCIDs for the specified AddressSpace." With this, PCID can be enabled. Signed-off-by: Vitaly Kuznetsov Signed-off-by: Thomas Gleixner Cc: David Zhang Cc: Stephen Hemminger Cc: Haiyang Zhang Cc: "Michael Kelley (EOSG)" Cc: Andy Lutomirski Cc: devel@linuxdriverproject.org Cc: "K. Y. Srinivasan" Cc: Aditya Bhandari Link: https://lkml.kernel.org/r/20180124103629.29980-1-vkuznets@redhat.com --- arch/x86/hyperv/mmu.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/arch/x86/hyperv/mmu.c b/arch/x86/hyperv/mmu.c index 9cc9e1c..694abf1 100644 --- a/arch/x86/hyperv/mmu.c +++ b/arch/x86/hyperv/mmu.c @@ -111,7 +111,7 @@ static void hyperv_flush_tlb_others(const struct cpumask *cpus, int cpu, vcpu, gva_n, max_gvas; struct hv_flush_pcpu **flush_pcpu; struct hv_flush_pcpu *flush; - u64 status = U64_MAX; + u64 base, status = U64_MAX; unsigned long flags; trace_hyperv_mmu_flush_tlb_others(cpus, info); @@ -137,7 +137,12 @@ static void hyperv_flush_tlb_others(const struct cpumask *cpus, } if (info->mm) { + /* + * AddressSpace argument must match the CR3 with PCID bits + * stripped out. + */ flush->address_space = virt_to_phys(info->mm->pgd); + flush->address_space &= CR3_ADDR_MASK; flush->flags = 0; } else { flush->address_space = 0; @@ -219,7 +224,12 @@ static void hyperv_flush_tlb_others_ex(const struct cpumask *cpus, } if (info->mm) { + /* + * AddressSpace argument must match the CR3 with PCID bits + * stripped out. + */ flush->address_space = virt_to_phys(info->mm->pgd); + flush->address_space &= CR3_ADDR_MASK; flush->flags = 0; } else { flush->address_space = 0; @@ -278,8 +288,6 @@ void hyperv_setup_mmu_ops(void) if (!(ms_hyperv.hints & HV_X64_REMOTE_TLB_FLUSH_RECOMMENDED)) return; - setup_clear_cpu_cap(X86_FEATURE_PCID); - if (!(ms_hyperv.hints & HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED)) { pr_info("Using hypercall for remote TLB flush\n"); pv_mmu_ops.flush_tlb_others = hyperv_flush_tlb_others;