xfs: introduce an allocation workqueue
authorDave Chinner <dchinner@redhat.com>
Thu, 22 Mar 2012 05:15:07 +0000 (05:15 +0000)
committerBen Myers <bpm@sgi.com>
Thu, 22 Mar 2012 21:12:24 +0000 (16:12 -0500)
commitc999a223c2f0d31c64ef7379814cea1378b2b800
treeed699c3c98075bbfc4aed0ab22bd174e65e575a8
parent1a1d772433d42aaff7315b3468fef5951604f5c6
xfs: introduce an allocation workqueue

We currently have significant issues with the amount of stack that
allocation in XFS uses, especially in the writeback path. We can
easily consume 4k of stack between mapping the page, manipulating
the bmap btree and allocating blocks from the free list. Not to
mention btree block readahead and other functionality that issues IO
in the allocation path.

As a result, we can no longer fit allocation in the writeback path
in the stack space provided on x86_64. To alleviate this problem,
introduce an allocation workqueue and move all allocations to a
seperate context. This can be easily added as an interposing layer
into xfs_alloc_vextent(), which takes a single argument structure
and does not return until the allocation is complete or has failed.

To do this, add a work structure and a completion to the allocation
args structure. This allows xfs_alloc_vextent to queue the args onto
the workqueue and wait for it to be completed by the worker. This
can be done completely transparently to the caller.

The worker function needs to ensure that it sets and clears the
PF_TRANS flag appropriately as it is being run in an active
transaction context. Work can also be queued in a memory reclaim
context, so a rescuer is needed for the workqueue.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Ben Myers <bpm@sgi.com>
fs/xfs/xfs_alloc.c
fs/xfs/xfs_alloc.h
fs/xfs/xfs_super.c