qemu-devel
[Top][All Lists]
Advanced

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]