Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 128799
b: refs/heads/master
c: 4543df7
h: refs/heads/master
i:
  128797: ef9f496
  128795: 17f8dc4
  128791: 2465ead
  128783: 04727b1
  128767: b5be283
v: v3
  • Loading branch information
Chris Mason committed Sep 25, 2008
1 parent 93ace8b commit dc10fcb
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 35d8ba66294ff2a53c17337a1aa1ff6739492f41
refs/heads/master: 4543df7ecc8ae4928c1e51d6e7dc188d650abee4
1 change: 1 addition & 0 deletions trunk/fs/btrfs/ctree.h
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,7 @@ struct btrfs_fs_info {
*/
struct btrfs_workers workers;
struct btrfs_workers endio_workers;
int thread_pool_size;

#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,18)
struct work_struct trans_work;
Expand Down
30 changes: 15 additions & 15 deletions trunk/fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
GFP_NOFS);
int ret;
int err = -EINVAL;

struct btrfs_super_block *disk_super;

if (!extent_root || !tree_root || !fs_info) {
Expand Down Expand Up @@ -1148,6 +1149,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
fs_info->btree_inode = new_inode(sb);
fs_info->btree_inode->i_ino = 1;
fs_info->btree_inode->i_nlink = 1;
fs_info->thread_pool_size = min(num_online_cpus() + 2, 8);

sb->s_blocksize = 4096;
sb->s_blocksize_bits = blksize_bits(4096);
Expand Down Expand Up @@ -1195,19 +1197,6 @@ struct btrfs_root *open_ctree(struct super_block *sb,
mutex_init(&fs_info->trans_mutex);
mutex_init(&fs_info->fs_mutex);

/* we need to start all the end_io workers up front because the
* queue work function gets called at interrupt time. The endio
* workers don't normally start IO, so some number of them <= the
* number of cpus is fine. They handle checksumming after a read.
*
* The other worker threads do start IO, so the max is larger than
* the number of CPUs. FIXME, tune this for huge machines
*/
btrfs_init_workers(&fs_info->workers, num_online_cpus() * 2);
btrfs_init_workers(&fs_info->endio_workers, num_online_cpus());
btrfs_start_workers(&fs_info->workers, 1);
btrfs_start_workers(&fs_info->endio_workers, num_online_cpus());

#if 0
ret = add_hasher(fs_info, "crc32c");
if (ret) {
Expand Down Expand Up @@ -1238,6 +1227,17 @@ struct btrfs_root *open_ctree(struct super_block *sb,
if (err)
goto fail_sb_buffer;

/*
* we need to start all the end_io workers up front because the
* queue work function gets called at interrupt time, and so it
* cannot dynamically grow.
*/
btrfs_init_workers(&fs_info->workers, fs_info->thread_pool_size);
btrfs_init_workers(&fs_info->endio_workers, fs_info->thread_pool_size);
btrfs_start_workers(&fs_info->workers, 1);
btrfs_start_workers(&fs_info->endio_workers, fs_info->thread_pool_size);


err = -EINVAL;
if (btrfs_super_num_devices(disk_super) > fs_devices->open_devices) {
printk("Btrfs: wanted %llu devices, but found %llu\n",
Expand Down Expand Up @@ -1341,10 +1341,10 @@ struct btrfs_root *open_ctree(struct super_block *sb,
mutex_unlock(&fs_info->fs_mutex);
fail_sb_buffer:
extent_io_tree_empty_lru(&BTRFS_I(fs_info->btree_inode)->io_tree);
fail_iput:
iput(fs_info->btree_inode);
btrfs_stop_workers(&fs_info->workers);
btrfs_stop_workers(&fs_info->endio_workers);
fail_iput:
iput(fs_info->btree_inode);
fail:
btrfs_close_devices(fs_info->fs_devices);
btrfs_mapping_tree_free(&fs_info->mapping_tree);
Expand Down
13 changes: 12 additions & 1 deletion trunk/fs/btrfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ static void btrfs_put_super (struct super_block * sb)
enum {
Opt_degraded, Opt_subvol, Opt_device, Opt_nodatasum, Opt_nodatacow,
Opt_max_extent, Opt_max_inline, Opt_alloc_start, Opt_nobarrier,
Opt_ssd, Opt_err,
Opt_ssd, Opt_thread_pool, Opt_err,
};

static match_table_t tokens = {
Expand All @@ -80,6 +80,7 @@ static match_table_t tokens = {
{Opt_max_extent, "max_extent=%s"},
{Opt_max_inline, "max_inline=%s"},
{Opt_alloc_start, "alloc_start=%s"},
{Opt_thread_pool, "thread_pool=%d"},
{Opt_ssd, "ssd"},
{Opt_err, NULL}
};
Expand Down Expand Up @@ -118,6 +119,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
struct btrfs_fs_info *info = root->fs_info;
substring_t args[MAX_OPT_ARGS];
char *p, *num;
int intarg;

if (!options)
return 0;
Expand Down Expand Up @@ -166,6 +168,15 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
printk(KERN_INFO "btrfs: turning off barriers\n");
btrfs_set_opt(info->mount_opt, NOBARRIER);
break;
case Opt_thread_pool:
intarg = 0;
match_int(&args[0], &intarg);
if (intarg) {
info->thread_pool_size = intarg;
printk(KERN_INFO "btrfs: thread pool %d\n",
info->thread_pool_size);
}
break;
case Opt_max_extent:
num = match_strdup(&args[0]);
if (num) {
Expand Down

0 comments on commit dc10fcb

Please sign in to comment.