mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 08:43:19 -04:00
arm64: replace pa_to_pvh() with page_to_pvh() in pmap_remove_l2()
Revise pmap_remove_l2() to use the constant-time function page_to_pvh() instead of the linear-time function pa_to_pvh(). Reviewed by: kib, markj MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D30876
This commit is contained in:
parent
33e1287b6a
commit
0c188c06c6
1 changed files with 8 additions and 10 deletions
|
|
@ -2834,8 +2834,7 @@ pmap_remove_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t sva,
|
|||
{
|
||||
struct md_page *pvh;
|
||||
pt_entry_t old_l2;
|
||||
vm_offset_t eva, va;
|
||||
vm_page_t m, ml3;
|
||||
vm_page_t m, ml3, mt;
|
||||
|
||||
PMAP_LOCK_ASSERT(pmap, MA_OWNED);
|
||||
KASSERT((sva & L2_OFFSET) == 0, ("pmap_remove_l2: sva is not aligned"));
|
||||
|
|
@ -2853,19 +2852,18 @@ pmap_remove_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t sva,
|
|||
pmap->pm_stats.wired_count -= L2_SIZE / PAGE_SIZE;
|
||||
pmap_resident_count_dec(pmap, L2_SIZE / PAGE_SIZE);
|
||||
if (old_l2 & ATTR_SW_MANAGED) {
|
||||
m = PHYS_TO_VM_PAGE(old_l2 & ~ATTR_MASK);
|
||||
pvh = page_to_pvh(m);
|
||||
CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, old_l2 & ~ATTR_MASK);
|
||||
pvh = pa_to_pvh(old_l2 & ~ATTR_MASK);
|
||||
pmap_pvh_free(pvh, pmap, sva);
|
||||
eva = sva + L2_SIZE;
|
||||
for (va = sva, m = PHYS_TO_VM_PAGE(old_l2 & ~ATTR_MASK);
|
||||
va < eva; va += PAGE_SIZE, m++) {
|
||||
for (mt = m; mt < &m[L2_SIZE / PAGE_SIZE]; mt++) {
|
||||
if (pmap_pte_dirty(pmap, old_l2))
|
||||
vm_page_dirty(m);
|
||||
vm_page_dirty(mt);
|
||||
if (old_l2 & ATTR_AF)
|
||||
vm_page_aflag_set(m, PGA_REFERENCED);
|
||||
if (TAILQ_EMPTY(&m->md.pv_list) &&
|
||||
vm_page_aflag_set(mt, PGA_REFERENCED);
|
||||
if (TAILQ_EMPTY(&mt->md.pv_list) &&
|
||||
TAILQ_EMPTY(&pvh->pv_list))
|
||||
vm_page_aflag_clear(m, PGA_WRITEABLE);
|
||||
vm_page_aflag_clear(mt, PGA_WRITEABLE);
|
||||
}
|
||||
}
|
||||
if (pmap == kernel_pmap) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue