[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] qemu_aio_poll optimize
From: |
Wei Kong |
Subject: |
[Qemu-devel] [PATCH] qemu_aio_poll optimize |
Date: |
Fri, 12 Sep 2008 04:12:28 -0600 |
qemu_aio_poll() exhaust 50% cpu utilization rate in whole qemu running,
due to it scan RawAIOCB chain list loop and loop, especially when
these RawAIOCB are still in EINPROGRESS at IO flood.
This tune will reduce 2.2% ~ 2.5% total cpu utilization rate,
qemu_aio_poll() will exhaust 5% cpu in whole qemu running
and a little increase the IO through.
Signed-off-by: Wei Kong <address@hidden>
---
--- a/block-raw-posix.c
+++ b/block-raw-posix.c
@@ -289,40 +289,36 @@ void qemu_aio_poll(void)
RawAIOCB *acb, **pacb;
int ret;
+ pacb = &first_aio;
for(;;) {
- pacb = &first_aio;
- for(;;) {
- acb = *pacb;
- if (!acb)
- goto the_end;
- ret = aio_error(&acb->aiocb);
- if (ret == ECANCELED) {
- /* remove the request */
- *pacb = acb->next;
- qemu_aio_release(acb);
- } else if (ret != EINPROGRESS) {
- /* end of aio */
- if (ret == 0) {
- ret = aio_return(&acb->aiocb);
- if (ret == acb->aiocb.aio_nbytes)
- ret = 0;
- else
- ret = -EINVAL;
- } else {
- ret = -ret;
- }
- /* remove the request */
- *pacb = acb->next;
- /* call the callback */
- acb->common.cb(acb->common.opaque, ret);
- qemu_aio_release(acb);
- break;
+ acb = *pacb;
+ if (!acb)
+ break;
+ ret = aio_error(&acb->aiocb);
+ if (ret == EINPROGRESS) {
+ break;
+ } else if (ret != ECANCELED) {
+ /* end of aio */
+ if (ret == 0) {
+ ret = aio_return(&acb->aiocb);
+ if (ret == acb->aiocb.aio_nbytes)
+ ret = 0;
+ else
+ ret = -EINVAL;
} else {
- pacb = &acb->next;
+ ret = -ret;
}
- }
+ /* remove the request */
+ *pacb = acb->next;
+ /* call the callback */
+ acb->common.cb(acb->common.opaque, ret);
+ qemu_aio_release(acb);
+ } else {
+ /* remove the request */
+ *pacb = acb->next;
+ qemu_aio_release(acb);
+ }
}
- the_end: ;
}
/* Wait for all IO requests to complete. */
- [Qemu-devel] [PATCH] qemu_aio_poll optimize,
Wei Kong <=