block: remove per-queue plugging
Code has been converted over to the new explicit on-stack plugging, and delay users have been converted to use the new API for that. So lets kill off the old plugging along with aops->sync_page(). Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
This commit is contained in:
@@ -847,7 +847,6 @@ static const struct address_space_operations btree_aops = {
|
||||
.writepages = btree_writepages,
|
||||
.releasepage = btree_releasepage,
|
||||
.invalidatepage = btree_invalidatepage,
|
||||
.sync_page = block_sync_page,
|
||||
#ifdef CONFIG_MIGRATION
|
||||
.migratepage = btree_migratepage,
|
||||
#endif
|
||||
@@ -1330,82 +1329,6 @@ static int btrfs_congested_fn(void *congested_data, int bdi_bits)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* this unplugs every device on the box, and it is only used when page
|
||||
* is null
|
||||
*/
|
||||
static void __unplug_io_fn(struct backing_dev_info *bdi, struct page *page)
|
||||
{
|
||||
struct btrfs_device *device;
|
||||
struct btrfs_fs_info *info;
|
||||
|
||||
info = (struct btrfs_fs_info *)bdi->unplug_io_data;
|
||||
list_for_each_entry(device, &info->fs_devices->devices, dev_list) {
|
||||
if (!device->bdev)
|
||||
continue;
|
||||
|
||||
bdi = blk_get_backing_dev_info(device->bdev);
|
||||
if (bdi->unplug_io_fn)
|
||||
bdi->unplug_io_fn(bdi, page);
|
||||
}
|
||||
}
|
||||
|
||||
static void btrfs_unplug_io_fn(struct backing_dev_info *bdi, struct page *page)
|
||||
{
|
||||
struct inode *inode;
|
||||
struct extent_map_tree *em_tree;
|
||||
struct extent_map *em;
|
||||
struct address_space *mapping;
|
||||
u64 offset;
|
||||
|
||||
/* the generic O_DIRECT read code does this */
|
||||
if (1 || !page) {
|
||||
__unplug_io_fn(bdi, page);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* page->mapping may change at any time. Get a consistent copy
|
||||
* and use that for everything below
|
||||
*/
|
||||
smp_mb();
|
||||
mapping = page->mapping;
|
||||
if (!mapping)
|
||||
return;
|
||||
|
||||
inode = mapping->host;
|
||||
|
||||
/*
|
||||
* don't do the expensive searching for a small number of
|
||||
* devices
|
||||
*/
|
||||
if (BTRFS_I(inode)->root->fs_info->fs_devices->open_devices <= 2) {
|
||||
__unplug_io_fn(bdi, page);
|
||||
return;
|
||||
}
|
||||
|
||||
offset = page_offset(page);
|
||||
|
||||
em_tree = &BTRFS_I(inode)->extent_tree;
|
||||
read_lock(&em_tree->lock);
|
||||
em = lookup_extent_mapping(em_tree, offset, PAGE_CACHE_SIZE);
|
||||
read_unlock(&em_tree->lock);
|
||||
if (!em) {
|
||||
__unplug_io_fn(bdi, page);
|
||||
return;
|
||||
}
|
||||
|
||||
if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
|
||||
free_extent_map(em);
|
||||
__unplug_io_fn(bdi, page);
|
||||
return;
|
||||
}
|
||||
offset = offset - em->start;
|
||||
btrfs_unplug_page(&BTRFS_I(inode)->root->fs_info->mapping_tree,
|
||||
em->block_start + offset, page);
|
||||
free_extent_map(em);
|
||||
}
|
||||
|
||||
/*
|
||||
* If this fails, caller must call bdi_destroy() to get rid of the
|
||||
* bdi again.
|
||||
@@ -1420,8 +1343,6 @@ static int setup_bdi(struct btrfs_fs_info *info, struct backing_dev_info *bdi)
|
||||
return err;
|
||||
|
||||
bdi->ra_pages = default_backing_dev_info.ra_pages;
|
||||
bdi->unplug_io_fn = btrfs_unplug_io_fn;
|
||||
bdi->unplug_io_data = info;
|
||||
bdi->congested_fn = btrfs_congested_fn;
|
||||
bdi->congested_data = info;
|
||||
return 0;
|
||||
|
@@ -7218,7 +7218,6 @@ static const struct address_space_operations btrfs_aops = {
|
||||
.writepage = btrfs_writepage,
|
||||
.writepages = btrfs_writepages,
|
||||
.readpages = btrfs_readpages,
|
||||
.sync_page = block_sync_page,
|
||||
.direct_IO = btrfs_direct_IO,
|
||||
.invalidatepage = btrfs_invalidatepage,
|
||||
.releasepage = btrfs_releasepage,
|
||||
|
@@ -162,7 +162,6 @@ static noinline int run_scheduled_bios(struct btrfs_device *device)
|
||||
struct bio *cur;
|
||||
int again = 0;
|
||||
unsigned long num_run;
|
||||
unsigned long num_sync_run;
|
||||
unsigned long batch_run = 0;
|
||||
unsigned long limit;
|
||||
unsigned long last_waited = 0;
|
||||
@@ -173,11 +172,6 @@ static noinline int run_scheduled_bios(struct btrfs_device *device)
|
||||
limit = btrfs_async_submit_limit(fs_info);
|
||||
limit = limit * 2 / 3;
|
||||
|
||||
/* we want to make sure that every time we switch from the sync
|
||||
* list to the normal list, we unplug
|
||||
*/
|
||||
num_sync_run = 0;
|
||||
|
||||
loop:
|
||||
spin_lock(&device->io_lock);
|
||||
|
||||
@@ -223,15 +217,6 @@ loop_lock:
|
||||
|
||||
spin_unlock(&device->io_lock);
|
||||
|
||||
/*
|
||||
* if we're doing the regular priority list, make sure we unplug
|
||||
* for any high prio bios we've sent down
|
||||
*/
|
||||
if (pending_bios == &device->pending_bios && num_sync_run > 0) {
|
||||
num_sync_run = 0;
|
||||
blk_run_backing_dev(bdi, NULL);
|
||||
}
|
||||
|
||||
while (pending) {
|
||||
|
||||
rmb();
|
||||
@@ -259,19 +244,11 @@ loop_lock:
|
||||
|
||||
BUG_ON(atomic_read(&cur->bi_cnt) == 0);
|
||||
|
||||
if (cur->bi_rw & REQ_SYNC)
|
||||
num_sync_run++;
|
||||
|
||||
submit_bio(cur->bi_rw, cur);
|
||||
num_run++;
|
||||
batch_run++;
|
||||
if (need_resched()) {
|
||||
if (num_sync_run) {
|
||||
blk_run_backing_dev(bdi, NULL);
|
||||
num_sync_run = 0;
|
||||
}
|
||||
if (need_resched())
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
/*
|
||||
* we made progress, there is more work to do and the bdi
|
||||
@@ -304,13 +281,8 @@ loop_lock:
|
||||
* against it before looping
|
||||
*/
|
||||
last_waited = ioc->last_waited;
|
||||
if (need_resched()) {
|
||||
if (num_sync_run) {
|
||||
blk_run_backing_dev(bdi, NULL);
|
||||
num_sync_run = 0;
|
||||
}
|
||||
if (need_resched())
|
||||
cond_resched();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
spin_lock(&device->io_lock);
|
||||
@@ -323,22 +295,6 @@ loop_lock:
|
||||
}
|
||||
}
|
||||
|
||||
if (num_sync_run) {
|
||||
num_sync_run = 0;
|
||||
blk_run_backing_dev(bdi, NULL);
|
||||
}
|
||||
/*
|
||||
* IO has already been through a long path to get here. Checksumming,
|
||||
* async helper threads, perhaps compression. We've done a pretty
|
||||
* good job of collecting a batch of IO and should just unplug
|
||||
* the device right away.
|
||||
*
|
||||
* This will help anyone who is waiting on the IO, they might have
|
||||
* already unplugged, but managed to do so before the bio they
|
||||
* cared about found its way down here.
|
||||
*/
|
||||
blk_run_backing_dev(bdi, NULL);
|
||||
|
||||
cond_resched();
|
||||
if (again)
|
||||
goto loop;
|
||||
@@ -2948,7 +2904,7 @@ static int find_live_mirror(struct map_lookup *map, int first, int num,
|
||||
static int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw,
|
||||
u64 logical, u64 *length,
|
||||
struct btrfs_multi_bio **multi_ret,
|
||||
int mirror_num, struct page *unplug_page)
|
||||
int mirror_num)
|
||||
{
|
||||
struct extent_map *em;
|
||||
struct map_lookup *map;
|
||||
@@ -2980,11 +2936,6 @@ again:
|
||||
em = lookup_extent_mapping(em_tree, logical, *length);
|
||||
read_unlock(&em_tree->lock);
|
||||
|
||||
if (!em && unplug_page) {
|
||||
kfree(multi);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!em) {
|
||||
printk(KERN_CRIT "unable to find logical %llu len %llu\n",
|
||||
(unsigned long long)logical,
|
||||
@@ -3040,13 +2991,13 @@ again:
|
||||
*length = em->len - offset;
|
||||
}
|
||||
|
||||
if (!multi_ret && !unplug_page)
|
||||
if (!multi_ret)
|
||||
goto out;
|
||||
|
||||
num_stripes = 1;
|
||||
stripe_index = 0;
|
||||
if (map->type & BTRFS_BLOCK_GROUP_RAID1) {
|
||||
if (unplug_page || (rw & REQ_WRITE))
|
||||
if (rw & REQ_WRITE)
|
||||
num_stripes = map->num_stripes;
|
||||
else if (mirror_num)
|
||||
stripe_index = mirror_num - 1;
|
||||
@@ -3068,7 +3019,7 @@ again:
|
||||
stripe_index = do_div(stripe_nr, factor);
|
||||
stripe_index *= map->sub_stripes;
|
||||
|
||||
if (unplug_page || (rw & REQ_WRITE))
|
||||
if (rw & REQ_WRITE)
|
||||
num_stripes = map->sub_stripes;
|
||||
else if (mirror_num)
|
||||
stripe_index += mirror_num - 1;
|
||||
@@ -3088,22 +3039,10 @@ again:
|
||||
BUG_ON(stripe_index >= map->num_stripes);
|
||||
|
||||
for (i = 0; i < num_stripes; i++) {
|
||||
if (unplug_page) {
|
||||
struct btrfs_device *device;
|
||||
struct backing_dev_info *bdi;
|
||||
|
||||
device = map->stripes[stripe_index].dev;
|
||||
if (device->bdev) {
|
||||
bdi = blk_get_backing_dev_info(device->bdev);
|
||||
if (bdi->unplug_io_fn)
|
||||
bdi->unplug_io_fn(bdi, unplug_page);
|
||||
}
|
||||
} else {
|
||||
multi->stripes[i].physical =
|
||||
map->stripes[stripe_index].physical +
|
||||
stripe_offset + stripe_nr * map->stripe_len;
|
||||
multi->stripes[i].dev = map->stripes[stripe_index].dev;
|
||||
}
|
||||
multi->stripes[i].physical =
|
||||
map->stripes[stripe_index].physical +
|
||||
stripe_offset + stripe_nr * map->stripe_len;
|
||||
multi->stripes[i].dev = map->stripes[stripe_index].dev;
|
||||
stripe_index++;
|
||||
}
|
||||
if (multi_ret) {
|
||||
@@ -3121,7 +3060,7 @@ int btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw,
|
||||
struct btrfs_multi_bio **multi_ret, int mirror_num)
|
||||
{
|
||||
return __btrfs_map_block(map_tree, rw, logical, length, multi_ret,
|
||||
mirror_num, NULL);
|
||||
mirror_num);
|
||||
}
|
||||
|
||||
int btrfs_rmap_block(struct btrfs_mapping_tree *map_tree,
|
||||
@@ -3189,14 +3128,6 @@ int btrfs_rmap_block(struct btrfs_mapping_tree *map_tree,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int btrfs_unplug_page(struct btrfs_mapping_tree *map_tree,
|
||||
u64 logical, struct page *page)
|
||||
{
|
||||
u64 length = PAGE_CACHE_SIZE;
|
||||
return __btrfs_map_block(map_tree, READ, logical, &length,
|
||||
NULL, 0, page);
|
||||
}
|
||||
|
||||
static void end_bio_multi_stripe(struct bio *bio, int err)
|
||||
{
|
||||
struct btrfs_multi_bio *multi = bio->bi_private;
|
||||
|
Reference in New Issue
Block a user