Skip to content

Commit

Permalink
Btrfs: Lower contention on the csum mutex
Browse files Browse the repository at this point in the history
This takes the csum mutex deeper in the call chain and releases it
more often.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
  • Loading branch information
Chris Mason committed Sep 25, 2008
1 parent 4854ddd commit 5386323
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 8 deletions.
3 changes: 2 additions & 1 deletion fs/btrfs/async-thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ struct btrfs_worker_thread {

/* number of things on the pending list */
atomic_t num_pending;

unsigned long sequence;

/* protects the pending list. */
Expand Down Expand Up @@ -242,7 +243,7 @@ static struct btrfs_worker_thread *next_worker(struct btrfs_workers *workers)
worker = list_entry(next, struct btrfs_worker_thread, worker_list);
atomic_inc(&worker->num_pending);
worker->sequence++;
if (worker->sequence % 4 == 0)
if (worker->sequence % workers->idle_thresh == 0)
list_move_tail(next, &workers->worker_list);
return worker;
}
Expand Down
9 changes: 8 additions & 1 deletion fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1386,7 +1386,14 @@ struct btrfs_root *open_ctree(struct super_block *sb,
* devices
*/
fs_info->submit_workers.idle_thresh = 64;
fs_info->workers.idle_thresh = 32;

/* fs_info->workers is responsible for checksumming file data
* blocks and metadata. Using a larger idle thresh allows each
* worker thread to operate on things in roughly the order they
* were sent by the writeback daemons, improving overall locality
* of the IO going down the pipe.
*/
fs_info->workers.idle_thresh = 128;

btrfs_init_workers(&fs_info->fixup_workers, "fixup", 1);
btrfs_init_workers(&fs_info->endio_workers, "endio",
Expand Down
16 changes: 12 additions & 4 deletions fs/btrfs/file-item.c
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,7 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
file_key.offset = offset;
btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY);

mutex_lock(&BTRFS_I(inode)->csum_mutex);
item = btrfs_lookup_csum(trans, root, path, objectid, offset, 1);
if (!IS_ERR(item)) {
leaf = path->nodes[0];
Expand Down Expand Up @@ -367,7 +368,7 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
ret = btrfs_search_slot(trans, root, &file_key, path,
BTRFS_CRC32_SIZE, 1);
if (ret < 0)
goto fail;
goto fail_unlock;
if (ret == 0) {
BUG();
}
Expand Down Expand Up @@ -411,10 +412,10 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
ret = btrfs_insert_empty_item(trans, root, path, &file_key,
ins_size);
if (ret < 0)
goto fail;
goto fail_unlock;
if (ret != 0) {
WARN_ON(1);
goto fail;
goto fail_unlock;
}
csum:
leaf = path->nodes[0];
Expand All @@ -427,6 +428,8 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
item_end = (struct btrfs_csum_item *)((unsigned char *)item_end +
btrfs_item_size_nr(leaf, path->slots[0]));
eb_token = NULL;
mutex_unlock(&BTRFS_I(inode)->csum_mutex);
cond_resched();
next_sector:

if (!eb_token ||
Expand Down Expand Up @@ -467,13 +470,18 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
eb_token = NULL;
}
btrfs_mark_buffer_dirty(path->nodes[0]);
cond_resched();
if (total_bytes < sums->len) {
btrfs_release_path(root, path);
goto again;
}
fail:
out:
btrfs_free_path(path);
return ret;

fail_unlock:
mutex_unlock(&BTRFS_I(inode)->csum_mutex);
goto out;
}

int btrfs_csum_truncate(struct btrfs_trans_handle *trans,
Expand Down
2 changes: 0 additions & 2 deletions fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,10 +415,8 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans,
btrfs_set_trans_block_group(trans, inode);
list_for_each(cur, list) {
sum = list_entry(cur, struct btrfs_ordered_sum, list);
mutex_lock(&BTRFS_I(inode)->csum_mutex);
btrfs_csum_file_blocks(trans, BTRFS_I(inode)->root,
inode, sum);
mutex_unlock(&BTRFS_I(inode)->csum_mutex);
}
return 0;
}
Expand Down

0 comments on commit 5386323

Please sign in to comment.