Index: sys/arm64/arm64/pmap.c =================================================================== --- sys/arm64/arm64/pmap.c +++ sys/arm64/arm64/pmap.c @@ -2476,9 +2476,13 @@ #if _NPCM == 3 #define PC_IS_FREE(pc) ((pc)->pc_map[0] == PC_FREEN && \ (pc)->pc_map[1] == PC_FREEN && (pc)->pc_map[2] == PC_FREEL) +#define PC_IS_FULL(pc) ((pc)->pc_map[0] == 0 && (pc)->pc_map[1] == 0 && \ + (pc)->pc_map[2] == 0) #else #define PC_IS_FREE(pc) \ (memcmp((pc)->pc_map, pc_freemask, sizeof(pc_freemask)) == 0) +#define PC_IS_FULL(pc) \ + (memcmp((pc)->pc_map, pc_fullmask, sizeof(pc_fullmask)) == 0) #endif static const uint64_t pc_freemask[] = { PC_FREEN, PC_FREEN, @@ -2491,6 +2495,11 @@ CTASSERT(nitems(pc_freemask) == _NPCM); +#if _NPCM > 3 +static const uint64_t pc_fullmask[nitems(pc_freemask)]; +CTASSERT(nitems(pc_fullmask) == _NPCM); +#endif + #ifdef PV_STATS static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail; @@ -2785,8 +2794,7 @@ pv = &pc->pc_pventry[field * 64 + bit]; pc->pc_map[field] &= ~(1ul << bit); /* If this was the last item, move it to tail */ - if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 && - pc->pc_map[2] == 0) { + if (PC_IS_FULL(pc)) { TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list); @@ -2953,8 +2961,7 @@ va_last = va + L2_SIZE - PAGE_SIZE; for (;;) { pc = TAILQ_FIRST(&pmap->pm_pvchunk); - KASSERT(pc->pc_map[0] != 0 || pc->pc_map[1] != 0 || - pc->pc_map[2] != 0, ("pmap_pv_demote_l2: missing spare")); + KASSERT(!PC_IS_FULL(pc), ("pmap_pv_demote_l2: missing spare")); for (field = 0; field < _NPCM; field++) { while (pc->pc_map[field]) { bit = ffsl(pc->pc_map[field]) - 1; @@ -2975,7 +2982,7 @@ TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list); } out: - if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 && pc->pc_map[2] == 0) { + if (PC_IS_FULL(pc)) { TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list); TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list); }