aboutsummaryrefslogtreecommitdiffstats
path: root/fs/aio.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2010-08-23 10:47:55 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2010-10-25 21:18:23 -0400
commit306fb0979443419288594446a348155a8027dcf2 (patch)
tree757dc3d7fa87ad693ac40860d996349dc277872b /fs/aio.c
parente1455d1bdccbe056ba53479741b1452106ce59aa (diff)
aio: bump i_count instead of using igrab
The aio batching code is using igrab to get an extra reference on the inode so it can safely batch. igrab will go ahead and take the global inode spinlock, which can be a bottleneck on large machines doing lots of AIO. In this case, igrab isn't required because we already have a reference on the file handle. It is safe to just bump the i_count directly on the inode. Benchmarking shows this patch brings IOP/s on tons of flash up by about 2.5X. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/aio.c')
-rw-r--r--fs/aio.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/fs/aio.c b/fs/aio.c
index 250b0a73c8a8..9e319a04780e 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1543,7 +1543,20 @@ static void aio_batch_add(struct address_space *mapping,
1543 } 1543 }
1544 1544
1545 abe = mempool_alloc(abe_pool, GFP_KERNEL); 1545 abe = mempool_alloc(abe_pool, GFP_KERNEL);
1546 BUG_ON(!igrab(mapping->host)); 1546
1547 /*
1548 * we should be using igrab here, but
1549 * we don't want to hammer on the global
1550 * inode spinlock just to take an extra
1551 * reference on a file that we must already
1552 * have a reference to.
1553 *
1554 * When we're called, we always have a reference
1555 * on the file, so we must always have a reference
1556 * on the inode, so igrab must always just
1557 * bump the count and move on.
1558 */
1559 atomic_inc(&mapping->host->i_count);
1547 abe->mapping = mapping; 1560 abe->mapping = mapping;
1548 hlist_add_head(&abe->list, &batch_hash[bucket]); 1561 hlist_add_head(&abe->list, &batch_hash[bucket]);
1549 return; 1562 return;