xfs: use a cursor for bulk AIL insertion
authorDave Chinner <dchinner@redhat.com>
Mon, 18 Jul 2011 03:40:16 +0000 (03:40 +0000)
committerAlex Elder <aelder@sgi.com>
Wed, 20 Jul 2011 23:37:20 +0000 (18:37 -0500)
commit1d8c95a363bf8cd4d4182dd19c01693b635311c2
tree839d26eb6a1f6814c687e2c6855feb377b74c0f9
parentad1a2c878ca70829874b4fcc83223cccb4e26dab
xfs: use a cursor for bulk AIL insertion

Delayed logging can insert tens of thousands of log items into the
AIL at the same LSN. When the committing of log commit records
occur, we can get insertions occurring at an LSN that is not at the
end of the AIL. If there are thousands of items in the AIL on the
tail LSN, each insertion has to walk the AIL to find the correct
place to insert the new item into the AIL. This can consume large
amounts of CPU time and block other operations from occurring while
the traversals are in progress.

To avoid this repeated walk, use a AIL cursor to record
where we should be inserting the new items into the AIL without
having to repeat the walk. The cursor infrastructure already
provides this functionality for push walks, so is a simple extension
of existing code. While this will not avoid the initial walk, it
will avoid repeating it tens of thousands of times during a single
checkpoint commit.

This version includes logic improvements from Christoph Hellwig.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Alex Elder <aelder@sgi.com>
fs/xfs/xfs_trans.c
fs/xfs/xfs_trans_ail.c
fs/xfs/xfs_trans_priv.h