Index: sys/kern/subr_pctrie.c =================================================================== --- sys/kern/subr_pctrie.c +++ sys/kern/subr_pctrie.c @@ -630,16 +630,24 @@ base = (index + i) % PCTRIE_COUNT; if (base == 0 || parent == NULL || parent->pn_clev != 0) continue; - end = MIN(count, i + PCTRIE_COUNT - base); + end = (access == PCTRIE_SMR) ? PCTRIE_COUNT - base : + ffs((parent->pn_popmap >> base) + 1) - 1; + end = MIN(count, i + end); while (i < end) { node = pctrie_node_load(&parent->pn_child[base++], smr, access); - if ((val = pctrie_toval(node)) == NULL) + val = pctrie_toval(node); + if (access == PCTRIE_SMR && val == NULL) break; value[i++] = val; } - if (i < end) - break; + if (access == PCTRIE_SMR) { + if (i < end) + break; + } else { + if (base < PCTRIE_COUNT) + break; + } } if (parent_out != NULL) *parent_out = parent;