mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-22 11:17:19 +00:00
With the changes over the past year to how accesses to the page's dirty
field are synchronized, there is no need for pmap_protect() to acquire the page queues lock unless it is going to access the pv lists. Reviewed by: kib
This commit is contained in:
parent
75410f02d2
commit
3abf7a6f33
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=233097
@ -2940,6 +2940,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
|
|||||||
pd_entry_t ptpaddr, *pde;
|
pd_entry_t ptpaddr, *pde;
|
||||||
pt_entry_t *pte;
|
pt_entry_t *pte;
|
||||||
int anychanged;
|
int anychanged;
|
||||||
|
boolean_t pv_lists_locked;
|
||||||
|
|
||||||
if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
|
if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
|
||||||
pmap_remove(pmap, sva, eva);
|
pmap_remove(pmap, sva, eva);
|
||||||
@ -2950,9 +2951,10 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
|
|||||||
(VM_PROT_WRITE|VM_PROT_EXECUTE))
|
(VM_PROT_WRITE|VM_PROT_EXECUTE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
pv_lists_locked = FALSE;
|
||||||
|
resume:
|
||||||
anychanged = 0;
|
anychanged = 0;
|
||||||
|
|
||||||
vm_page_lock_queues();
|
|
||||||
PMAP_LOCK(pmap);
|
PMAP_LOCK(pmap);
|
||||||
for (; sva < eva; sva = va_next) {
|
for (; sva < eva; sva = va_next) {
|
||||||
|
|
||||||
@ -3001,9 +3003,25 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
|
|||||||
if (pmap_protect_pde(pmap, pde, sva, prot))
|
if (pmap_protect_pde(pmap, pde, sva, prot))
|
||||||
anychanged = 1;
|
anychanged = 1;
|
||||||
continue;
|
continue;
|
||||||
} else if (!pmap_demote_pde(pmap, pde, sva)) {
|
} else {
|
||||||
/* The large page mapping was destroyed. */
|
if (!pv_lists_locked) {
|
||||||
continue;
|
pv_lists_locked = TRUE;
|
||||||
|
if (!mtx_trylock(&vm_page_queue_mtx)) {
|
||||||
|
if (anychanged)
|
||||||
|
pmap_invalidate_all(
|
||||||
|
pmap);
|
||||||
|
PMAP_UNLOCK(pmap);
|
||||||
|
vm_page_lock_queues();
|
||||||
|
goto resume;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!pmap_demote_pde(pmap, pde, sva)) {
|
||||||
|
/*
|
||||||
|
* The large page mapping was
|
||||||
|
* destroyed.
|
||||||
|
*/
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3043,7 +3061,8 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
|
|||||||
}
|
}
|
||||||
if (anychanged)
|
if (anychanged)
|
||||||
pmap_invalidate_all(pmap);
|
pmap_invalidate_all(pmap);
|
||||||
vm_page_unlock_queues();
|
if (pv_lists_locked)
|
||||||
|
vm_page_unlock_queues();
|
||||||
PMAP_UNLOCK(pmap);
|
PMAP_UNLOCK(pmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user