aio: allocate kiocbs in batches
authorJeff Moyer <[email protected]>
Wed, 2 Nov 2011 20:40:10 +0000 (13:40 -0700)
committerLinus Torvalds <[email protected]>
Wed, 2 Nov 2011 23:07:03 +0000 (16:07 -0700)
commit080d676de095a14ecba14c0b9a91acb5bbb634df
tree4a4c56bc86a8edf4a42f8ec7c65ba795997e50ab
parent2ca02df6b098be2d33a99a65531dcd84a10b6e21
aio: allocate kiocbs in batches

In testing aio on a fast storage device, I found that the context lock
takes up a fair amount of cpu time in the I/O submission path.  The reason
is that we take it for every I/O submitted (see __aio_get_req).  Since we
know how many I/Os are passed to io_submit, we can preallocate the kiocbs
in batches, reducing the number of times we take and release the lock.

In my testing, I was able to reduce the amount of time spent in
_raw_spin_lock_irq by .56% (average of 3 runs).  The command I used to
test this was:

   aio-stress -O -o 2 -o 3 -r 8 -d 128 -b 32 -i 32 -s 16384 <dev>

I also tested the patch with various numbers of events passed to
io_submit, and I ran the xfstests aio group of tests to ensure I didn't
break anything.

Signed-off-by: Jeff Moyer <[email protected]>
Cc: Daniel Ehrenberg <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
fs/aio.c
include/linux/aio.h