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

Commit 01871e59 authored by Ross Zwisler's avatar Ross Zwisler Committed by Linus Torvalds
Browse files

mm, dax: fix livelock, allow dax pmd mappings to become writeable



Prior to this change DAX PMD mappings that were made read-only were
never able to be made writable again.  This is because the code in
insert_pfn_pmd() that calls pmd_mkdirty() and pmd_mkwrite() would skip
these calls if the PMD already existed in the page table.

Instead, if we are doing a write always mark the PMD entry as dirty and
writeable.  Without this code we can get into a condition where we mark
the PMD as read-only, and then on a subsequent write fault we get into
an infinite loop of PMD faults where we try unsuccessfully to make the
PMD writeable.

Signed-off-by: default avatarRoss Zwisler <ross.zwisler@linux.intel.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
Reported-by: default avatarJeff Moyer <jmoyer@redhat.com>
Reported-by: default avatarToshi Kani <toshi.kani@hpe.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b2e0d162
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -938,7 +938,6 @@ static void insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr,
	spinlock_t *ptl;

	ptl = pmd_lock(mm, pmd);
	if (pmd_none(*pmd)) {
	entry = pmd_mkhuge(pfn_pmd(pfn, prot));
	if (write) {
		entry = pmd_mkyoung(pmd_mkdirty(entry));
@@ -946,7 +945,6 @@ static void insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr,
	}
	set_pmd_at(mm, addr, pmd, entry);
	update_mmu_cache_pmd(vma, addr, pmd);
	}
	spin_unlock(ptl);
}