From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:36264) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sm2rX-0002WL-P8 for qemu-devel@nongnu.org; Tue, 03 Jul 2012 09:09:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Sm2rQ-00057P-Sq for qemu-devel@nongnu.org; Tue, 03 Jul 2012 09:09:51 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41812) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sm2rQ-00056p-Kf for qemu-devel@nongnu.org; Tue, 03 Jul 2012 09:09:44 -0400 Message-ID: <4FF2EF0E.2030802@redhat.com> Date: Tue, 03 Jul 2012 15:09:34 +0200 From: Kevin Wolf MIME-Version: 1.0 References: <1340749583-5292-1-git-send-email-morita.kazutaka@lab.ntt.co.jp> <1340749583-5292-3-git-send-email-morita.kazutaka@lab.ntt.co.jp> In-Reply-To: <1340749583-5292-3-git-send-email-morita.kazutaka@lab.ntt.co.jp> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 2/6] sheepdog: restart I/O when socket becomes ready in do_co_req() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: MORITA Kazutaka Cc: Paolo Bonzini , qemu-devel@nongnu.org Am 27.06.2012 00:26, schrieb MORITA Kazutaka: > Currently, no one reenters the yielded coroutine. This fixes it. > > Signed-off-by: MORITA Kazutaka > --- > 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; > } >