aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2009-04-03 10:32:58 -0400
committerChris Mason <chris.mason@oracle.com>2009-04-03 10:32:58 -0400
commitbedf762ba3a4b70295661fa70c29c1f18fe0f351 (patch)
treef74718485798020ba97a5fb111f4794a1c8e945e /fs
parentb765ead57da62cccf7fa21e00e6eed65e9df62b0 (diff)
Btrfs: unplug in the async bio submission threads
Btrfs pages being written get set to writeback, and then may go through a number of steps before they hit the block layer. This includes compression, checksumming and async bio submission. The end result is that someone who writes a page and then does wait_on_page_writeback is likely to unplug the queue before the bio they cared about got there. We could fix this by marking bios sync, or by doing more frequent unplugs, but this commit just changes the async bio submission code to unplug after it has processed all the bios for a device. The async bio submission does a fair job of collection bios, so this shouldn't be a huge problem for reducing merging at the elevator. For streaming O_DIRECT writes on a 5 drive array, it boosts performance from 386MB/s to 460MB/s. Thanks to Hisashi Hifumi for helping with this work. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/volumes.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index cc01abff03d9..e0913e469728 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -148,7 +148,7 @@ static noinline int run_scheduled_bios(struct btrfs_device *device)
148 unsigned long limit; 148 unsigned long limit;
149 unsigned long last_waited = 0; 149 unsigned long last_waited = 0;
150 150
151 bdi = device->bdev->bd_inode->i_mapping->backing_dev_info; 151 bdi = blk_get_backing_dev_info(device->bdev);
152 fs_info = device->dev_root->fs_info; 152 fs_info = device->dev_root->fs_info;
153 limit = btrfs_async_submit_limit(fs_info); 153 limit = btrfs_async_submit_limit(fs_info);
154 limit = limit * 2 / 3; 154 limit = limit * 2 / 3;
@@ -258,6 +258,18 @@ loop_lock:
258 if (device->pending_bios) 258 if (device->pending_bios)
259 goto loop_lock; 259 goto loop_lock;
260 spin_unlock(&device->io_lock); 260 spin_unlock(&device->io_lock);
261
262 /*
263 * IO has already been through a long path to get here. Checksumming,
264 * async helper threads, perhaps compression. We've done a pretty
265 * good job of collecting a batch of IO and should just unplug
266 * the device right away.
267 *
268 * This will help anyone who is waiting on the IO, they might have
269 * already unplugged, but managed to do so before the bio they
270 * cared about found its way down here.
271 */
272 blk_run_backing_dev(bdi, NULL);
261done: 273done:
262 return 0; 274 return 0;
263} 275}