powerpc/pmap/oea64: Make PV_LOCK superpage sized

HPT superpages are 16MB, not 2MB.  Taking 8 locks to lock a super page
almost defeats the purpose of using the super page.  Expanding the
PV_LOCK scope to cover 16MB (24 bit shift) reduces this to a single
lock.

MFC after:	3 weeks
This commit is contained in:
Justin Hibbits
2026-02-02 22:48:16 -05:00
parent 7f885581d5
commit 1bc75d77e9
+3 -45
View File
@@ -125,7 +125,7 @@ uintptr_t moea64_get_unique_vsid(void);
#define PV_LOCK_COUNT MAXCPU
static struct mtx_padalign pv_lock[PV_LOCK_COUNT];
#define PV_LOCK_SHIFT 21
#define PV_LOCK_SHIFT HPT_SP_SIZE
#define pa_index(pa) ((pa) >> PV_LOCK_SHIFT)
/*
@@ -146,48 +146,6 @@ static struct mtx_padalign pv_lock[PV_LOCK_COUNT];
#define PV_PAGE_UNLOCK(m) PV_UNLOCK(VM_PAGE_TO_PHYS(m))
#define PV_PAGE_LOCKASSERT(m) PV_LOCKASSERT(VM_PAGE_TO_PHYS(m))
/* Superpage PV lock */
#define PV_LOCK_SIZE (1 << PV_LOCK_SHIFT)
static __always_inline void
moea64_sp_pv_lock(vm_paddr_t pa)
{
vm_paddr_t pa_end;
/* Note: breaking when pa_end is reached to avoid overflows */
pa_end = pa + (HPT_SP_SIZE - PV_LOCK_SIZE);
for (;;) {
mtx_lock_flags(PV_LOCKPTR(pa), MTX_DUPOK);
if (pa == pa_end)
break;
pa += PV_LOCK_SIZE;
}
}
static __always_inline void
moea64_sp_pv_unlock(vm_paddr_t pa)
{
vm_paddr_t pa_end;
/* Note: breaking when pa_end is reached to avoid overflows */
pa_end = pa;
pa += HPT_SP_SIZE - PV_LOCK_SIZE;
for (;;) {
mtx_unlock_flags(PV_LOCKPTR(pa), MTX_DUPOK);
if (pa == pa_end)
break;
pa -= PV_LOCK_SIZE;
}
}
#define SP_PV_LOCK_ALIGNED(pa) moea64_sp_pv_lock(pa)
#define SP_PV_UNLOCK_ALIGNED(pa) moea64_sp_pv_unlock(pa)
#define SP_PV_LOCK(pa) moea64_sp_pv_lock((pa) & ~HPT_SP_MASK)
#define SP_PV_UNLOCK(pa) moea64_sp_pv_unlock((pa) & ~HPT_SP_MASK)
#define SP_PV_PAGE_LOCK(m) SP_PV_LOCK(VM_PAGE_TO_PHYS(m))
#define SP_PV_PAGE_UNLOCK(m) SP_PV_UNLOCK(VM_PAGE_TO_PHYS(m))
struct ofw_map {
cell_t om_va;
cell_t om_len;
@@ -3736,7 +3694,7 @@ moea64_sp_enter(pmap_t pmap, vm_offset_t va, vm_page_t m,
}
}
SP_PV_LOCK_ALIGNED(spa);
PV_LOCK(spa);
PMAP_LOCK(pmap);
/* Note: moea64_remove_locked() also clears cached REF/CHG bits. */
@@ -3775,7 +3733,7 @@ moea64_sp_enter(pmap_t pmap, vm_offset_t va, vm_page_t m,
}
PMAP_UNLOCK(pmap);
SP_PV_UNLOCK_ALIGNED(spa);
PV_UNLOCK(spa);
sync = (sm->a.flags & PGA_EXECUTABLE) == 0;
/* Note: moea64_pvo_cleanup() also clears page prot. flags. */