|
@@ -3202,7 +3202,16 @@ static int handle_pte_fault(struct mm_struct *mm,
|
|
pte_t entry;
|
|
pte_t entry;
|
|
spinlock_t *ptl;
|
|
spinlock_t *ptl;
|
|
|
|
|
|
- entry = ACCESS_ONCE(*pte);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * some architectures can have larger ptes than wordsize,
|
|
|
|
+ * e.g.ppc44x-defconfig has CONFIG_PTE_64BIT=y and CONFIG_32BIT=y,
|
|
|
|
+ * so READ_ONCE or ACCESS_ONCE cannot guarantee atomic accesses.
|
|
|
|
+ * The code below just needs a consistent view for the ifs and
|
|
|
|
+ * we later double check anyway with the ptl lock held. So here
|
|
|
|
+ * a barrier will do.
|
|
|
|
+ */
|
|
|
|
+ entry = *pte;
|
|
|
|
+ barrier();
|
|
if (!pte_present(entry)) {
|
|
if (!pte_present(entry)) {
|
|
if (pte_none(entry)) {
|
|
if (pte_none(entry)) {
|
|
if (vma->vm_ops) {
|
|
if (vma->vm_ops) {
|