• David Sterba's avatar
    btrfs: simplify waiting loop in btrfs_tree_lock · 970e74d9
    David Sterba authored
    Currently, the number of readers and writers is checked and in case
    there are any, wait and redo the locks. There's some duplication
    before the branches go back to again label, eg. calling wait_event on
    blocking_readers twice.
    
    The sequence is transformed
    
    loop:
    * wait for readers
    * wait for writers
    * write_lock
    * check readers, unlock and wait for readers, loop
    * check writers, unlock and wait for writers, loop
    
    The new sequence is not exactly the same due to the simplification, for
    readers it's slightly faster. For the writers, original code does
    
    * wait for writers
    * (loop) wait for readers
    *        wait for writers -- again
    
    while the new goes directly to the reader check. This should behave the
    same on a contended lock with multiple writers and readers, but can
    reduce number of times we're waiting on something.
    Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    970e74d9
locking.c 7.51 KB