|
@@ -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;
|