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. */