Changeset View
Changeset View
Standalone View
Standalone View
head/sys/arm64/arm64/pmap.c
Show First 20 Lines • Show All 3,443 Lines • ▼ Show 20 Lines | if ((orig_l3 & ATTR_SW_MANAGED) != 0) { | ||||
/* | /* | ||||
* The pmap lock is sufficient to synchronize with | * The pmap lock is sufficient to synchronize with | ||||
* concurrent calls to pmap_page_test_mappings() and | * concurrent calls to pmap_page_test_mappings() and | ||||
* pmap_ts_referenced(). | * pmap_ts_referenced(). | ||||
*/ | */ | ||||
if (pmap_pte_dirty(orig_l3)) | if (pmap_pte_dirty(orig_l3)) | ||||
vm_page_dirty(om); | vm_page_dirty(om); | ||||
if ((orig_l3 & ATTR_AF) != 0) | if ((orig_l3 & ATTR_AF) != 0) { | ||||
pmap_invalidate_page(pmap, va); | |||||
vm_page_aflag_set(om, PGA_REFERENCED); | vm_page_aflag_set(om, PGA_REFERENCED); | ||||
} | |||||
CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, opa); | CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, opa); | ||||
pv = pmap_pvh_remove(&om->md, pmap, va); | pv = pmap_pvh_remove(&om->md, pmap, va); | ||||
if ((m->oflags & VPO_UNMANAGED) != 0) | if ((m->oflags & VPO_UNMANAGED) != 0) | ||||
free_pv_entry(pmap, pv); | free_pv_entry(pmap, pv); | ||||
if ((om->a.flags & PGA_WRITEABLE) != 0 && | if ((om->a.flags & PGA_WRITEABLE) != 0 && | ||||
TAILQ_EMPTY(&om->md.pv_list) && | TAILQ_EMPTY(&om->md.pv_list) && | ||||
((om->flags & PG_FICTITIOUS) != 0 || | ((om->flags & PG_FICTITIOUS) != 0 || | ||||
TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list))) | TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list))) | ||||
vm_page_aflag_clear(om, PGA_WRITEABLE); | vm_page_aflag_clear(om, PGA_WRITEABLE); | ||||
} | } else { | ||||
KASSERT((orig_l3 & ATTR_AF) != 0, | |||||
("pmap_enter: unmanaged mapping lacks ATTR_AF")); | |||||
pmap_invalidate_page(pmap, va); | pmap_invalidate_page(pmap, va); | ||||
} | |||||
orig_l3 = 0; | orig_l3 = 0; | ||||
} else { | } else { | ||||
/* | /* | ||||
* Increment the counters. | * Increment the counters. | ||||
*/ | */ | ||||
if ((new_l3 & ATTR_SW_WIRED) != 0) | if ((new_l3 & ATTR_SW_WIRED) != 0) | ||||
pmap->pm_stats.wired_count++; | pmap->pm_stats.wired_count++; | ||||
pmap_resident_count_inc(pmap, 1); | pmap_resident_count_inc(pmap, 1); | ||||
▲ Show 20 Lines • Show All 2,918 Lines • Show Last 20 Lines |