From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:47700) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UG8A2-0003E2-ND for qemu-devel@nongnu.org; Thu, 14 Mar 2013 09:25:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UG7ys-0004AD-8p for qemu-devel@nongnu.org; Thu, 14 Mar 2013 09:14:07 -0400 Received: from e39.co.us.ibm.com ([32.97.110.160]:58510) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UG7ys-00049O-0Q for qemu-devel@nongnu.org; Thu, 14 Mar 2013 09:14:02 -0400 Received: from /spool/local by e39.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 14 Mar 2013 07:13:56 -0600 Received: from d03relay02.boulder.ibm.com (d03relay02.boulder.ibm.com [9.17.195.227]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id E29471FF003E for ; Thu, 14 Mar 2013 07:08:57 -0600 (MDT) Received: from d03av06.boulder.ibm.com (d03av06.boulder.ibm.com [9.17.195.245]) by d03relay02.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r2EDD7du080224 for ; Thu, 14 Mar 2013 07:13:52 -0600 Received: from d03av06.boulder.ibm.com (loopback [127.0.0.1]) by d03av06.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r2ED7Tk8008574 for ; Thu, 14 Mar 2013 07:07:30 -0600 Date: Thu, 14 Mar 2013 14:04:50 +0100 From: Jens Freimann Message-ID: <20130314130450.GA24474@linux.vnet.ibm.com> References: <1363184055-8610-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1363184055-8610-1-git-send-email-pbonzini@redhat.com> Subject: Re: [Qemu-devel] [PATCH] dataplane: fix hang introduced by AioContext transition List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Cornelia Huck , Paolo Bonzini , dingel@linux.vnet.ibm.com, borntraeger@de.ibm.com On Wed, Mar 13, 2013 at 03:14:15PM +0100, Paolo Bonzini wrote: > The bug is that the EventNotifiers do have a NULL io_flush callback. > Because _none_ of the callbacks on the dataplane AioContext have such a > callback, aio_poll will simply do nothing. Fixed by adding the callbacks: > the ioeventfd will always be polled (this can change in the future to > pause/resume the processing during live snapshots or similar operations); > the ioqueue will be polled if there are outstanding requests. This also fixes the problem we were seeing on s390x. regards Jens > > I must admit I have screwed up my testing somehow, because commit > 2c20e71 does not work even if cherry-picked on top of 1.4.0, and this > patch fixes it there as well. > > Signed-off-by: Paolo Bonzini > --- > hw/dataplane/virtio-blk.c | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/hw/dataplane/virtio-blk.c b/hw/dataplane/virtio-blk.c > index aa9b040..24994fa 100644 > --- a/hw/dataplane/virtio-blk.c > +++ b/hw/dataplane/virtio-blk.c > @@ -261,6 +261,11 @@ static int process_request(IOQueue *ioq, struct iovec iov[], > } > } > > +static int flush_true(EventNotifier *e) > +{ > + return true; > +} > + > static void handle_notify(EventNotifier *e) > { > VirtIOBlockDataPlane *s = container_of(e, VirtIOBlockDataPlane, > @@ -340,6 +345,14 @@ static void handle_notify(EventNotifier *e) > } > } > > +static int flush_io(EventNotifier *e) > +{ > + VirtIOBlockDataPlane *s = container_of(e, VirtIOBlockDataPlane, > + io_notifier); > + > + return s->num_reqs > 0; > +} > + > static void handle_io(EventNotifier *e) > { > VirtIOBlockDataPlane *s = container_of(e, VirtIOBlockDataPlane, > @@ -470,7 +483,7 @@ void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s) > exit(1); > } > s->host_notifier = *virtio_queue_get_host_notifier(vq); > - aio_set_event_notifier(s->ctx, &s->host_notifier, handle_notify, NULL); > + aio_set_event_notifier(s->ctx, &s->host_notifier, handle_notify, flush_true); > > /* Set up ioqueue */ > ioq_init(&s->ioqueue, s->fd, REQ_MAX); > @@ -478,7 +491,7 @@ void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s) > ioq_put_iocb(&s->ioqueue, &s->requests[i].iocb); > } > s->io_notifier = *ioq_get_notifier(&s->ioqueue); > - aio_set_event_notifier(s->ctx, &s->io_notifier, handle_io, NULL); > + aio_set_event_notifier(s->ctx, &s->io_notifier, handle_io, flush_io); > > s->started = true; > trace_virtio_blk_data_plane_start(s); > -- > 1.8.1.4 > >