OSDN Git Service

Btrfs: remove nr_async_bios
authorLiu Bo <bo.li.liu@oracle.com>
Thu, 7 Sep 2017 17:22:20 +0000 (11:22 -0600)
committerDavid Sterba <dsterba@suse.com>
Mon, 30 Oct 2017 11:27:59 +0000 (12:27 +0100)
This was intended to congest higher layers to not send bios, but as

1) the congested bit has been taken by writeback

Async bios come from buffered writes and DIO writes.

For DIO writes, we want to submit them ASAP, while for buffered writes,
writeback uses balance_dirty_pages() to throttle how much dirty pages we
can have.

2) and no one is waiting for %nr_async_bios down to zero,

Historically, it was introduced along with changes which let
checksumming workload spread accross different cpus.  And at that time,
pdflush was used instead of per-bdi flushing, perhaps pdflush did not
have the necessary information for writeback to do throttling.

We can safely remove them now.

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
[ additional explanation from mails, removed unused variable 'limit' ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ctree.h
fs/btrfs/disk-io.c
fs/btrfs/volumes.c

index 16b3537..bc1b6a0 100644 (file)
@@ -880,7 +880,6 @@ struct btrfs_fs_info {
 
        atomic_t nr_async_submits;
        atomic_t async_submit_draining;
-       atomic_t nr_async_bios;
        atomic_t async_delalloc_pages;
        atomic_t open_ioctl_trans;
 
index 0940738..2b18b0c 100644 (file)
@@ -2518,7 +2518,6 @@ int open_ctree(struct super_block *sb,
        atomic_set(&fs_info->nr_async_submits, 0);
        atomic_set(&fs_info->async_delalloc_pages, 0);
        atomic_set(&fs_info->async_submit_draining, 0);
-       atomic_set(&fs_info->nr_async_bios, 0);
        atomic_set(&fs_info->defrag_running, 0);
        atomic_set(&fs_info->qgroup_op_seq, 0);
        atomic_set(&fs_info->reada_works_cnt, 0);
index 9f26c57..763d04b 100644 (file)
@@ -360,7 +360,6 @@ static noinline void run_scheduled_bios(struct btrfs_device *device)
        int again = 0;
        unsigned long num_run;
        unsigned long batch_run = 0;
-       unsigned long limit;
        unsigned long last_waited = 0;
        int force_reg = 0;
        int sync_pending = 0;
@@ -375,8 +374,6 @@ static noinline void run_scheduled_bios(struct btrfs_device *device)
        blk_start_plug(&plug);
 
        bdi = device->bdev->bd_bdi;
-       limit = btrfs_async_submit_limit(fs_info);
-       limit = limit * 2 / 3;
 
 loop:
        spin_lock(&device->io_lock);
@@ -443,13 +440,6 @@ loop_lock:
                pending = pending->bi_next;
                cur->bi_next = NULL;
 
-               /*
-                * atomic_dec_return implies a barrier for waitqueue_active
-                */
-               if (atomic_dec_return(&fs_info->nr_async_bios) < limit &&
-                   waitqueue_active(&fs_info->async_submit_wait))
-                       wake_up(&fs_info->async_submit_wait);
-
                BUG_ON(atomic_read(&cur->__bi_cnt) == 0);
 
                /*
@@ -6075,13 +6065,6 @@ static noinline void btrfs_schedule_bio(struct btrfs_device *device,
                return;
        }
 
-       /*
-        * nr_async_bios allows us to reliably return congestion to the
-        * higher layers.  Otherwise, the async bio makes it appear we have
-        * made progress against dirty pages when we've really just put it
-        * on a queue for later
-        */
-       atomic_inc(&fs_info->nr_async_bios);
        WARN_ON(bio->bi_next);
        bio->bi_next = NULL;