xfs: only run xfs_error_test if error injection is active
authorDave Chinner <dchinner@redhat.com>
Tue, 30 Nov 2010 04:15:31 +0000 (15:15 +1100)
committerAlex Elder <aelder@sgi.com>
Wed, 1 Dec 2010 13:40:20 +0000 (07:40 -0600)
commitc76febef574fd86566bbdf1a73a547a439115c25
treebdfb67e30f7c55f54413c2bee79049bbbefff805
parentde25c1818c44f580ff556cb9e0f7a1c687ed870b
xfs: only run xfs_error_test if error injection is active

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>
fs/xfs/xfs_error.c
fs/xfs/xfs_error.h