diff --git a/sys/vm/vm_phys.c b/sys/vm/vm_phys.c --- a/sys/vm/vm_phys.c +++ b/sys/vm/vm_phys.c @@ -678,6 +678,19 @@ } } +static vm_page_t +vm_phys_enq_chunk(struct vm_freelist *fl, vm_page_t m, int order) +{ + int npages; + + KASSERT(order >= 0 && order < VM_NFREEORDER, + ("%s: invalid order %d", __func__, order)); + + npages = 1 << order; + vm_freelist_add(fl, m, order, 1); + return (m + npages); +} + /* * Add the physical pages [m, m + npages) at the beginning of a power-of-two * aligned and sized set to the specified free list. @@ -705,12 +718,9 @@ ("%s: page %p has unexpected order %d", __func__, m, m->order)); order = fls(npages) - 1; - KASSERT(order < VM_NFREEORDER, - ("%s: order %d is out of range", __func__, order)); - vm_freelist_add(fl, m, order, tail); - m += 1 << order; - npages -= 1 << order; - } + m = vm_phys_enq_chunk(fl, m, order); + npages -= 1 << order; + } } /* @@ -741,10 +751,7 @@ ("vm_phys_enq_range: page %p has unexpected order %d", m, m->order)); order = ffs(npages) - 1; - KASSERT(order < VM_NFREEORDER, - ("vm_phys_enq_range: order %d is out of range", order)); - vm_freelist_add(fl, m, order, tail); - m += 1 << order; + m = vm_phys_enq_chunk(fl, m, order); npages -= 1 << order; } return (m); @@ -1219,8 +1226,7 @@ KASSERT(seg == &vm_phys_segs[m->segind], ("%s: page range [%p,%p) spans multiple segments", __func__, m_end - npages, m)); - vm_freelist_add(fl, m, order, 1); - m += 1 << order; + m = vm_phys_enq_chunk(fl, m, order); } /* Free blocks of diminishing size. */ vm_phys_enq_beg(m, m_end - m, fl, 1);