• Brian Foster's avatar
    bcachefs: update alloc cursor in early bucket allocator · e0fb0dcc
    Brian Foster authored
    A recent bug report uncovered a scenario where a filesystem never
    runs with freespace_initialized, and therefore the user observes
    significantly degraded write performance by virtue of running the
    early bucket allocator. The associated bug aside, the primary cause
    of the performance drop in this particular instance is that the
    early bucket allocator does not update the allocation cursor. This
    means that every allocation walks the alloc btree from the first
    bucket of the associated device looking for a bucket marked as free
    space.
    
    Update the early allocator code to set the alloc cursor to the last
    processed position in the tree, similar to how the freelist
    allocator behaves. With the alloc_cursor being updated, the retry
    logic also needs to be updated to restart from the beginning of the
    device when a free bucket is not available between the cursor and
    the end of the device. Track the restart position in a first_bucket
    variable to make the code a bit more easily readable and consistent
    with the freelist allocator.
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
    e0fb0dcc
alloc_foreground.c 40 KB