diff options
Diffstat (limited to 'arch/x86/hyperv/mmu.c')
| -rw-r--r-- | arch/x86/hyperv/mmu.c | 12 | 
1 files 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;  |