Page MenuHomeFreeBSD

D30931.1793973128.diff
No OneTemporary

Authored By
Unknown
Size
2 KB
Referenced Files
None
Subscribers
None

D30931.1793973128.diff

diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c
--- a/sys/arm64/arm64/pmap.c
+++ b/sys/arm64/arm64/pmap.c
@@ -3130,8 +3130,8 @@
SLIST_INIT(&free);
lock = VM_PAGE_TO_PV_LIST_LOCK(m);
pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy : page_to_pvh(m);
-retry:
rw_wlock(lock);
+retry:
while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) {
pmap = PV_PMAP(pv);
if (!PMAP_TRYLOCK(pmap)) {
@@ -3140,7 +3140,6 @@
PMAP_LOCK(pmap);
rw_wlock(lock);
if (pvh_gen != pvh->pv_gen) {
- rw_wunlock(lock);
PMAP_UNLOCK(pmap);
goto retry;
}
@@ -3151,7 +3150,6 @@
("pmap_remove_all: no page table entry found"));
KASSERT(lvl == 2,
("pmap_remove_all: invalid pte level %d", lvl));
-
pmap_demote_l2_locked(pmap, pte, va, &lock);
PMAP_UNLOCK(pmap);
}
@@ -3165,7 +3163,6 @@
PMAP_LOCK(pmap);
rw_wlock(lock);
if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
- rw_wunlock(lock);
PMAP_UNLOCK(pmap);
goto retry;
}
@@ -5224,8 +5221,8 @@
return;
lock = VM_PAGE_TO_PV_LIST_LOCK(m);
pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy : page_to_pvh(m);
-retry_pv_loop:
rw_wlock(lock);
+retry:
TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_next, next_pv) {
pmap = PV_PMAP(pv);
PMAP_ASSERT_STAGE1(pmap);
@@ -5236,12 +5233,11 @@
rw_wlock(lock);
if (pvh_gen != pvh->pv_gen) {
PMAP_UNLOCK(pmap);
- rw_wunlock(lock);
- goto retry_pv_loop;
+ goto retry;
}
}
va = pv->pv_va;
- pte = pmap_pte(pmap, pv->pv_va, &lvl);
+ pte = pmap_pte(pmap, va, &lvl);
if ((pmap_load(pte) & ATTR_SW_DBM) != 0)
(void)pmap_demote_l2_locked(pmap, pte, va, &lock);
KASSERT(lock == VM_PAGE_TO_PV_LIST_LOCK(m),
@@ -5261,17 +5257,15 @@
if (pvh_gen != pvh->pv_gen ||
md_gen != m->md.pv_gen) {
PMAP_UNLOCK(pmap);
- rw_wunlock(lock);
- goto retry_pv_loop;
+ goto retry;
}
}
pte = pmap_pte(pmap, pv->pv_va, &lvl);
oldpte = pmap_load(pte);
-retry:
if ((oldpte & ATTR_SW_DBM) != 0) {
- if (!atomic_fcmpset_long(pte, &oldpte,
+ while (!atomic_fcmpset_64(pte, &oldpte,
(oldpte | ATTR_S1_AP_RW_BIT) & ~ATTR_SW_DBM))
- goto retry;
+ cpu_spinwait();
if ((oldpte & ATTR_S1_AP_RW_BIT) ==
ATTR_S1_AP(ATTR_S1_AP_RW))
vm_page_dirty(m);

File Metadata

Mime Type
text/plain
Expires
Fri, Nov 6, 1:52 PM (1 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41518703
Default Alt Text
D30931.1793973128.diff (2 KB)

Event Timeline