qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 2/6] sheepdog: restart I/O when socket becomes r


From: Kevin Wolf
Subject: Re: [Qemu-devel] [PATCH 2/6] sheepdog: restart I/O when socket becomes ready in do_co_req()
Date: Tue, 03 Jul 2012 15:09:34 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120605 Thunderbird/13.0

Am 27.06.2012 00:26, schrieb MORITA Kazutaka:
> Currently, no one reenters the yielded coroutine.  This fixes it.
> 
> Signed-off-by: MORITA Kazutaka <address@hidden>
> ---
>  block/sheepdog.c |   14 ++++++++++++++
>  1 files changed, 14 insertions(+), 0 deletions(-)

Paolo, is this how qemu_co_recv/send are supposed to be used? Shouldn't
the functions take care of reentering the coroutine like the block
functions do?

Kevin

> 
> diff --git a/block/sheepdog.c b/block/sheepdog.c
> index afd06aa..0b49c6d 100644
> --- a/block/sheepdog.c
> +++ b/block/sheepdog.c
> @@ -577,10 +577,21 @@ out:
>      return ret;
>  }
>  
> +static void restart_co_req(void *opaque)
> +{
> +    Coroutine *co = opaque;
> +
> +    qemu_coroutine_enter(co, NULL);
> +}
> +
>  static coroutine_fn int do_co_req(int sockfd, SheepdogReq *hdr, void *data,
>                                    unsigned int *wlen, unsigned int *rlen)
>  {
>      int ret;
> +    Coroutine *co;
> +
> +    co = qemu_coroutine_self();
> +    qemu_aio_set_fd_handler(sockfd, NULL, restart_co_req, NULL, co);
>  
>      socket_set_block(sockfd);
>      ret = send_co_req(sockfd, hdr, data, wlen);
> @@ -588,6 +599,8 @@ static coroutine_fn int do_co_req(int sockfd, SheepdogReq 
> *hdr, void *data,
>          goto out;
>      }
>  
> +    qemu_aio_set_fd_handler(sockfd, restart_co_req, NULL, NULL, co);
> +
>      ret = qemu_co_recv(sockfd, hdr, sizeof(*hdr));
>      if (ret < sizeof(*hdr)) {
>          error_report("failed to get a rsp, %s", strerror(errno));
> @@ -609,6 +622,7 @@ static coroutine_fn int do_co_req(int sockfd, SheepdogReq 
> *hdr, void *data,
>      }
>      ret = 0;
>  out:
> +    qemu_aio_set_fd_handler(sockfd, NULL, NULL, NULL, NULL);
>      socket_set_nonblock(sockfd);
>      return ret;
>  }
> 





reply via email to

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