diff options
author | 2005-05-01 08:59:16 -0700 | |
---|---|---|
committer | 2005-05-01 08:59:16 -0700 | |
commit | 954d3e95369cf73b4bc1e570729f68264a0e6fe0 (patch) | |
tree | 542c6435428848f02a0eb060a83b3dd1a7f90083 /fs/aio.c | |
parent | [PATCH] aio: clean up debug code (diff) | |
download | linux-954d3e95369cf73b4bc1e570729f68264a0e6fe0.tar.gz linux-954d3e95369cf73b4bc1e570729f68264a0e6fe0.tar.bz2 linux-954d3e95369cf73b4bc1e570729f68264a0e6fe0.zip |
[PATCH] aio: optimize io_submit_one()
This patch optimizes io_submit_one to call aio_run_iocb() directly if
ctx->run_list is empty. When the list is empty, the operation of adding to
the list, then call to __aio_run_iocbs() is unnecessary because these
operations are done in one atomic step. ctx->run_list always has only one
element in this case. This optimization speeds up industry standard db
transaction processing benchmark by 0.2%.
Signed-off-by: Ken Chen <kenneth.w.chen@intel.com>
Cc: Benjamin LaHaise <bcrl@kvack.org>
Cc: Suparna Bhattacharya <suparna@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/aio.c')
-rw-r--r-- | fs/aio.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -1514,10 +1514,14 @@ int fastcall io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, goto out_put_req; spin_lock_irq(&ctx->ctx_lock); - list_add_tail(&req->ki_run_list, &ctx->run_list); - /* drain the run list */ - while (__aio_run_iocbs(ctx)) - ; + if (likely(list_empty(&ctx->run_list))) { + aio_run_iocb(req); + } else { + list_add_tail(&req->ki_run_list, &ctx->run_list); + /* drain the run list */ + while (__aio_run_iocbs(ctx)) + ; + } spin_unlock_irq(&ctx->ctx_lock); aio_put_req(req); /* drop extra ref to req */ return 0; |