|
@@ -290,11 +290,11 @@ 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 = pte_val(*ptep);
|
|
|
+ old_pte = *ptep;
|
|
|
/*
|
|
|
* wait until _PAGE_BUSY is clear then set it atomically
|
|
|
*/
|
|
|
- if (unlikely(old_pte & _PAGE_BUSY)) {
|
|
|
+ if (unlikely(pte_val(old_pte) & _PAGE_BUSY)) {
|
|
|
cpu_relax();
|
|
|
continue;
|
|
|
}
|
|
@@ -305,16 +305,18 @@ static inline pte_t kvmppc_read_update_linux_pte(pte_t *ptep, int writing,
|
|
|
return __pte(0);
|
|
|
#endif
|
|
|
/* If pte is not present return None */
|
|
|
- if (unlikely(!(old_pte & _PAGE_PRESENT)))
|
|
|
+ if (unlikely(!(pte_val(old_pte) & _PAGE_PRESENT)))
|
|
|
return __pte(0);
|
|
|
|
|
|
new_pte = pte_mkyoung(old_pte);
|
|
|
if (writing && pte_write(old_pte))
|
|
|
new_pte = pte_mkdirty(new_pte);
|
|
|
|
|
|
- if (old_pte == __cmpxchg_u64((unsigned long *)ptep, old_pte,
|
|
|
- new_pte))
|
|
|
+ if (pte_val(old_pte) == __cmpxchg_u64((unsigned long *)ptep,
|
|
|
+ pte_val(old_pte),
|
|
|
+ pte_val(new_pte))) {
|
|
|
break;
|
|
|
+ }
|
|
|
}
|
|
|
return new_pte;
|
|
|
}
|