qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Re: [Qemu-devel] [PATCH] qemu_aio_poll optimize


From: Wei Kong
Subject: Re: Re: [Qemu-devel] [PATCH] qemu_aio_poll optimize
Date: Mon, 15 Sep 2008 02:16:40 -0600

I will test the latest QEMU later.

--Best Regards
Kong Wei

>>> Anthony Liguori <address@hidden> 08/09/12  21:58 >>>
> 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.
>   

Have you tested this with the very latest QEMU SVN?  The recent change 
(yesterday) makes it so that qemu_aio_poll is not called in every CPU 
iteration.

Regards,

Anthony Liguori

> 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]