From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45154) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZA88G-0003sz-6q for qemu-devel@nongnu.org; Tue, 30 Jun 2015 22:52:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZA88D-00056w-GB for qemu-devel@nongnu.org; Tue, 30 Jun 2015 22:52:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38958) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZA88D-00056s-AD for qemu-devel@nongnu.org; Tue, 30 Jun 2015 22:52:13 -0400 Date: Wed, 1 Jul 2015 10:52:09 +0800 From: Fam Zheng Message-ID: <20150701025209.GB6570@ad.nay.redhat.com> References: <1435717553-36187-1-git-send-email-sfeldma@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1435717553-36187-1-git-send-email-sfeldma@gmail.com> Subject: Re: [Qemu-devel] [PATCH v2] rocker: don't queue receive pkts when port is disabled List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: sfeldma@gmail.com Cc: jiri@resnulli.us, qemu-devel@nongnu.org, stefanha@redhat.com On Tue, 06/30 19:25, sfeldma@gmail.com wrote: > From: Scott Feldman > > Commit 6e99c63 ("net/socket: Drop net_socket_can_send") changed the > semantics around .can_receive for sockets to now require the device to > flush queued pkts when transitioning to a .can_receive=true state. Rocker > device was not flushing the queue on .can_receive=true transition, so the > receiver was stuck. > > But, turns out we really don't want any queuing at all on the port when the > port is disabled, otherwise when the port transitions to enabled, we'd > receive and forward stale pkts that really should have been dropped. So, > let's remove .can_receive so avoid queuing and drop the pkt in .receive if > the port is disabled. > > Signed-off-by: Scott Feldman > --- > v2: return -1 to drop pkt, review comment from famz@redhat.com > > hw/net/rocker/rocker_fp.c | 18 ++++++++++-------- > 1 file changed, 10 insertions(+), 8 deletions(-) > > diff --git a/hw/net/rocker/rocker_fp.c b/hw/net/rocker/rocker_fp.c > index d8d934c..c693ae5 100644 > --- a/hw/net/rocker/rocker_fp.c > +++ b/hw/net/rocker/rocker_fp.c > @@ -125,18 +125,21 @@ int fp_port_eg(FpPort *port, const struct iovec *iov, int iovcnt) > return ROCKER_OK; > } > > -static int fp_port_can_receive(NetClientState *nc) > -{ > - FpPort *port = qemu_get_nic_opaque(nc); > - > - return port->enabled; > -} > - > static ssize_t fp_port_receive_iov(NetClientState *nc, const struct iovec *iov, > int iovcnt) > { > FpPort *port = qemu_get_nic_opaque(nc); > > + /* If the port is disabled, we want to drop this pkt > + * now rather than queing it for later. We don't want > + * any stale pkts getting into the device when the port > + * transitions to enabled. > + */ > + > + if (!port->enabled) { > + return -1; > + } > + > return world_ingress(port->world, port->pport, iov, iovcnt); > } > > @@ -165,7 +168,6 @@ static void fp_port_set_link_status(NetClientState *nc) > static NetClientInfo fp_port_info = { > .type = NET_CLIENT_OPTIONS_KIND_NIC, > .size = sizeof(NICState), > - .can_receive = fp_port_can_receive, > .receive = fp_port_receive, > .receive_iov = fp_port_receive_iov, > .cleanup = fp_port_cleanup, > -- > 1.7.10.4 > > Reviewed-by: Fam Zheng