ACK/cmnt: [azure][PATCH] x86/hyperv: Stop suppressing X86_FEATURE_PCID

Kleber Souza kleber.souza at canonical.com
Mon Jan 29 12:02:49 UTC 2018


On 01/29/18 12:47, Marcelo Henrique Cerri wrote:
> From: Vitaly Kuznetsov <vkuznets at redhat.com>
> 
> BugLink: http://bugs.launchpad.net/bugs/1745247
> 
> 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 <vkuznets at redhat.com>
> Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
> Cc: David Zhang <dazhan at microsoft.com>
> Cc: Stephen Hemminger <sthemmin at microsoft.com>
> Cc: Haiyang Zhang <haiyangz at microsoft.com>
> Cc: "Michael Kelley (EOSG)" <Michael.H.Kelley at microsoft.com>
> Cc: Andy Lutomirski <luto at kernel.org>
> Cc: devel at linuxdriverproject.org
> Cc: "K. Y. Srinivasan" <kys at microsoft.com>
> Cc: Aditya Bhandari <adityabh at microsoft.com>
> Link: https://lkml.kernel.org/r/20180124103629.29980-1-vkuznets@redhat.com
> 
> (cherry picked from linux-next commit 617ab45c9a8900e64a78b43696c02598b8cad68b)

The "cherry picked from..." line is expected to have the upstream repo
after the sha1, in the format:

(cherry picked from commit <sha1> <upstream repo name>)

But this can be fixed when applying that patch.


Acked-by: Kleber Sacilotto de Souza <kleber.souza at canonical.com>

> Signed-off-by: Marcelo Henrique Cerri <marcelo.cerri at canonical.com>
> ---
>  arch/x86/hyperv/mmu.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/x86/hyperv/mmu.c b/arch/x86/hyperv/mmu.c
> index 9cc9e1c1e2db..56c9ebac946f 100644
> --- a/arch/x86/hyperv/mmu.c
> +++ b/arch/x86/hyperv/mmu.c
> @@ -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;
> 




More information about the kernel-team mailing list