c76febef57
Recent tests writing lots of small files showed the flusher thread being CPU bound and taking a long time to do allocations on a debug kernel. perf showed this as the prime reason: samples pcnt function DSO _______ _____ ___________________________ _________________ 224648.00 36.8% xfs_error_test [kernel.kallsyms] 86045.00 14.1% xfs_btree_check_sblock [kernel.kallsyms] 39778.00 6.5% prandom32 [kernel.kallsyms] 37436.00 6.1% xfs_btree_increment [kernel.kallsyms] 29278.00 4.8% xfs_btree_get_rec [kernel.kallsyms] 27717.00 4.5% random32 [kernel.kallsyms] Walking btree blocks during allocation checking them requires each block (a cache hit, so no I/O) call xfs_error_test(), which then does a random32() call as the first operation. IOWs, ~50% of the CPU is being consumed just testing whether we need to inject an error, even though error injection is not active. Kill this overhead when error injection is not active by adding a global counter of active error traps and only calling into xfs_error_test when fault injection is active. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> |
||
---|---|---|
.. | ||
linux-2.6 | ||
quota | ||
support | ||
Kconfig | ||
Makefile | ||
xfs.h | ||
xfs_acl.h | ||
xfs_ag.h | ||
xfs_alloc.c | ||
xfs_alloc.h | ||
xfs_alloc_btree.c | ||
xfs_alloc_btree.h | ||
xfs_arch.h | ||
xfs_attr.c | ||
xfs_attr.h | ||
xfs_attr_leaf.c | ||
xfs_attr_leaf.h | ||
xfs_attr_sf.h | ||
xfs_bit.c | ||
xfs_bit.h | ||
xfs_bmap.c | ||
xfs_bmap.h | ||
xfs_bmap_btree.c | ||
xfs_bmap_btree.h | ||
xfs_btree.c | ||
xfs_btree.h | ||
xfs_btree_trace.c | ||
xfs_btree_trace.h | ||
xfs_buf_item.c | ||
xfs_buf_item.h | ||
xfs_da_btree.c | ||
xfs_da_btree.h | ||
xfs_dfrag.c | ||
xfs_dfrag.h | ||
xfs_dinode.h | ||
xfs_dir2.c | ||
xfs_dir2.h | ||
xfs_dir2_block.c | ||
xfs_dir2_block.h | ||
xfs_dir2_data.c | ||
xfs_dir2_data.h | ||
xfs_dir2_leaf.c | ||
xfs_dir2_leaf.h | ||
xfs_dir2_node.c | ||
xfs_dir2_node.h | ||
xfs_dir2_sf.c | ||
xfs_dir2_sf.h | ||
xfs_error.c | ||
xfs_error.h | ||
xfs_extfree_item.c | ||
xfs_extfree_item.h | ||
xfs_filestream.c | ||
xfs_filestream.h | ||
xfs_fs.h | ||
xfs_fsops.c | ||
xfs_fsops.h | ||
xfs_ialloc.c | ||
xfs_ialloc.h | ||
xfs_ialloc_btree.c | ||
xfs_ialloc_btree.h | ||
xfs_iget.c | ||
xfs_inode.c | ||
xfs_inode.h | ||
xfs_inode_item.c | ||
xfs_inode_item.h | ||
xfs_inum.h | ||
xfs_iomap.c | ||
xfs_iomap.h | ||
xfs_itable.c | ||
xfs_itable.h | ||
xfs_log.c | ||
xfs_log.h | ||
xfs_log_cil.c | ||
xfs_log_priv.h | ||
xfs_log_recover.c | ||
xfs_log_recover.h | ||
xfs_mount.c | ||
xfs_mount.h | ||
xfs_mru_cache.c | ||
xfs_mru_cache.h | ||
xfs_quota.h | ||
xfs_rename.c | ||
xfs_rtalloc.c | ||
xfs_rtalloc.h | ||
xfs_rw.c | ||
xfs_rw.h | ||
xfs_sb.h | ||
xfs_trans.c | ||
xfs_trans.h | ||
xfs_trans_ail.c | ||
xfs_trans_buf.c | ||
xfs_trans_extfree.c | ||
xfs_trans_inode.c | ||
xfs_trans_priv.h | ||
xfs_trans_space.h | ||
xfs_types.h | ||
xfs_utils.c | ||
xfs_utils.h | ||
xfs_vnodeops.c | ||
xfs_vnodeops.h |