Page MenuHomeFreeBSD

D20694.1794803681.diff
No OneTemporary

Authored By
Unknown
Size
3 KB
Referenced Files
None
Subscribers
None

D20694.1794803681.diff

Index: sys/powerpc/aim/mmu_oea64.c
===================================================================
--- sys/powerpc/aim/mmu_oea64.c
+++ sys/powerpc/aim/mmu_oea64.c
@@ -234,6 +234,8 @@
struct pvo_head *pvo_head);
static void moea64_pvo_remove_from_pmap(mmu_t mmu, struct pvo_entry *pvo);
static void moea64_pvo_remove_from_page(mmu_t mmu, struct pvo_entry *pvo);
+static void moea64_pvo_remove_from_page_locked(mmu_t mmu,
+ struct pvo_entry *pvo);
static struct pvo_entry *moea64_pvo_find_va(pmap_t, vm_offset_t);
/*
@@ -1454,9 +1456,7 @@
/* Free any dead pages */
if (oldpvo != NULL) {
- PV_LOCK(oldpvo->pvo_pte.pa & LPTE_RPGN);
moea64_pvo_remove_from_page(mmu, oldpvo);
- PV_UNLOCK(oldpvo->pvo_pte.pa & LPTE_RPGN);
free_pvo_entry(oldpvo);
}
@@ -1877,9 +1877,7 @@
/* Free any dead pages */
if (oldpvo != NULL) {
- PV_LOCK(oldpvo->pvo_pte.pa & LPTE_RPGN);
moea64_pvo_remove_from_page(mmu, oldpvo);
- PV_UNLOCK(oldpvo->pvo_pte.pa & LPTE_RPGN);
free_pvo_entry(oldpvo);
}
@@ -2388,9 +2386,7 @@
while (!SLIST_EMPTY(&tofree)) {
pvo = SLIST_FIRST(&tofree);
SLIST_REMOVE_HEAD(&tofree, pvo_dlink);
- PV_LOCK(pvo->pvo_pte.pa & LPTE_RPGN);
moea64_pvo_remove_from_page(mmu, pvo);
- PV_UNLOCK(pvo->pvo_pte.pa & LPTE_RPGN);
free_pvo_entry(pvo);
}
}
@@ -2432,9 +2428,7 @@
while (!SLIST_EMPTY(&tofree)) {
pvo = SLIST_FIRST(&tofree);
SLIST_REMOVE_HEAD(&tofree, pvo_dlink);
- PV_LOCK(pvo->pvo_pte.pa & LPTE_RPGN);
moea64_pvo_remove_from_page(mmu, pvo);
- PV_UNLOCK(pvo->pvo_pte.pa & LPTE_RPGN);
free_pvo_entry(pvo);
}
}
@@ -2460,7 +2454,7 @@
wasdead = (pvo->pvo_vaddr & PVO_DEAD);
if (!wasdead)
moea64_pvo_remove_from_pmap(mmu, pvo);
- moea64_pvo_remove_from_page(mmu, pvo);
+ moea64_pvo_remove_from_page_locked(mmu, pvo);
if (!wasdead)
LIST_INSERT_HEAD(&freequeue, pvo, pvo_vlink);
PMAP_UNLOCK(pmap);
@@ -2633,10 +2627,10 @@
}
}
-static void
-moea64_pvo_remove_from_page(mmu_t mmu, struct pvo_entry *pvo)
+static inline void
+_moea64_pvo_remove_from_page_locked(mmu_t mmu, struct pvo_entry *pvo,
+ vm_page_t m)
{
- struct vm_page *pg;
KASSERT(pvo->pvo_vaddr & PVO_DEAD, ("Trying to delink live page"));
@@ -2650,12 +2644,10 @@
*/
PV_LOCKASSERT(pvo->pvo_pte.pa & LPTE_RPGN);
if (pvo->pvo_vaddr & PVO_MANAGED) {
- pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
-
- if (pg != NULL) {
+ if (m != NULL) {
LIST_REMOVE(pvo, pvo_vlink);
- if (LIST_EMPTY(vm_page_to_pvoh(pg)))
- vm_page_aflag_clear(pg,
+ if (LIST_EMPTY(vm_page_to_pvoh(m)))
+ vm_page_aflag_clear(m,
PGA_WRITEABLE | PGA_EXECUTABLE);
}
}
@@ -2664,6 +2656,30 @@
moea64_pvo_remove_calls++;
}
+static void
+moea64_pvo_remove_from_page_locked(mmu_t mmu, struct pvo_entry *pvo)
+{
+ vm_page_t pg = NULL;
+
+ if (pvo->pvo_vaddr & PVO_MANAGED)
+ pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
+
+ _moea64_pvo_remove_from_page_locked(mmu, pvo, pg);
+}
+
+static void
+moea64_pvo_remove_from_page(mmu_t mmu, struct pvo_entry *pvo)
+{
+ vm_page_t pg = NULL;
+
+ if (pvo->pvo_vaddr & PVO_MANAGED)
+ pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
+
+ PV_LOCK(pvo->pvo_pte.pa & LPTE_RPGN);
+ _moea64_pvo_remove_from_page_locked(mmu, pvo, pg);
+ PV_UNLOCK(pvo->pvo_pte.pa & LPTE_RPGN);
+}
+
static struct pvo_entry *
moea64_pvo_find_va(pmap_t pm, vm_offset_t va)
{

File Metadata

Mime Type
text/plain
Expires
Mon, Nov 16, 4:34 AM (21 h, 48 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41760265
Default Alt Text
D20694.1794803681.diff (3 KB)

Event Timeline