Fix dirty bit handling in pmap_remove_write().

Reviewed by:	jhb, kib
MFC after:	1 week
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D18732
This commit is contained in:
markj 2019-01-04 17:10:16 +00:00
parent c71bdf560e
commit 6412bdfc1b

View File

@ -2947,15 +2947,13 @@ retry_pv_loop:
}
}
l3 = pmap_l3(pmap, pv->pv_va);
retry:
oldl3 = pmap_load(l3);
retry:
if ((oldl3 & PTE_W) != 0) {
newl3 = oldl3 & ~PTE_W;
if (!atomic_cmpset_long(l3, oldl3, newl3))
newl3 = oldl3 & ~(PTE_D | PTE_W);
if (!atomic_fcmpset_long(l3, &oldl3, newl3))
goto retry;
/* TODO: check for PTE_D? */
if ((oldl3 & PTE_A) != 0)
if ((oldl3 & PTE_D) != 0)
vm_page_dirty(m);
pmap_invalidate_page(pmap, pv->pv_va);
}