From mboxrd@z Thu Jan 1 00:00:00 1970 From: Florian Fainelli Subject: Re: [PATCH net-next] virtio_net: ethtool tx napi configuration Date: Wed, 12 Sep 2018 10:42:03 -0700 Message-ID: References: <20180909224449.203593-1-willemdebruijn.kernel@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Cc: davem@davemloft.net, caleb.raitto@gmail.com, jasowang@redhat.com, mst@redhat.com, jonolson@google.com, Willem de Bruijn To: Willem de Bruijn , netdev@vger.kernel.org Return-path: Received: from mail-pf1-f193.google.com ([209.85.210.193]:33201 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727346AbeILWrn (ORCPT ); Wed, 12 Sep 2018 18:47:43 -0400 Received: by mail-pf1-f193.google.com with SMTP id d4-v6so1378089pfn.0 for ; Wed, 12 Sep 2018 10:42:09 -0700 (PDT) In-Reply-To: <20180909224449.203593-1-willemdebruijn.kernel@gmail.com> Content-Language: en-US Sender: netdev-owner@vger.kernel.org List-ID: On 9/9/2018 3:44 PM, Willem de Bruijn wrote: > From: Willem de Bruijn > > Implement ethtool .set_coalesce (-C) and .get_coalesce (-c) handlers. > Interrupt moderation is currently not supported, so these accept and > display the default settings of 0 usec and 1 frame. > > Toggle tx napi through a bit in tx-frames. So as to not interfere > with possible future interrupt moderation, use bit 10, well outside > the reasonable range of real interrupt moderation values. > > Changes are not atomic. The tx IRQ, napi BH and transmit path must > be quiesced when switching modes. Only allow changing this setting > when the device is down. Humm, would not a private ethtool flag to switch TX NAPI on/off be more appropriate rather than use the coalescing configuration API here? > > Link: https://patchwork.ozlabs.org/patch/948149/ > Suggested-by: Jason Wang > Signed-off-by: Willem de Bruijn > --- > drivers/net/virtio_net.c | 52 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 52 insertions(+) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 765920905226..b320b6b14749 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -66,6 +66,8 @@ DECLARE_EWMA(pkt_len, 0, 64) > > #define VIRTNET_DRIVER_VERSION "1.0.0" > > +static const u32 ethtool_coalesce_napi_mask = (1UL << 10); > + > static const unsigned long guest_offloads[] = { > VIRTIO_NET_F_GUEST_TSO4, > VIRTIO_NET_F_GUEST_TSO6, > @@ -2181,6 +2183,54 @@ static int virtnet_get_link_ksettings(struct net_device *dev, > return 0; > } > > +static int virtnet_set_coalesce(struct net_device *dev, > + struct ethtool_coalesce *ec) > +{ > + const struct ethtool_coalesce ec_default = { > + .cmd = ETHTOOL_SCOALESCE, > + .rx_max_coalesced_frames = 1, > + .tx_max_coalesced_frames = 1, > + }; > + struct virtnet_info *vi = netdev_priv(dev); > + int i, napi_weight = 0; > + > + if (ec->tx_max_coalesced_frames & ethtool_coalesce_napi_mask) { > + ec->tx_max_coalesced_frames &= ~ethtool_coalesce_napi_mask; > + napi_weight = NAPI_POLL_WEIGHT; > + } > + > + /* disallow changes to fields not explicitly tested above */ > + if (memcmp(ec, &ec_default, sizeof(ec_default))) > + return -EINVAL; > + > + if (napi_weight ^ vi->sq[0].napi.weight) { > + if (dev->flags & IFF_UP) > + return -EBUSY; > + for (i = 0; i < vi->max_queue_pairs; i++) > + vi->sq[i].napi.weight = napi_weight; > + } > + > + return 0; > +} > + > +static int virtnet_get_coalesce(struct net_device *dev, > + struct ethtool_coalesce *ec) > +{ > + const struct ethtool_coalesce ec_default = { > + .cmd = ETHTOOL_GCOALESCE, > + .rx_max_coalesced_frames = 1, > + .tx_max_coalesced_frames = 1, > + }; > + struct virtnet_info *vi = netdev_priv(dev); > + > + memcpy(ec, &ec_default, sizeof(ec_default)); > + > + if (vi->sq[0].napi.weight) > + ec->tx_max_coalesced_frames |= ethtool_coalesce_napi_mask; > + > + return 0; > +} > + > static void virtnet_init_settings(struct net_device *dev) > { > struct virtnet_info *vi = netdev_priv(dev); > @@ -2219,6 +2269,8 @@ static const struct ethtool_ops virtnet_ethtool_ops = { > .get_ts_info = ethtool_op_get_ts_info, > .get_link_ksettings = virtnet_get_link_ksettings, > .set_link_ksettings = virtnet_set_link_ksettings, > + .set_coalesce = virtnet_set_coalesce, > + .get_coalesce = virtnet_get_coalesce, > }; > > static void virtnet_freeze_down(struct virtio_device *vdev) > -- Florian