diff options
| author | Christoph Hellwig <hch@infradead.org> | 2011-04-21 18:19:44 -0600 | 
|---|---|---|
| committer | Wu Fengguang <fengguang.wu@intel.com> | 2011-06-08 08:25:21 +0800 | 
| commit | f758eeabeb96f878c860e8f110f94ec8820822a9 (patch) | |
| tree | fea5a465aa0aa38c6c9263eb264acbeb7f722c02 /mm/filemap.c | |
| parent | 424b351fe1901fc909fd0ca4f21dab58f24c1aac (diff) | |
| download | olio-linux-3.10-f758eeabeb96f878c860e8f110f94ec8820822a9.tar.xz olio-linux-3.10-f758eeabeb96f878c860e8f110f94ec8820822a9.zip  | |
writeback: split inode_wb_list_lock into bdi_writeback.list_lock
Split the global inode_wb_list_lock into a per-bdi_writeback list_lock,
as it's currently the most contended lock in the system for metadata
heavy workloads.  It won't help for single-filesystem workloads for
which we'll need the I/O-less balance_dirty_pages, but at least we
can dedicate a cpu to spinning on each bdi now for larger systems.
Based on earlier patches from Nick Piggin and Dave Chinner.
It reduces lock contentions to 1/4 in this test case:
10 HDD JBOD, 100 dd on each disk, XFS, 6GB ram
lock_stat version 0.3
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                              class name    con-bounces    contentions   waittime-min   waittime-max waittime-total    acq-bounces   acquisitions   holdtime-min   holdtime-max holdtime-total
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
vanilla 2.6.39-rc3:
                      inode_wb_list_lock:         42590          44433           0.12         147.74      144127.35         252274         886792           0.08         121.34      917211.23
                      ------------------
                      inode_wb_list_lock              2          [<ffffffff81165da5>] bdev_inode_switch_bdi+0x29/0x85
                      inode_wb_list_lock             34          [<ffffffff8115bd0b>] inode_wb_list_del+0x22/0x49
                      inode_wb_list_lock          12893          [<ffffffff8115bb53>] __mark_inode_dirty+0x170/0x1d0
                      inode_wb_list_lock          10702          [<ffffffff8115afef>] writeback_single_inode+0x16d/0x20a
                      ------------------
                      inode_wb_list_lock              2          [<ffffffff81165da5>] bdev_inode_switch_bdi+0x29/0x85
                      inode_wb_list_lock             19          [<ffffffff8115bd0b>] inode_wb_list_del+0x22/0x49
                      inode_wb_list_lock           5550          [<ffffffff8115bb53>] __mark_inode_dirty+0x170/0x1d0
                      inode_wb_list_lock           8511          [<ffffffff8115b4ad>] writeback_sb_inodes+0x10f/0x157
2.6.39-rc3 + patch:
                &(&wb->list_lock)->rlock:         11383          11657           0.14         151.69       40429.51          90825         527918           0.11         145.90      556843.37
                ------------------------
                &(&wb->list_lock)->rlock             10          [<ffffffff8115b189>] inode_wb_list_del+0x5f/0x86
                &(&wb->list_lock)->rlock           1493          [<ffffffff8115b1ed>] writeback_inodes_wb+0x3d/0x150
                &(&wb->list_lock)->rlock           3652          [<ffffffff8115a8e9>] writeback_sb_inodes+0x123/0x16f
                &(&wb->list_lock)->rlock           1412          [<ffffffff8115a38e>] writeback_single_inode+0x17f/0x223
                ------------------------
                &(&wb->list_lock)->rlock              3          [<ffffffff8110b5af>] bdi_lock_two+0x46/0x4b
                &(&wb->list_lock)->rlock              6          [<ffffffff8115b189>] inode_wb_list_del+0x5f/0x86
                &(&wb->list_lock)->rlock           2061          [<ffffffff8115af97>] __mark_inode_dirty+0x173/0x1cf
                &(&wb->list_lock)->rlock           2629          [<ffffffff8115a8e9>] writeback_sb_inodes+0x123/0x16f
hughd@google.com: fix recursive lock when bdi_lock_two() is called with new the same as old
akpm@linux-foundation.org: cleanup bdev_inode_switch_bdi() comment
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
Diffstat (limited to 'mm/filemap.c')
| -rw-r--r-- | mm/filemap.c | 6 | 
1 files changed, 3 insertions, 3 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index d7b10578a64..1e492c3dd6f 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -81,7 +81,7 @@   *  ->i_mutex   *    ->i_alloc_sem             (various)   * - *  inode_wb_list_lock + *  bdi->wb.list_lock   *    sb_lock			(fs/fs-writeback.c)   *    ->mapping->tree_lock	(__sync_single_inode)   * @@ -99,9 +99,9 @@   *    ->zone.lru_lock		(check_pte_range->isolate_lru_page)   *    ->private_lock		(page_remove_rmap->set_page_dirty)   *    ->tree_lock		(page_remove_rmap->set_page_dirty) - *    inode_wb_list_lock	(page_remove_rmap->set_page_dirty) + *    bdi.wb->list_lock		(page_remove_rmap->set_page_dirty)   *    ->inode->i_lock		(page_remove_rmap->set_page_dirty) - *    inode_wb_list_lock	(zap_pte_range->set_page_dirty) + *    bdi.wb->list_lock		(zap_pte_range->set_page_dirty)   *    ->inode->i_lock		(zap_pte_range->set_page_dirty)   *    ->private_lock		(zap_pte_range->__set_page_dirty_buffers)   *  |