Btrfs: set leave_spinning in btrfs_get_extent
authorLiu Bo <bo.liu@linux.alibaba.com>
Sat, 25 Aug 2018 05:47:09 +0000 (13:47 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 15 Oct 2018 15:23:29 +0000 (17:23 +0200)
Unless it's going to read inline extents from btree leaf to page,
btrfs_get_extent won't sleep during the period of holding path lock.

This sets leave_spinning at first and sets path to blocking mode right
before reading inline extent if that's the case.  The benefit is that a
path in spinning mode typically has lower impact (faster) on waiters
rather than that in the blocking mode.

Signed-off-by: Liu Bo <bo.liu@linux.alibaba.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c

index 80e92c4448bb8cf797fa69d39bc6b069adee93d4..e8a954c47f650a3f7fa5b2022e03ccff5425bf89 100644 (file)
@@ -6827,6 +6827,12 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
        /* Chances are we'll be called again, so go ahead and do readahead */
        path->reada = READA_FORWARD;
 
+       /*
+        * Unless we're going to uncompress the inline extent, no sleep would
+        * happen.
+        */
+       path->leave_spinning = 1;
+
        ret = btrfs_lookup_file_extent(NULL, root, path, objectid, start, 0);
        if (ret < 0) {
                err = ret;
@@ -6929,6 +6935,8 @@ next:
                em->orig_block_len = em->len;
                em->orig_start = em->start;
                ptr = btrfs_file_extent_inline_start(item) + extent_offset;
+
+               btrfs_set_path_blocking(path);
                if (!PageUptodate(page)) {
                        if (btrfs_file_extent_compression(leaf, item) !=
                            BTRFS_COMPRESS_NONE) {