Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

btrfs: qgroup: set a more sane default value for subtree drop threshold

Since commit 011b46c30476 ("btrfs: skip subtree scan if it's too high to
avoid low stall in btrfs_commit_transaction()"), btrfs qgroup can
automatically skip large subtree scan at the cost of marking qgroup
inconsistent.

It's designed to address the final performance problem of snapshot drop
with qgroup enabled, but to be safe the default value is
BTRFS_MAX_LEVEL, requiring a user space daemon to set a different value
to make it work.

I'd say it's not a good idea to rely on user space tool to set this
default value, especially when some operations (snapshot dropping) can
be triggered immediately after mount, leaving a very small window to
that that sysfs interface.

So instead of disabling this new feature by default, enable it with a
low threshold (3), so that large subvolume tree drop at mount time won't
cause huge qgroup workload.

CC: stable@vger.kernel.org # 6.1
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>

authored by

Qu Wenruo and committed by
David Sterba
5f9062a4 3510e684

+4 -2
+1 -1
fs/btrfs/disk-io.c
··· 1959 1959 fs_info->qgroup_seq = 1; 1960 1960 fs_info->qgroup_ulist = NULL; 1961 1961 fs_info->qgroup_rescan_running = false; 1962 - fs_info->qgroup_drop_subtree_thres = BTRFS_MAX_LEVEL; 1962 + fs_info->qgroup_drop_subtree_thres = BTRFS_QGROUP_DROP_SUBTREE_THRES_DEFAULT; 1963 1963 mutex_init(&fs_info->qgroup_rescan_lock); 1964 1964 } 1965 1965
+1 -1
fs/btrfs/qgroup.c
··· 1407 1407 fs_info->quota_root = NULL; 1408 1408 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON; 1409 1409 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_SIMPLE_MODE; 1410 - fs_info->qgroup_drop_subtree_thres = BTRFS_MAX_LEVEL; 1410 + fs_info->qgroup_drop_subtree_thres = BTRFS_QGROUP_DROP_SUBTREE_THRES_DEFAULT; 1411 1411 spin_unlock(&fs_info->qgroup_lock); 1412 1412 1413 1413 btrfs_free_qgroup_config(fs_info);
+2
fs/btrfs/qgroup.h
··· 121 121 #define BTRFS_QGROUP_RUNTIME_FLAG_CANCEL_RESCAN (1ULL << 63) 122 122 #define BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING (1ULL << 62) 123 123 124 + #define BTRFS_QGROUP_DROP_SUBTREE_THRES_DEFAULT (3) 125 + 124 126 /* 125 127 * Record a dirty extent, and info qgroup to update quota on it 126 128 */