[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>
This commit is contained in:
parent
644d3a088a
commit
954d3e9536
12
fs/aio.c
12
fs/aio.c
@ -1514,10 +1514,14 @@ int fastcall io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
|
|||||||
goto out_put_req;
|
goto out_put_req;
|
||||||
|
|
||||||
spin_lock_irq(&ctx->ctx_lock);
|
spin_lock_irq(&ctx->ctx_lock);
|
||||||
list_add_tail(&req->ki_run_list, &ctx->run_list);
|
if (likely(list_empty(&ctx->run_list))) {
|
||||||
/* drain the run list */
|
aio_run_iocb(req);
|
||||||
while (__aio_run_iocbs(ctx))
|
} 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);
|
spin_unlock_irq(&ctx->ctx_lock);
|
||||||
aio_put_req(req); /* drop extra ref to req */
|
aio_put_req(req); /* drop extra ref to req */
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user