Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F161184652
D24238.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D24238.diff
View Options
Index: head/sys/powerpc/booke/pmap.c
===================================================================
--- head/sys/powerpc/booke/pmap.c
+++ head/sys/powerpc/booke/pmap.c
@@ -1532,9 +1532,12 @@
rw_wlock(&pvh_global_lock);
PMAP_LOCK(pmap);
for (; va < endva; va += PAGE_SIZE) {
- pte = pte_find(mmu, pmap, va);
- if ((pte != NULL) && PTE_ISVALID(pte))
- pte_remove(mmu, pmap, va, hold_flag);
+ pte = pte_find_next(mmu, pmap, &va);
+ if ((pte == NULL) || !PTE_ISVALID(pte))
+ break;
+ if (va >= endva)
+ break;
+ pte_remove(mmu, pmap, va, hold_flag);
}
PMAP_UNLOCK(pmap);
rw_wunlock(&pvh_global_lock);
Index: head/sys/powerpc/booke/pmap_32.c
===================================================================
--- head/sys/powerpc/booke/pmap_32.c
+++ head/sys/powerpc/booke/pmap_32.c
@@ -598,6 +598,35 @@
return (NULL);
}
+/* Get a pointer to a PTE in a page table, or the next closest (greater) one. */
+static __inline pte_t *
+pte_find_next(mmu_t mmu, pmap_t pmap, vm_offset_t *pva)
+{
+ vm_offset_t va;
+ pte_t **pdir;
+ pte_t *pte;
+ unsigned long i, j;
+
+ KASSERT((pmap != NULL), ("pte_find: invalid pmap"));
+
+ va = *pva;
+ i = PDIR_IDX(va);
+ j = PTBL_IDX(va);
+ pdir = pmap->pm_pdir;
+ for (; i < PDIR_NENTRIES; i++, j = 0) {
+ if (pdir[i] == NULL)
+ continue;
+ for (; j < PTBL_NENTRIES; j++) {
+ pte = &pdir[i][j];
+ if (!PTE_ISVALID(pte))
+ continue;
+ *pva = PDIR_SIZE * i + PAGE_SIZE * j;
+ return (pte);
+ }
+ }
+ return (NULL);
+}
+
/* Set up kernel page tables. */
static void
kernel_pte_alloc(vm_offset_t data_end, vm_offset_t addr)
Index: head/sys/powerpc/booke/pmap_64.c
===================================================================
--- head/sys/powerpc/booke/pmap_64.c
+++ head/sys/powerpc/booke/pmap_64.c
@@ -145,6 +145,7 @@
static int pte_enter(mmu_t, pmap_t, vm_page_t, vm_offset_t, uint32_t, boolean_t);
static int pte_remove(mmu_t, pmap_t, vm_offset_t, uint8_t);
static pte_t *pte_find(mmu_t, pmap_t, vm_offset_t);
+static pte_t *pte_find_next(mmu_t, pmap_t, vm_offset_t *);
static void kernel_pte_alloc(vm_offset_t, vm_offset_t);
/**************************************************************************/
@@ -202,6 +203,50 @@
ptbl = pdir[PDIR_IDX(va)];
return ((ptbl != NULL) ? &ptbl[PTBL_IDX(va)] : NULL);
+}
+
+/* Get a pointer to a PTE in a page table, or the next closest (greater) one. */
+static __inline pte_t *
+pte_find_next(mmu_t mmu, pmap_t pmap, vm_offset_t *pva)
+{
+ vm_offset_t va;
+ pte_t ****pm_root;
+ pte_t *pte;
+ unsigned long i, j, k, l;
+
+ KASSERT((pmap != NULL), ("pte_find: invalid pmap"));
+
+ va = *pva;
+ i = PG_ROOT_IDX(va);
+ j = PDIR_L1_IDX(va);
+ k = PDIR_IDX(va);
+ l = PTBL_IDX(va);
+ pm_root = pmap->pm_root;
+ /* truncate the VA for later. */
+ va &= ~((1UL << (PG_ROOT_H + 1)) - 1);
+ for (; i < PG_ROOT_NENTRIES; i++, j = 0) {
+ if (pm_root[i] == 0)
+ continue;
+ for (; j < PDIR_L1_NENTRIES; j++, k = 0) {
+ if (pm_root[i][j] == 0)
+ continue;
+ for (; k < PDIR_NENTRIES; k++, l = 0) {
+ if (pm_root[i][j][k] == NULL)
+ continue;
+ for (; l < PTBL_NENTRIES; l++) {
+ pte = &pm_root[i][j][k][l];
+ if (!PTE_ISVALID(pte))
+ continue;
+ *pva = va + PG_ROOT_SIZE * i +
+ PDIR_L1_SIZE * j +
+ PDIR_SIZE * k +
+ PAGE_SIZE * l;
+ return (pte);
+ }
+ }
+ }
+ }
+ return (NULL);
}
static bool
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Jul 2, 9:23 AM (4 h, 14 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34592200
Default Alt Text
D24238.diff (3 KB)
Attached To
Mode
D24238: powerpc/booke: Add pte_find_next() to find the next in-use PTE
Attached
Detach File
Event Timeline
Log In to Comment