From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45589) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aoAFy-00013b-4r for qemu-devel@nongnu.org; Thu, 07 Apr 2016 09:45:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aoAFu-0006UL-GG for qemu-devel@nongnu.org; Thu, 07 Apr 2016 09:45:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35736) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aoAFu-0006UH-AQ for qemu-devel@nongnu.org; Thu, 07 Apr 2016 09:45:54 -0400 Date: Thu, 7 Apr 2016 14:45:50 +0100 From: "Daniel P. Berrange" Message-ID: <20160407134550.GG19932@redhat.com> References: <1460029495-7146-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1460029495-7146-1-git-send-email-pbonzini@redhat.com> Subject: Re: [Qemu-devel] [PATCH] nbd: do not hang nbd_wr_syncv if outside a coroutine and no available data Reply-To: "Daniel P. Berrange" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: xiecl.fnst@cn.fujitsu.com, qemu-devel@nongnu.org On Thu, Apr 07, 2016 at 01:44:55PM +0200, Paolo Bonzini wrote: > Until commit 1c778ef7 ("nbd: convert to using I/O channels for actual > socket I/O", 2016-02-16), nbd_wr_sync returned -EAGAIN this scenario. > nbd_reply_ready required these semantics because it has two conflicting > requirements: > > 1) if a reply can be received on the socket, nbd_reply_ready needs > to read the header outside coroutine context to identify _which_ > coroutine to enter to process the rest of the reply > > 2) on the other hand, nbd_reply_ready can find a false positive if > another thread (e.g. a VCPU thread running aio_poll) sneaks in and > calls nbd_reply_ready too. In this case nbd_reply_ready does nothing > and expects nbd_wr_syncv to return -EAGAIN. > > Currently, the solution to the first requirement is to wait in the very > rare case of a read() that doesn't retrieve the reply header in its > entirety; this is what nbd_wr_syncv does by calling qio_channel_wait(). > However, the unconditional call to qio_channel_wait() breaks the second > requirement. To fix this, the patch makes nbd_wr_syncv return -EAGAIN > if done is zero, similar to the code before commit 1c778ef7. > > This is okay because NBD client-side negotiation is the only other case > that calls nbd_wr_syncv outside a coroutine, and it places the socket > in blocking mode. On the other hand, it is a bit unpleasant to put > this in nbd_wr_syncv(), because the function is used by both client > and server. > > The full fix would be to add a counter to NbdClientSession for how > many bytes have been filled in s->reply. Then a reply can be filled > by multiple separate invocations of nbd_reply_ready and the > qio_channel_wait() call can be removed completely. Something to > consider for 2.7... > > Reported-by: Changlong Xie > Cc: Daniel P. Berrange > Signed-off-by: Paolo Bonzini > --- > nbd/common.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) Reviewed-by: Daniel P. berrange Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|