From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32928) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAp3f-0006Xq-Nx for qemu-devel@nongnu.org; Thu, 02 Jul 2015 20:42:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZAp3c-0005ae-AD for qemu-devel@nongnu.org; Thu, 02 Jul 2015 20:42:23 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51793) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAp3c-0005aT-4O for qemu-devel@nongnu.org; Thu, 02 Jul 2015 20:42:20 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 1C5DD2DC40B for ; Fri, 3 Jul 2015 00:42:19 +0000 (UTC) Date: Fri, 3 Jul 2015 08:42:15 +0800 From: Fam Zheng Message-ID: <20150703004215.GA19093@ad.nay.redhat.com> References: <1435631360-4978-1-git-send-email-famz@redhat.com> <20150702133057.GI21214@stefanha-thinkpad.home> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150702133057.GI21214@stefanha-thinkpad.home> Subject: Re: [Qemu-devel] [PATCH for-2.4] net-hub: Drop can_receive List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi Cc: Jason Wang , qemu-devel@nongnu.org On Thu, 07/02 14:30, Stefan Hajnoczi wrote: > On Tue, Jun 30, 2015 at 10:29:20AM +0800, Fam Zheng wrote: > > It returns true as long as there is another attached port. This is not > > strictly necessary because even if there is only one port (the sender), > > net_hub_port_receive could succeed with a NOP. So always deliver the > > packets, instead of queuing them. > > > > This fixes the possible hanging issue after net layer changed how > > can_read is handled. That is, if net_hub_port_can_receive returned > > false, the peer would disable the queue until it's explicitly flushed > > (for example, a call to qemu_flush_queued_packets() in net_hub_add_port, > > where net_hub_port_can_receive() would become true). This patch avoids > > that complication. > > > > Signed-off-by: Fam Zheng > > --- > > net/hub.c | 20 -------------------- > > 1 file changed, 20 deletions(-) > > Hmm...I misread the hub code: > > net_hub_port_can_receive() returns true if *any* port can receive. > > net_hub_receive_iov() always accepts packets. It never discards or > queues. > > So in order to move to the semantics you want, let's drop > net_hub_port_can_receive() *and* change net_hub_receive_iov(): > > static ssize_t net_hub_receive(NetHub *hub, NetHubPort *source_port, > const uint8_t *buf, size_t len) > { > NetHubPort *port; > > QLIST_FOREACH(port, &hub->ports, next) { > if (port == source_port) { > continue; > } > > /* No need for a callback because net_hub_flush() is called > * when the peer flushes the queue anyway. > * > * Note that packets are duplicated if there are multiple > * ports and some of them accepted a packet before a later > * port queued it. Live with it, the network tolerates > * duplicates. > */ > if (qemu_send_packet(&port->nc, buf, len) == 0) { > return 0; I'm not sure if it is a good idea to return 0 from either net_hub_port_receive or net_hub_receive. Because that way if one out of ten ports is down, other ones will no longer get more packets from tap. Fam > } > } > return len; > }