summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ctree.h
diff options
context:
space:
mode:
authorDavid Sterba2018-02-26 15:43:18 +0100
committerDavid Sterba2018-05-28 18:23:04 +0200
commit110a21feedd78d398598d91be57db60e19b76fe0 (patch)
tree800b5024cefc1e8a9678a0a9edbc3fa84ebada91 /fs/btrfs/ctree.h
parentbtrfs: qgroup: Finish rescan when hit the last leaf of extent tree (diff)
downloadkernel-qcow2-linux-110a21feedd78d398598d91be57db60e19b76fe0.tar.gz
kernel-qcow2-linux-110a21feedd78d398598d91be57db60e19b76fe0.tar.xz
kernel-qcow2-linux-110a21feedd78d398598d91be57db60e19b76fe0.zip
btrfs: introduce conditional wakeup helpers
Add convenience wrappers for the waitqueue management that involves memory barriers to prevent deadlocks. The helpers will let us remove barriers and the necessary comments in several places. Reviewed-by: Nikolay Borisov <nborisov@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/ctree.h')
-rw-r--r--fs/btrfs/ctree.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 954bfb5054b1..3d6b2dc86c8f 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -3755,4 +3755,26 @@ static inline int btrfs_is_testing(struct btrfs_fs_info *fs_info)
return 0;
}
+static inline void cond_wake_up(struct wait_queue_head *wq)
+{
+ /*
+ * This implies a full smp_mb barrier, see comments for
+ * waitqueue_active why.
+ */
+ if (wq_has_sleeper(wq))
+ wake_up(wq);
+}
+
+static inline void cond_wake_up_nomb(struct wait_queue_head *wq)
+{
+ /*
+ * Special case for conditional wakeup where the barrier required for
+ * waitqueue_active is implied by some of the preceding code. Eg. one
+ * of such atomic operations (atomic_dec_and_return, ...), or a
+ * unlock/lock sequence, etc.
+ */
+ if (waitqueue_active(wq))
+ wake_up(wq);
+}
+
#endif