On Mon, Nov 28, 2016 at 12:40 AM, Aaron Lu <aaron.lu@xxxxxxxxx> wrote: > As suggested by Linus, the same mmu gather logic could be used for tlb > flush in mremap and this patch just did that. Ok, looking at this patch, I still think it looks like the right thing to do, but I'm admittedly rather less certain of it. The main advantage of the mmu_gather thing is that it automatically takes care of the TLB flush ranges for us, and that's a big deal during munmap() (where the actual unmapped page range can be _very_ different from the total range), but now that I notice that this doesn't actually remove any other code (in fact, it adds a line), I'm wondering if it's worth it. mremap() is already "dense" in the vma space, unlike munmap (ie you can't move multiple vma's with a single mremap), so the fancy range optimizations that make a difference on some architectures aren't much of an issue. So I guess the MM people should take a look at this and say whether they think the current state is fine or whether we should do the mmu_gather thing. People? However, I also independently think I found an actual bug while looking at the code as part of looking at the patch. This part looks racy: /* * We are remapping a dirty PTE, make sure to * flush TLB before we drop the PTL for the * old PTE or we may race with page_mkclean(). */ if (pte_present(*old_pte) && pte_dirty(*old_pte)) force_flush = true; pte = ptep_get_and_clear(mm, old_addr, old_pte); where the issue is that another thread might make the pte be dirty (in the hardware walker, so no locking of ours make any difference) *after* we checked whether it was dirty, but *before* we removed it from the page tables. So I think the "check for force-flush" needs to come *after*, and we should do pte = ptep_get_and_clear(mm, old_addr, old_pte); if (pte_present(pte) && pte_dirty(pte)) force_flush = true; instead. This happens for the pmd case too. So now I'm not sure the mmu_gather thing is worth it, but I'm pretty sure that there remains a (very very) small race that wasn't fixed by the original fix in commit 5d1904204c99 ("mremap: fix race between mremap() and page cleanning"). Aaron, sorry for waffling about this, and asking you to look at a completely different issue instead. Linus -- 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>