From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55982) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V5Dp0-0006MG-5a for qemu-devel@nongnu.org; Fri, 02 Aug 2013 07:47:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V5Dou-0003QC-5e for qemu-devel@nongnu.org; Fri, 02 Aug 2013 07:47:02 -0400 Received: from mx1.redhat.com ([209.132.183.28]:11166) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V5Dot-0003Q3-Ub for qemu-devel@nongnu.org; Fri, 02 Aug 2013 07:46:56 -0400 Date: Fri, 2 Aug 2013 13:46:52 +0200 From: Stefan Hajnoczi Message-ID: <20130802114652.GA342@stefanha-thinkpad.redhat.com> References: <51FA97CA.7050905@siemens.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <51FA97CA.7050905@siemens.com> Subject: Re: [Qemu-devel] net/tap.c: Possibly a way to stall tap input List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: qemu-devel On Thu, Aug 01, 2013 at 07:15:54PM +0200, Jan Kiszka wrote: > I was digging into the involved code and found something fishy: > > net/tap.c: > static void tap_send(void *opaque) > { > ... > size = qemu_send_packet_async(&s->nc, buf, size, > tap_send_completed); > if (size == 0) { > tap_read_poll(s, false); > } > > So, if tap_send is registered for the mainloop polling (ie. can_receive > returned true before starting to poll) but qemu_send_packet_async > returns 0 now as qemu_can_send_packet/can_receive happens to report > false in the meantime, we will disable read polling. If also write > polling is off, the fd will be completely removed from the iohandler > list. But even if write polling remains on, I wonder what should bring > read polling back? This behavior seems fine to me. Once the peer (pcnet) is able to receive again it must flush the queue, this will re-enable tap_read_poll(). Can you explain a bit more why this would be a problem? Stefan