Skip to content
  • Doug Moore's avatar
    The function vm_phys_free_contig invokes vm_phys_free_pages for every · b8590dae
    Doug Moore authored
    power-of-two page block it frees, launching an unsuccessful search for
    a buddy to pair up with each time.  The only possible buddy-up mergers
    are across the boundaries of the freed region, so change
    vm_phys_free_contig simply to enqueue the freed interior blocks, via a
    new function vm_phys_enqueue_contig, and then call vm_phys_free_pages
    on the bounding blocks to create as big a cross-boundary block as
    possible after buddy-merging.
    
    The only callers of vm_phys_free_contig at the moment call it in
    situations where merging blocks across the boundary is clearly
    impossible, so just call vm_phys_enqueue_contig in those places and
    avoid trying to buddy-up at all.
    
    One beneficiary of this change is in breaking reservations.  For the
    case where memory is freed in breaking a reservation with only the
    first and last pages allocated, the number of cycles consumed by the
    operation drops about 11% with this change.
    
    Suggested by: alc
    Reviewed by: alc
    Approved by: kib, markj (mentors)
    Differential Revision: https://reviews.freebsd.org/D16901
    b8590dae