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 16b3537f31d4842af040d5ed70bcb316f16adc12..bc1b6a0337003a95d13866e51fcb046128ab1a6d 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 09407384e996e8ef765ec0a038ccd33214cf2853..2b18b0c379c1bdd9689e25693eeaf7e59894fac1 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 9f26c576911fecc72dbe7944a7f0e5c58d50c315..763d04b4e5b74f7b754b9c24d1cfd63efdf46fe2 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;