Release the page queues lock earlier in pmap_protect() and pmap_remove() in
order to reduce contention.
This commit is contained in:
parent
6e2faf455e
commit
7580b56bdc
@ -1565,6 +1565,8 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
|
|||||||
if (pmap->pm_stats.resident_count == 0)
|
if (pmap->pm_stats.resident_count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
anyvalid = 0;
|
||||||
|
|
||||||
vm_page_lock_queues();
|
vm_page_lock_queues();
|
||||||
PMAP_LOCK(pmap);
|
PMAP_LOCK(pmap);
|
||||||
|
|
||||||
@ -1581,8 +1583,6 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
anyvalid = 0;
|
|
||||||
|
|
||||||
for (; sva < eva; sva = va_next) {
|
for (; sva < eva; sva = va_next) {
|
||||||
|
|
||||||
if (pmap->pm_stats.resident_count == 0)
|
if (pmap->pm_stats.resident_count == 0)
|
||||||
@ -1644,11 +1644,10 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anyvalid)
|
|
||||||
pmap_invalidate_all(pmap);
|
|
||||||
out:
|
out:
|
||||||
vm_page_unlock_queues();
|
vm_page_unlock_queues();
|
||||||
|
if (anyvalid)
|
||||||
|
pmap_invalidate_all(pmap);
|
||||||
PMAP_UNLOCK(pmap);
|
PMAP_UNLOCK(pmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1818,9 +1817,9 @@ retry:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
vm_page_unlock_queues();
|
||||||
if (anychanged)
|
if (anychanged)
|
||||||
pmap_invalidate_all(pmap);
|
pmap_invalidate_all(pmap);
|
||||||
vm_page_unlock_queues();
|
|
||||||
PMAP_UNLOCK(pmap);
|
PMAP_UNLOCK(pmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1650,6 +1650,8 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
|
|||||||
if (pmap->pm_stats.resident_count == 0)
|
if (pmap->pm_stats.resident_count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
anyvalid = 0;
|
||||||
|
|
||||||
vm_page_lock_queues();
|
vm_page_lock_queues();
|
||||||
sched_pin();
|
sched_pin();
|
||||||
PMAP_LOCK(pmap);
|
PMAP_LOCK(pmap);
|
||||||
@ -1665,8 +1667,6 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
anyvalid = 0;
|
|
||||||
|
|
||||||
for (; sva < eva; sva = pdnxt) {
|
for (; sva < eva; sva = pdnxt) {
|
||||||
unsigned pdirindex;
|
unsigned pdirindex;
|
||||||
|
|
||||||
@ -1714,12 +1714,11 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anyvalid)
|
|
||||||
pmap_invalidate_all(pmap);
|
|
||||||
out:
|
out:
|
||||||
sched_unpin();
|
sched_unpin();
|
||||||
vm_page_unlock_queues();
|
vm_page_unlock_queues();
|
||||||
|
if (anyvalid)
|
||||||
|
pmap_invalidate_all(pmap);
|
||||||
PMAP_UNLOCK(pmap);
|
PMAP_UNLOCK(pmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1879,10 +1878,10 @@ retry:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (anychanged)
|
|
||||||
pmap_invalidate_all(pmap);
|
|
||||||
sched_unpin();
|
sched_unpin();
|
||||||
vm_page_unlock_queues();
|
vm_page_unlock_queues();
|
||||||
|
if (anychanged)
|
||||||
|
pmap_invalidate_all(pmap);
|
||||||
PMAP_UNLOCK(pmap);
|
PMAP_UNLOCK(pmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1351,11 +1351,10 @@ pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
vm_page_unlock_queues();
|
||||||
pmap_install(oldpmap);
|
pmap_install(oldpmap);
|
||||||
PMAP_UNLOCK(pmap);
|
PMAP_UNLOCK(pmap);
|
||||||
vm_page_unlock_queues();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1468,9 +1467,9 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
|
|||||||
|
|
||||||
sva += PAGE_SIZE;
|
sva += PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
vm_page_unlock_queues();
|
||||||
pmap_install(oldpmap);
|
pmap_install(oldpmap);
|
||||||
PMAP_UNLOCK(pmap);
|
PMAP_UNLOCK(pmap);
|
||||||
vm_page_unlock_queues();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user