On Wed, Mar 18, 2015 at 10:31 AM, Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > So I think there's something I'm missing. For non-shared mappings, I > still have the idea that pte_dirty should be the same as pte_write. > And yet, your testing of 3.19 shows that it's a big difference. > There's clearly something I'm completely missing. Ahh. The normal page table scanning and page fault handling both clear and set the dirty bit together with the writable one. But "fork()" will clear the writable bit without clearing dirty. For some reason I thought it moved the dirty bit into the struct page like the VM scanning does, but that was just me having a brainfart. So yeah, pte_dirty doesn't have to match pte_write even under perfectly normal circumstances. Maybe there are other cases. Not that I see a lot of forking in the xfs repair case either, so.. Dave, mind re-running the plain 3.19 numbers to really verify that the pte_dirty/pte_write change really made that big of a difference. Maybe your recollection of ~55,000 migrate_pages events was faulty. If the pte_write ->pte_dirty change is the *only* difference, it's still very odd how that one difference would make migrate_rate go from ~55k to 471k. That's an order of magnitude difference, for what really shouldn't be a big change. I'm running a kernel right now with a hacky "update_mmu_cache()" that warns if pte_dirty is ever different from pte_write(). +void update_mmu_cache(struct vm_area_struct *vma, + unsigned long addr, pte_t *ptep) +{ + if (!(vma->vm_flags & VM_SHARED)) { + pte_t now = READ_ONCE(*ptep); + if (!pte_write(now) != !pte_dirty(now)) { + static int count = 20; + static unsigned int prev = 0; + unsigned int val = pte_val(now) & 0xfff; + if (prev != val && count) { + prev = val; + count--; + WARN(1, "pte value %x", val); + } + } + } +} I haven't seen a single warning so far (and there I wrote all that code to limit repeated warnings), although admittedly update_mu_cache() isn't called for all cases where we change a pte (not for the fork case, for example). But it *is* called for the page faulting cases Maybe a system update has changed libraries and memory allocation patterns, and there is something bigger than that one-liner pte_dirty/write change going on? Linus _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs