• David Sterba's avatar
    Revert "btrfs: balance dirty metadata pages in btrfs_finish_ordered_io" · 77b7aad1
    David Sterba authored
    This reverts commit e73e81b6.
    
    This patch causes a few problems:
    
    - adds latency to btrfs_finish_ordered_io
    - as btrfs_finish_ordered_io is used for free space cache, generating
      more work from btrfs_btree_balance_dirty_nodelay could end up in the
      same workque, effectively deadlocking
    
    12260 kworker/u96:16+btrfs-freespace-write D
    [<0>] balance_dirty_pages+0x6e6/0x7ad
    [<0>] balance_dirty_pages_ratelimited+0x6bb/0xa90
    [<0>] btrfs_finish_ordered_io+0x3da/0x770
    [<0>] normal_work_helper+0x1c5/0x5a0
    [<0>] process_one_work+0x1ee/0x5a0
    [<0>] worker_thread+0x46/0x3d0
    [<0>] kthread+0xf5/0x130
    [<0>] ret_from_fork+0x24/0x30
    [<0>] 0xffffffffffffffff
    
    Transaction commit will wait on the freespace cache:
    
    838 btrfs-transacti D
    [<0>] btrfs_start_ordered_extent+0x154/0x1e0
    [<0>] btrfs_wait_ordered_range+0xbd/0x110
    [<0>] __btrfs_wait_cache_io+0x49/0x1a0
    [<0>] btrfs_write_dirty_block_groups+0x10b/0x3b0
    [<0>] commit_cowonly_roots+0x215/0x2b0
    [<0>] btrfs_commit_transaction+0x37e/0x910
    [<0>] transaction_kthread+0x14d/0x180
    [<0>] kthread+0xf5/0x130
    [<0>] ret_from_fork+0x24/0x30
    [<0>] 0xffffffffffffffff
    
    And then writepages ends up waiting on transaction commit:
    
    9520 kworker/u96:13+flush-btrfs-1 D
    [<0>] wait_current_trans+0xac/0xe0
    [<0>] start_transaction+0x21b/0x4b0
    [<0>] cow_file_range_inline+0x10b/0x6b0
    [<0>] cow_file_range.isra.69+0x329/0x4a0
    [<0>] run_delalloc_range+0x105/0x3c0
    [<0>] writepage_delalloc+0x119/0x180
    [<0>] __extent_writepage+0x10c/0x390
    [<0>] extent_write_cache_pages+0x26f/0x3d0
    [<0>] extent_writepages+0x4f/0x80
    [<0>] do_writepages+0x17/0x60
    [<0>] __writeback_single_inode+0x59/0x690
    [<0>] writeback_sb_inodes+0x291/0x4e0
    [<0>] __writeback_inodes_wb+0x87/0xb0
    [<0>] wb_writeback+0x3bb/0x500
    [<0>] wb_workfn+0x40d/0x610
    [<0>] process_one_work+0x1ee/0x5a0
    [<0>] worker_thread+0x1e0/0x3d0
    [<0>] kthread+0xf5/0x130
    [<0>] ret_from_fork+0x24/0x30
    [<0>] 0xffffffffffffffff
    
    Eventually, we have every process in the system waiting on
    balance_dirty_pages(), and nobody is able to make progress on page
    writeback.
    
    The original patch tried to fix an OOM condition, that happened on 4.4 but no
    success reproducing that on later kernels (4.19 and 4.20). This is more likely
    a problem in OOM itself.
    
    Link: https://lore.kernel.org/linux-btrfs/20180528054821.9092-1-ethanlien@synology.com/Reported-by: default avatarChris Mason <clm@fb.com>
    CC: stable@vger.kernel.org # 4.18+
    CC: ethanlien <ethanlien@synology.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    77b7aad1
inode.c 292 KB