[PATCH 0/8] xfs: AIL lock contention reduction V2

Dave Chinner
2010-11-29T01:11:23Z

This series reduces AIL locking overhead by introducing bulk operations for
insert and delete. With delayed logging, we can be doing insert operations on
thousands of items at a time, so using a bulk operation to reduce AIL lock
traffic is a major win in terms of reducing contention on the lock.

Similarly, when we have inode buffer IO completion running on multiple CPUs at
once, the AIl lock contention from each individual AIL removal is significant.
By batching all the inodes on the buffer to be removed from the AIL in a single
bulk operation, contention on the AIL is reduced by an order of magnitude.

Finally, there is a modification to the xfsaild wakeup code to prevent too many
wakeups when the xfsaild is pausing waiting for some work to complete. This
prevents an excessive number of AIL scanning traversals by the xfsaild when
tail pushing is backing off and waiting for some IO to complete.

In combination, these modification reduce AIL lock contention sufficiently
to drop the AIL lock out of the "top 10" contended locks on 8-way fs_mark
and dbench workloads.

Version 2:

- split out stale inode AIL insertion bug fix
- split bulk AIL insertion into multiple patches
- EFI/EFD handling changes
- stale inode AIL insertion bug fix
- simplify code calling xfs_ail_delete
- bulk ail insertion modifications
- use atomic_inc_return for extent recording in xfs_trans_log_efi_extent()
- modified AIL sleep code to explicitly set task state as suggested by Christoph.
- split AIL bulk deletion into two patches
- buffer iodone callback modifications
- bulk AIL deletion and inode iodone callback mods.
- removed lip parameter from xfs_buf_do_callbacks() as the loop fetches
it from the buffer anyway.
- fixed unused variable warning in xfs_buf_do_callbacks().
- added two new patches to reduce code duplication
- use AIL bulk insertion function to implement single updates
- use AIL bulk delete function to implement single deletes