diff options
author | archdevlab | 2024-10-10 22:30:02 -0400 |
---|---|---|
committer | archdevlab | 2024-10-10 22:30:02 -0400 |
commit | 24a5389478392e531f3f4cb7cd8a76fb4afbbc81 (patch) | |
tree | 866e7eb4e3383c85a254b4fd570e37002f91efb7 /0005-btrfs-only-run-the-extent-map-shrinker-from-kswapd-t.patch | |
parent | 2c433d8e6389d29659333aa4e408a42fce3faf3c (diff) | |
download | aur-24a5389478392e531f3f4cb7cd8a76fb4afbbc81.tar.gz |
update to 6.11
Diffstat (limited to '0005-btrfs-only-run-the-extent-map-shrinker-from-kswapd-t.patch')
-rw-r--r-- | 0005-btrfs-only-run-the-extent-map-shrinker-from-kswapd-t.patch | 140 |
1 files changed, 0 insertions, 140 deletions
diff --git a/0005-btrfs-only-run-the-extent-map-shrinker-from-kswapd-t.patch b/0005-btrfs-only-run-the-extent-map-shrinker-from-kswapd-t.patch deleted file mode 100644 index 5a5586fc4b40..000000000000 --- a/0005-btrfs-only-run-the-extent-map-shrinker-from-kswapd-t.patch +++ /dev/null @@ -1,140 +0,0 @@ -From 9566896326ec76d00c98a08cdc0d450d09b88b89 Mon Sep 17 00:00:00 2001 -From: Filipe Manana <fdmanana@suse.com> -Date: Sun, 11 Aug 2024 16:31:06 +0100 -Subject: [PATCH 5/5] btrfs: only run the extent map shrinker from kswapd tasks - -Currently the extent map shrinker can be run by any task when attempting -to allocate memory and there's enough memory pressure to trigger it. - -To avoid too much latency we stop iterating over extent maps and removing -them once the task needs to reschudle. This logic was introduced in commit -b3ebb9b7e92a ("btrfs: stop extent map shrinker if reschedule is needed"). - -While that solved high latency problems for some use cases, it's still -not enough because with a too high number of tasks entering the extent map -shrinker code, either due to memory allocations or because they are a -kswapd task, we end up having a very high level of contention on some -spin locks, namely: - -1) The fs_info->fs_roots_radix_lock spin lock, which we need to find - roots to iterate over their inodes; - -2) The spin lock of the xarray used to track open inodes for a root - (struct btrfs_root::inodes) - on 6.10 kernels and below, it used to - be a red black tree and the spin lock was root->inode_lock; - -3) The fs_info->delayed_iput_lock spin lock since the shrinker adds - delayed iputs (calls btrfs_add_delayed_iput()). - -Instead of allowing the extent map shrinker to be run by any task, make -it run only by kswapd tasks. This still solves the problem of running -into OOM situations due to an unbounded extent map creation, which is -simple to trigger by direct IO writes, as described in the changelog -of commit 956a17d9d050 ("btrfs: add a shrinker for extent maps"), and -by a similar case when doing buffered IO on files with a very large -number of holes (keeping the file open and creating many holes, whose -extent maps are only released when the file is closed). - -Reported-by: kzd <kzd@56709.net> -Link: https://bugzilla.kernel.org/show_bug.cgi?id=219121 -Reported-by: Octavia Togami <octavia.togami@gmail.com> -Link: https://lore.kernel.org/linux-btrfs/CAHPNGSSt-a4ZZWrtJdVyYnJFscFjP9S7rMcvEMaNSpR556DdLA@mail.gmail.com/ -Fixes: 956a17d9d050 ("btrfs: add a shrinker for extent maps") -CC: stable@vger.kernel.org # 6.10+ -Tested-by: kzd <kzd@56709.net> -Tested-by: Octavia Togami <octavia.togami@gmail.com> -Signed-off-by: Filipe Manana <fdmanana@suse.com> -Cherry-picked-for: https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/issues/70 ---- - fs/btrfs/extent_map.c | 22 ++++++---------------- - fs/btrfs/super.c | 10 ++++++++++ - 2 files changed, 16 insertions(+), 16 deletions(-) - -diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c -index b4c9a6aa1..6853f043c 100644 ---- a/fs/btrfs/extent_map.c -+++ b/fs/btrfs/extent_map.c -@@ -1065,8 +1065,7 @@ static long btrfs_scan_inode(struct btrfs_inode *inode, struct btrfs_em_shrink_c - return 0; - - /* -- * We want to be fast because we can be called from any path trying to -- * allocate memory, so if the lock is busy we don't want to spend time -+ * We want to be fast so if the lock is busy we don't want to spend time - * waiting for it - either some task is about to do IO for the inode or - * we may have another task shrinking extent maps, here in this code, so - * skip this inode. -@@ -1109,9 +1108,7 @@ static long btrfs_scan_inode(struct btrfs_inode *inode, struct btrfs_em_shrink_c - /* - * Stop if we need to reschedule or there's contention on the - * lock. This is to avoid slowing other tasks trying to take the -- * lock and because the shrinker might be called during a memory -- * allocation path and we want to avoid taking a very long time -- * and slowing down all sorts of tasks. -+ * lock. - */ - if (need_resched() || rwlock_needbreak(&tree->lock)) - break; -@@ -1139,12 +1136,7 @@ static long btrfs_scan_root(struct btrfs_root *root, struct btrfs_em_shrink_ctx - if (ctx->scanned >= ctx->nr_to_scan) - break; - -- /* -- * We may be called from memory allocation paths, so we don't -- * want to take too much time and slowdown tasks. -- */ -- if (need_resched()) -- break; -+ cond_resched(); - - inode = btrfs_find_first_inode(root, min_ino); - } -@@ -1202,14 +1194,12 @@ long btrfs_free_extent_maps(struct btrfs_fs_info *fs_info, long nr_to_scan) - ctx.last_ino); - } - -- /* -- * We may be called from memory allocation paths, so we don't want to -- * take too much time and slowdown tasks, so stop if we need reschedule. -- */ -- while (ctx.scanned < ctx.nr_to_scan && !need_resched()) { -+ while (ctx.scanned < ctx.nr_to_scan) { - struct btrfs_root *root; - unsigned long count; - -+ cond_resched(); -+ - spin_lock(&fs_info->fs_roots_radix_lock); - count = radix_tree_gang_lookup(&fs_info->fs_roots_radix, - (void **)&root, -diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c -index f05cce7c8..11faf5e98 100644 ---- a/fs/btrfs/super.c -+++ b/fs/btrfs/super.c -@@ -28,6 +28,7 @@ - #include <linux/btrfs.h> - #include <linux/security.h> - #include <linux/fs_parser.h> -+#include <linux/swap.h> - #include "messages.h" - #include "delayed-inode.h" - #include "ctree.h" -@@ -2394,6 +2395,15 @@ static long btrfs_free_cached_objects(struct super_block *sb, struct shrink_cont - const long nr_to_scan = min_t(unsigned long, LONG_MAX, sc->nr_to_scan); - struct btrfs_fs_info *fs_info = btrfs_sb(sb); - -+ /* -+ * We may be called from any task trying to allocate memory and we don't -+ * want to slow it down with scanning and dropping extent maps. It would -+ * also cause heavy lock contention if many tasks concurrently enter -+ * here. Therefore only allow kswapd tasks to scan and drop extent maps. -+ */ -+ if (!current_is_kswapd()) -+ return 0; -+ - return btrfs_free_extent_maps(fs_info, nr_to_scan); - } - --- -2.46.0 - |