We need to eliminate the pages that have the "dirty" bit set without the "writable" bit set. The biggest cause of these pages is pmap_write_protect(), which drops PTE_W but leaves PTE_D. Both should be dropped: if (!(prot & VM_PROT_WRITE)) - bit_rem = PTE_W; + bit_rem = PTE_W | PTE_D; Maxime