[PATCH] aio: optimize io_submit_one()
Ken Chen [Sun, 1 May 2005 15:59:16 +0000 (08:59 -0700)]
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>

fs/aio.c

index 674bb47..7afa222 100644 (file)
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -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;