From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54262) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAekp-0003rp-UF for qemu-devel@nongnu.org; Thu, 02 Jul 2015 09:42:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZAeko-0004K0-Ry for qemu-devel@nongnu.org; Thu, 02 Jul 2015 09:42:15 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51156) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAeko-0004Jw-Ms for qemu-devel@nongnu.org; Thu, 02 Jul 2015 09:42:14 -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 59155C7959 for ; Thu, 2 Jul 2015 13:42:14 +0000 (UTC) Date: Thu, 2 Jul 2015 14:30:57 +0100 From: Stefan Hajnoczi Message-ID: <20150702133057.GI21214@stefanha-thinkpad.home> References: <1435631360-4978-1-git-send-email-famz@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="qVyHzDF4yf4A8jkR" Content-Disposition: inline In-Reply-To: <1435631360-4978-1-git-send-email-famz@redhat.com> 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: Fam Zheng Cc: Jason Wang , qemu-devel@nongnu.org --qVyHzDF4yf4A8jkR Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 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. >=20 > 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. >=20 > 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 =3D=3D 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) =3D=3D 0) { return 0; } } return len; } --qVyHzDF4yf4A8jkR Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAEBAgAGBQJVlT0RAAoJEJykq7OBq3PI8PMH/jG8cNJaqR/6w04PPaTu4O7l kcv0mkZY18PHlwZHQdwAZcneEiMf2obBwizDwszN8drBHiOSqjSeRdU4anicMo95 XJn1RSzClO+u6OqqUa0IqJ88G6DYpz7DQ/QRWRf6akekngWg9v1Y3C4uXtqdcPd3 1eTeZh8AsbMJsP2J7Hjc9HcrRqwZdXnoRCaoy7HjM8Hb/ADM2xCxNkPIlJ+gkXJD xw1ujP+1uYxqlUjmUAm/4evne8zv9T/gxYRRPqVihEtDwqD6bGtEBCqkmiUbogFS eHXmQnbG/F35LqVjDCfyyT9QWvhvwwKGTwwdn7psqov3zuVuAmKeH5kNkaeDNNw= =fVW8 -----END PGP SIGNATURE----- --qVyHzDF4yf4A8jkR--