• Josef Bacik's avatar
    Btrfs: introduce ticketed enospc infrastructure · 957780eb
    Josef Bacik authored
    Our enospc flushing sucks.  It is born from a time where we were early
    enospc'ing constantly because multiple threads would race in for the same
    reservation and randomly starve other ones out.  So I came up with this solution
    to block any other reservations from happening while one guy tried to flush
    stuff to satisfy his reservation.  This gives us pretty good correctness, but
    completely crap latency.
    
    The solution I've come up with is ticketed reservations.  Basically we try to
    make our reservation, and if we can't we put a ticket on a list in order and
    kick off an async flusher thread.  This async flusher thread does the same old
    flushing we always did, just asynchronously.  As space is freed and added back
    to the space_info it checks and sees if we have any tickets that need
    satisfying, and adds space to the tickets and wakes up anything we've satisfied.
    
    Once the flusher thread stops making progress it wakes up all the current
    tickets and tells them to take a hike.
    
    There is a priority list for things that can't flush, since the async flusher
    could do anything we need to avoid deadlocks.  These guys get priority for
    having their reservation made, and will still do manual flushing themselves in
    case the async flusher isn't running.
    
    This patch gives us significantly better latencies.  Thanks,
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    957780eb
ctree.h 123 KB