Btrfs: set leave_spinning in btrfs_get_extent
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>
This commit is contained in:
parent
de2c6615dc
commit
e49aabd973
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user