|
|
@@ -469,14 +469,18 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
|
|
|
|
|
|
pgdir = vcpu_e500->vcpu.arch.pgdir;
|
|
|
ptep = lookup_linux_ptep(pgdir, hva, &tsize_pages);
|
|
|
- if (pte_present(*ptep))
|
|
|
- wimg = (*ptep >> PTE_WIMGE_SHIFT) & MAS2_WIMGE_MASK;
|
|
|
- else {
|
|
|
- if (printk_ratelimit())
|
|
|
- pr_err("%s: pte not present: gfn %lx, pfn %lx\n",
|
|
|
- __func__, (long)gfn, pfn);
|
|
|
- ret = -EINVAL;
|
|
|
- goto out;
|
|
|
+ if (ptep) {
|
|
|
+ pte_t pte = READ_ONCE(*ptep);
|
|
|
+
|
|
|
+ if (pte_present(pte))
|
|
|
+ wimg = (pte_val(pte) >> PTE_WIMGE_SHIFT) &
|
|
|
+ MAS2_WIMGE_MASK;
|
|
|
+ else {
|
|
|
+ pr_err_ratelimited("%s: pte not present: gfn %lx,pfn %lx\n",
|
|
|
+ __func__, (long)gfn, pfn);
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
}
|
|
|
kvmppc_e500_ref_setup(ref, gtlbe, pfn, wimg);
|
|
|
|