aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2009-07-13 21:29:25 -0400
committerChris Mason <chris.mason@oracle.com>2009-07-24 09:23:39 -0400
commit817d52f8dba26d0295c26035531c30ce5f1e3c3e (patch)
tree5230153e86323de48e7e1440352d1b74d2d9961d /fs/btrfs/disk-io.c
parent963030817060e4f109be1993b9ae8f81dbf5e11a (diff)
Btrfs: async block group caching
This patch moves the caching of the block group off to a kthread in order to allow people to allocate sooner. Instead of blocking up behind the caching mutex, we instead kick of the caching kthread, and then attempt to make an allocation. If we cannot, we wait on the block groups caching waitqueue, which the caching kthread will wake the waiting threads up everytime it finds 2 meg worth of space, and then again when its finished caching. This is how I tested the speedup from this mkfs the disk mount the disk fill the disk up with fs_mark unmount the disk mount the disk time touch /mnt/foo Without my changes this took 11 seconds on my box, with these changes it now takes 1 second. Another change thats been put in place is we lock the super mirror's in the pinned extent map in order to keep us from adding that stuff as free space when caching the block group. This doesn't really change anything else as far as the pinned extent map is concerned, since for actual pinned extents we use EXTENT_DIRTY, but it does mean that when we unmount we have to go in and unlock those extents to keep from leaking memory. I've also added a check where when we are reading block groups from disk, if the amount of space used == the size of the block group, we go ahead and mark the block group as cached. This drastically reduces the amount of time it takes to cache the block groups. Using the same test as above, except doing a dd to a file and then unmounting, it used to take 33 seconds to umount, now it takes 3 seconds. This version uses the commit_root in the caching kthread, and then keeps track of how many async caching threads are running at any given time so if one of the async threads is still running as we cross transactions we can wait until its finished before handling the pinned extents. Thank you, Signed-off-by: Josef Bacik <jbacik@redhat.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 55d9d188e693..ec2c915f7f4a 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -907,6 +907,7 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize,
907 spin_lock_init(&root->inode_lock); 907 spin_lock_init(&root->inode_lock);
908 mutex_init(&root->objectid_mutex); 908 mutex_init(&root->objectid_mutex);
909 mutex_init(&root->log_mutex); 909 mutex_init(&root->log_mutex);
910 init_rwsem(&root->commit_root_sem);
910 init_waitqueue_head(&root->log_writer_wait); 911 init_waitqueue_head(&root->log_writer_wait);
911 init_waitqueue_head(&root->log_commit_wait[0]); 912 init_waitqueue_head(&root->log_commit_wait[0]);
912 init_waitqueue_head(&root->log_commit_wait[1]); 913 init_waitqueue_head(&root->log_commit_wait[1]);
@@ -1566,6 +1567,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1566 atomic_set(&fs_info->async_delalloc_pages, 0); 1567 atomic_set(&fs_info->async_delalloc_pages, 0);
1567 atomic_set(&fs_info->async_submit_draining, 0); 1568 atomic_set(&fs_info->async_submit_draining, 0);
1568 atomic_set(&fs_info->nr_async_bios, 0); 1569 atomic_set(&fs_info->nr_async_bios, 0);
1570 atomic_set(&fs_info->async_caching_threads, 0);
1569 fs_info->sb = sb; 1571 fs_info->sb = sb;
1570 fs_info->max_extent = (u64)-1; 1572 fs_info->max_extent = (u64)-1;
1571 fs_info->max_inline = 8192 * 1024; 1573 fs_info->max_inline = 8192 * 1024;
@@ -2337,6 +2339,7 @@ int close_ctree(struct btrfs_root *root)
2337 free_extent_buffer(root->fs_info->csum_root->commit_root); 2339 free_extent_buffer(root->fs_info->csum_root->commit_root);
2338 2340
2339 btrfs_free_block_groups(root->fs_info); 2341 btrfs_free_block_groups(root->fs_info);
2342 btrfs_free_super_mirror_extents(root->fs_info);
2340 2343
2341 del_fs_roots(fs_info); 2344 del_fs_roots(fs_info);
2342 2345