Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e1d44ae authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Michael Ellerman
Browse files

KVM: PPC: Use READ_ONCE when dereferencing pte_t pointer



pte can get updated from other CPUs as part of multiple activities
like THP split, huge page collapse, unmap. We need to make sure we
don't reload the pte value again and again for different checks.

Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 1cbee462
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -290,7 +290,10 @@ static inline pte_t kvmppc_read_update_linux_pte(pte_t *ptep, int writing,
	pte_t old_pte, new_pte = __pte(0);

	while (1) {
		old_pte = *ptep;
		/*
		 * Make sure we don't reload from ptep
		 */
		old_pte = READ_ONCE(*ptep);
		/*
		 * wait until _PAGE_BUSY is clear then set it atomically
		 */
+12 −8
Original line number Diff line number Diff line
@@ -469,15 +469,19 @@ 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;
	if (ptep) {
		pte_t pte = READ_ONCE(*ptep);

		if (pte_present(pte))
			wimg = (pte_val(pte) >> PTE_WIMGE_SHIFT) &
				MAS2_WIMGE_MASK;
		else {
		if (printk_ratelimit())
			pr_err("%s: pte not present: gfn %lx, pfn %lx\n",
			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);

	kvmppc_e500_setup_stlbe(&vcpu_e500->vcpu, gtlbe, tsize,