Skip to content

Commit

Permalink
aio: bump i_count instead of using igrab
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Chris Mason authored and Al Viro committed Oct 26, 2010
1 parent e1455d1 commit 306fb09
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion fs/aio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1543,7 +1543,20 @@ static void aio_batch_add(struct address_space *mapping,
}

abe = mempool_alloc(abe_pool, GFP_KERNEL);
BUG_ON(!igrab(mapping->host));

/*
* we should be using igrab here, but
* we don't want to hammer on the global
* inode spinlock just to take an extra
* reference on a file that we must already
* have a reference to.
*
* When we're called, we always have a reference
* on the file, so we must always have a reference
* on the inode, so igrab must always just
* bump the count and move on.
*/
atomic_inc(&mapping->host->i_count);
abe->mapping = mapping;
hlist_add_head(&abe->list, &batch_hash[bucket]);
return;
Expand Down

0 comments on commit 306fb09

Please sign in to comment.