summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilipe Manana <fdmanana@suse.com>2024-09-17 12:03:11 +0100
committerDavid Sterba <dsterba@suse.com>2024-11-11 14:34:18 +0100
commita8371fccf016c83e1c3d9fb832ebb60d783d1853 (patch)
tree60a3680f1abe7842d0788c8d41b6f545406b80f7
parente7fa845010f12bb98251a2bf9dcf39fd601f9424 (diff)
downloadlinux-a8371fccf016c83e1c3d9fb832ebb60d783d1853.tar.gz
linux-a8371fccf016c83e1c3d9fb832ebb60d783d1853.tar.bz2
linux-a8371fccf016c83e1c3d9fb832ebb60d783d1853.zip
btrfs: re-enable the extent map shrinker
Now that the extent map shrinker can only be run by a single task and runs asynchronously as a work queue job, enable it as it can no longer cause stalls on tasks allocating memory and entering the extent map shrinker through the fs shrinker (implemented by btrfs_free_cached_objects()). This is crucial to prevent exhaustion of memory due to unbounded extent map creation, primarily with direct IO but also for buffered IO on files with holes. This problem, for the direct IO case, was first reported in the Link tag below. That report was added to a Link tag of the first patch that introduced the extent map shrinker, commit 956a17d9d050 ("btrfs: add a shrinker for extent maps"), however the Link tag disappeared somehow from the committed patch (but was included in the submitted patch to the mailing list), so adding it below for future reference. Link: https://lore.kernel.org/linux-btrfs/13f94633dcf04d29aaf1f0a43d42c55e@amazon.com/ Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--fs/btrfs/super.c8
1 files changed, 1 insertions, 7 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 7dc7c4fee996..7cd62307cd41 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -2393,13 +2393,7 @@ static long btrfs_nr_cached_objects(struct super_block *sb, struct shrink_contro
trace_btrfs_extent_map_shrinker_count(fs_info, nr);
- /*
- * Only report the real number for EXPERIMENTAL builds, as there are
- * reports of serious performance degradation caused by too frequent shrinks.
- */
- if (IS_ENABLED(CONFIG_BTRFS_EXPERIMENTAL))
- return nr;
- return 0;
+ return nr;
}
static long btrfs_free_cached_objects(struct super_block *sb, struct shrink_control *sc)