Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 260888
b: refs/heads/master
c: bab39bf
h: refs/heads/master
v: v3
  • Loading branch information
Josef Bacik authored and Chris Mason committed Jul 27, 2011
1 parent 338853f commit 53c5c50
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 30 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: df98b6e2c52f65665eaf0fc23e647fb64335b289
refs/heads/master: bab39bf998133510f2dad08158006197ec0dabea
4 changes: 3 additions & 1 deletion trunk/fs/btrfs/ctree.h
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,6 @@ struct btrfs_space_info {
struct list_head block_groups[BTRFS_NR_RAID_TYPES];
spinlock_t lock;
struct rw_semaphore groups_sem;
atomic_t caching_threads;
wait_queue_head_t wait;
};

Expand Down Expand Up @@ -828,6 +827,7 @@ struct btrfs_caching_control {
struct list_head list;
struct mutex mutex;
wait_queue_head_t wait;
struct btrfs_work work;
struct btrfs_block_group_cache *block_group;
u64 progress;
atomic_t count;
Expand Down Expand Up @@ -1036,6 +1036,8 @@ struct btrfs_fs_info {
struct btrfs_workers endio_write_workers;
struct btrfs_workers endio_freespace_worker;
struct btrfs_workers submit_workers;
struct btrfs_workers caching_workers;

/*
* fixup workers take dirty pages that didn't properly go through
* the cow mechanism and make them safe to write. It happens
Expand Down
6 changes: 6 additions & 0 deletions trunk/fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1807,6 +1807,9 @@ struct btrfs_root *open_ctree(struct super_block *sb,
fs_info->thread_pool_size),
&fs_info->generic_worker);

btrfs_init_workers(&fs_info->caching_workers, "cache",
2, &fs_info->generic_worker);

/* a higher idle thresh on the submit workers makes it much more
* likely that bios will be send down in a sane order to the
* devices
Expand Down Expand Up @@ -1860,6 +1863,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
btrfs_start_workers(&fs_info->endio_write_workers, 1);
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);

fs_info->bdi.ra_pages *= btrfs_super_num_devices(disk_super);
fs_info->bdi.ra_pages = max(fs_info->bdi.ra_pages,
Expand Down Expand Up @@ -2117,6 +2121,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
btrfs_stop_workers(&fs_info->endio_freespace_worker);
btrfs_stop_workers(&fs_info->submit_workers);
btrfs_stop_workers(&fs_info->delayed_workers);
btrfs_stop_workers(&fs_info->caching_workers);
fail_alloc:
kfree(fs_info->delayed_root);
fail_iput:
Expand Down Expand Up @@ -2584,6 +2589,7 @@ int close_ctree(struct btrfs_root *root)
btrfs_stop_workers(&fs_info->endio_freespace_worker);
btrfs_stop_workers(&fs_info->submit_workers);
btrfs_stop_workers(&fs_info->delayed_workers);
btrfs_stop_workers(&fs_info->caching_workers);

btrfs_close_devices(fs_info->fs_devices);
btrfs_mapping_tree_free(&fs_info->mapping_tree);
Expand Down
46 changes: 18 additions & 28 deletions trunk/fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,12 +320,12 @@ static u64 add_new_free_space(struct btrfs_block_group_cache *block_group,
return total_added;
}

static int caching_kthread(void *data)
static noinline void caching_thread(struct btrfs_work *work)
{
struct btrfs_block_group_cache *block_group = data;
struct btrfs_fs_info *fs_info = block_group->fs_info;
struct btrfs_caching_control *caching_ctl = block_group->caching_ctl;
struct btrfs_root *extent_root = fs_info->extent_root;
struct btrfs_block_group_cache *block_group;
struct btrfs_fs_info *fs_info;
struct btrfs_caching_control *caching_ctl;
struct btrfs_root *extent_root;
struct btrfs_path *path;
struct extent_buffer *leaf;
struct btrfs_key key;
Expand All @@ -334,9 +334,14 @@ static int caching_kthread(void *data)
u32 nritems;
int ret = 0;

caching_ctl = container_of(work, struct btrfs_caching_control, work);
block_group = caching_ctl->block_group;
fs_info = block_group->fs_info;
extent_root = fs_info->extent_root;

path = btrfs_alloc_path();
if (!path)
return -ENOMEM;
goto out;

last = max_t(u64, block_group->key.objectid, BTRFS_SUPER_INFO_OFFSET);

Expand Down Expand Up @@ -433,13 +438,11 @@ static int caching_kthread(void *data)
free_excluded_extents(extent_root, block_group);

mutex_unlock(&caching_ctl->mutex);
out:
wake_up(&caching_ctl->wait);

put_caching_control(caching_ctl);
atomic_dec(&block_group->space_info->caching_threads);
btrfs_put_block_group(block_group);

return 0;
}

static int cache_block_group(struct btrfs_block_group_cache *cache,
Expand All @@ -449,7 +452,6 @@ static int cache_block_group(struct btrfs_block_group_cache *cache,
{
struct btrfs_fs_info *fs_info = cache->fs_info;
struct btrfs_caching_control *caching_ctl;
struct task_struct *tsk;
int ret = 0;

smp_mb();
Expand Down Expand Up @@ -501,6 +503,7 @@ static int cache_block_group(struct btrfs_block_group_cache *cache,
caching_ctl->progress = cache->key.objectid;
/* one for caching kthread, one for caching block group list */
atomic_set(&caching_ctl->count, 2);
caching_ctl->work.func = caching_thread;

spin_lock(&cache->lock);
if (cache->cached != BTRFS_CACHE_NO) {
Expand All @@ -516,16 +519,9 @@ static int cache_block_group(struct btrfs_block_group_cache *cache,
list_add_tail(&caching_ctl->list, &fs_info->caching_block_groups);
up_write(&fs_info->extent_commit_sem);

atomic_inc(&cache->space_info->caching_threads);
btrfs_get_block_group(cache);

tsk = kthread_run(caching_kthread, cache, "btrfs-cache-%llu\n",
cache->key.objectid);
if (IS_ERR(tsk)) {
ret = PTR_ERR(tsk);
printk(KERN_ERR "error running thread %d\n", ret);
BUG();
}
btrfs_queue_worker(&fs_info->caching_workers, &caching_ctl->work);

return ret;
}
Expand Down Expand Up @@ -2936,7 +2932,6 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags,
init_waitqueue_head(&found->wait);
*space_info = found;
list_add_rcu(&found->list, &info->space_info);
atomic_set(&found->caching_threads, 0);
return 0;
}

Expand Down Expand Up @@ -4997,14 +4992,10 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans,
}

/*
* We only want to start kthread caching if we are at
* the point where we will wait for caching to make
* progress, or if our ideal search is over and we've
* found somebody to start caching.
* The caching workers are limited to 2 threads, so we
* can queue as much work as we care to.
*/
if (loop > LOOP_CACHING_NOWAIT ||
(loop > LOOP_FIND_IDEAL &&
atomic_read(&space_info->caching_threads) < 2)) {
if (loop > LOOP_FIND_IDEAL) {
ret = cache_block_group(block_group, trans,
orig_root, 0);
BUG_ON(ret);
Expand Down Expand Up @@ -5226,8 +5217,7 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans,
if (loop == LOOP_FIND_IDEAL && found_uncached_bg) {
found_uncached_bg = false;
loop++;
if (!ideal_cache_percent &&
atomic_read(&space_info->caching_threads))
if (!ideal_cache_percent)
goto search;

/*
Expand Down

0 comments on commit 53c5c50

Please sign in to comment.