btrfs: reada: limit max works count
Reada creates 2 works for each level of tree recursively. In case of a tree having many levels, the number of created works is 2^level_of_tree. Actually we don't need so many works in parallel, this patch limits max works to BTRFS_MAX_MIRRORS * 2. The per-fs works_counter will be also used for btrfs_reada_wait() to check is there are background workers. Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
895a11b868
commit
2fefd5583f
|
@ -1822,6 +1822,9 @@ struct btrfs_fs_info {
|
|||
spinlock_t reada_lock;
|
||||
struct radix_tree_root reada_tree;
|
||||
|
||||
/* readahead works cnt */
|
||||
atomic_t reada_works_cnt;
|
||||
|
||||
/* Extent buffer radix tree */
|
||||
spinlock_t buffer_lock;
|
||||
struct radix_tree_root buffer_radix;
|
||||
|
|
|
@ -2603,6 +2603,7 @@ int open_ctree(struct super_block *sb,
|
|||
atomic_set(&fs_info->nr_async_bios, 0);
|
||||
atomic_set(&fs_info->defrag_running, 0);
|
||||
atomic_set(&fs_info->qgroup_op_seq, 0);
|
||||
atomic_set(&fs_info->reada_works_cnt, 0);
|
||||
atomic64_set(&fs_info->tree_mod_seq, 0);
|
||||
fs_info->sb = sb;
|
||||
fs_info->max_inline = BTRFS_DEFAULT_MAX_INLINE;
|
||||
|
|
|
@ -748,6 +748,8 @@ static void reada_start_machine_worker(struct btrfs_work *work)
|
|||
set_task_ioprio(current, BTRFS_IOPRIO_READA);
|
||||
__reada_start_machine(fs_info);
|
||||
set_task_ioprio(current, old_ioprio);
|
||||
|
||||
atomic_dec(&fs_info->reada_works_cnt);
|
||||
}
|
||||
|
||||
static void __reada_start_machine(struct btrfs_fs_info *fs_info)
|
||||
|
@ -779,8 +781,12 @@ static void __reada_start_machine(struct btrfs_fs_info *fs_info)
|
|||
* enqueue to workers to finish it. This will distribute the load to
|
||||
* the cores.
|
||||
*/
|
||||
for (i = 0; i < 2; ++i)
|
||||
for (i = 0; i < 2; ++i) {
|
||||
reada_start_machine(fs_info);
|
||||
if (atomic_read(&fs_info->reada_works_cnt) >
|
||||
BTRFS_MAX_MIRRORS * 2)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void reada_start_machine(struct btrfs_fs_info *fs_info)
|
||||
|
@ -797,6 +803,7 @@ static void reada_start_machine(struct btrfs_fs_info *fs_info)
|
|||
rmw->fs_info = fs_info;
|
||||
|
||||
btrfs_queue_work(fs_info->readahead_workers, &rmw->work);
|
||||
atomic_inc(&fs_info->reada_works_cnt);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
|
|
Loading…
Reference in New Issue