|
@@ -1711,6 +1711,10 @@ struct btrfs_root *open_ctree(struct super_block *sb,
|
|
|
fs_info->defrag_inodes = RB_ROOT;
|
|
|
fs_info->trans_no_join = 0;
|
|
|
|
|
|
+ /* readahead state */
|
|
|
+ INIT_RADIX_TREE(&fs_info->reada_tree, GFP_NOFS & ~__GFP_WAIT);
|
|
|
+ spin_lock_init(&fs_info->reada_lock);
|
|
|
+
|
|
|
fs_info->thread_pool_size = min_t(unsigned long,
|
|
|
num_online_cpus() + 2, 8);
|
|
|
|
|
@@ -1903,6 +1907,9 @@ struct btrfs_root *open_ctree(struct super_block *sb,
|
|
|
btrfs_init_workers(&fs_info->delayed_workers, "delayed-meta",
|
|
|
fs_info->thread_pool_size,
|
|
|
&fs_info->generic_worker);
|
|
|
+ btrfs_init_workers(&fs_info->readahead_workers, "readahead",
|
|
|
+ fs_info->thread_pool_size,
|
|
|
+ &fs_info->generic_worker);
|
|
|
|
|
|
/*
|
|
|
* endios are largely parallel and should have a very
|
|
@@ -1913,6 +1920,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
|
|
|
|
|
|
fs_info->endio_write_workers.idle_thresh = 2;
|
|
|
fs_info->endio_meta_write_workers.idle_thresh = 2;
|
|
|
+ fs_info->readahead_workers.idle_thresh = 2;
|
|
|
|
|
|
btrfs_start_workers(&fs_info->workers, 1);
|
|
|
btrfs_start_workers(&fs_info->generic_worker, 1);
|
|
@@ -1926,6 +1934,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
|
|
|
btrfs_start_workers(&fs_info->endio_freespace_worker, 1);
|
|
|
btrfs_start_workers(&fs_info->delayed_workers, 1);
|
|
|
btrfs_start_workers(&fs_info->caching_workers, 1);
|
|
|
+ btrfs_start_workers(&fs_info->readahead_workers, 1);
|
|
|
|
|
|
fs_info->bdi.ra_pages *= btrfs_super_num_devices(disk_super);
|
|
|
fs_info->bdi.ra_pages = max(fs_info->bdi.ra_pages,
|
|
@@ -2650,6 +2659,7 @@ int close_ctree(struct btrfs_root *root)
|
|
|
btrfs_stop_workers(&fs_info->submit_workers);
|
|
|
btrfs_stop_workers(&fs_info->delayed_workers);
|
|
|
btrfs_stop_workers(&fs_info->caching_workers);
|
|
|
+ btrfs_stop_workers(&fs_info->readahead_workers);
|
|
|
|
|
|
btrfs_close_devices(fs_info->fs_devices);
|
|
|
btrfs_mapping_tree_free(&fs_info->mapping_tree);
|