On Fri, Dec 15, 2017 at 09:00:41AM +0100, Peter Zijlstra wrote: > On Thu, Dec 14, 2017 at 09:04:56PM -0800, Dave Hansen wrote: > > > > I've got some additions to the selftests and a fix where we pass FOLL_* > > flags around a bit more instead of just 'write'. I'll get those out as > > soon as I do a bit more testing. > > Try the below; I have more in the works, but this already fixes a whole > bunch of obvious fail and should fix the case I described. > > The thing is, you should _never_ return NULL for an access error, that's > complete crap. > > You should also not blindly change every pte_write() test to > pte_access_permitted(), that's also wrong, because then you're missing > the read-access tests. > > Basically you need to very carefully audit each and every > p??_access_permitted() call; they're currently mostly wrong. I think we also want this: diff --git a/fs/dax.c b/fs/dax.c index 78b72c48374e..95981591977a 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -627,8 +627,7 @@ static void dax_mapping_entry_mkclean(struct address_space *mapping, if (pfn != pmd_pfn(*pmdp)) goto unlock_pmd; - if (!pmd_dirty(*pmdp) - && !pmd_access_permitted(*pmdp, WRITE)) + if (!pmd_dirty(*pmdp) && !pmd_write(*pmdp)) goto unlock_pmd; flush_cache_page(vma, address, pfn); diff --git a/mm/memory.c b/mm/memory.c index 5eb3d2524bdc..6ce3ba12e07d 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3948,7 +3948,7 @@ static int handle_pte_fault(struct vm_fault *vmf) if (unlikely(!pte_same(*vmf->pte, entry))) goto unlock; if (vmf->flags & FAULT_FLAG_WRITE) { - if (!pte_access_permitted(entry, WRITE)) + if (!pte_write(entry)) return do_wp_page(vmf); entry = pte_mkdirty(entry); } the DAX one is both inconsistent (only the PMD case, not also the PTE case) and just wrong; you don't want PKEYs to avoid cleaning pages, that's crazy. The memory one is also clearly wrong, not having access does not a write fault make. If we have pte_write() set we should not do_wp_page() just because we don't have access. This falls under the "doing anything other than hard failure for !access is crazy" header. Still looking at __handle_mm_fault(), they smell bad, but I can't get my brain started today :/ -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>