]> asedeno.scripts.mit.edu Git - linux.git/commit
btrfs: simplify waiting loop in btrfs_tree_lock
authorDavid Sterba <dsterba@suse.com>
Wed, 4 Apr 2018 00:11:50 +0000 (02:11 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 Feb 2019 13:13:28 +0000 (14:13 +0100)
commit970e74d961db61eed18e33d8ecd644ee8ef7da04
tree3d77e75a8e04f1207ca504d7d3a3504cb6e843d9
parent8bead258206f4d4f485ad55bc1e39d23bbfe2fdd
btrfs: simplify waiting loop in btrfs_tree_lock

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: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/locking.c