Michał Mirosław
2011-Mar-31 11:01 UTC
[PATCH RESEND] net: convert xen-netfront to hw_features
Not tested in any way. The original code for offload setting seems broken as it resets the features on every netback reconnect. This will set GSO_ROBUST at device creation time (earlier than connect time). RX checksum offload is forced on - so advertise as it is. Signed-off-by: Micha? Miros?aw <mirq-linux at rere.qmqm.pl> --- [I don't know Xen code enough to say this is correct. There is Xen netback driver coming in, that has similar changes to be made. Please match them up if you can.] drivers/net/xen-netfront.c | 57 +++++++++++++++++-------------------------- 1 files changed, 23 insertions(+), 34 deletions(-) diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 5c8d9c3..2a71c9f 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c @@ -1148,6 +1148,8 @@ static const struct net_device_ops xennet_netdev_ops = { .ndo_change_mtu = xennet_change_mtu, .ndo_set_mac_address = eth_mac_addr, .ndo_validate_addr = eth_validate_addr, + .ndo_fix_features = xennet_fix_features, + .ndo_set_features = xennet_set_features, }; static struct net_device * __devinit xennet_create_dev(struct xenbus_device *dev) @@ -1209,7 +1211,9 @@ static struct net_device * __devinit xennet_create_dev(struct xenbus_device *dev netdev->netdev_ops = &xennet_netdev_ops; netif_napi_add(netdev, &np->napi, xennet_poll, 64); - netdev->features = NETIF_F_IP_CSUM; + netdev->features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM | + NETIF_F_GSO_ROBUST; + netdev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO; SET_ETHTOOL_OPS(netdev, &xennet_ethtool_ops); SET_NETDEV_DEV(netdev, &dev->dev); @@ -1510,52 +1514,40 @@ again: return err; } -static int xennet_set_sg(struct net_device *dev, u32 data) +static u32 xennet_fix_features(struct net_device *dev, u32 features) { - if (data) { - struct netfront_info *np = netdev_priv(dev); - int val; + struct netfront_info *np = netdev_priv(dev); + int val; + if (features & NETIF_F_SG) { if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, "feature-sg", "%d", &val) < 0) val = 0; + if (!val) - return -ENOSYS; - } else if (dev->mtu > ETH_DATA_LEN) - dev->mtu = ETH_DATA_LEN; - - return ethtool_op_set_sg(dev, data); -} - -static int xennet_set_tso(struct net_device *dev, u32 data) -{ - if (data) { - struct netfront_info *np = netdev_priv(dev); - int val; + features &= ~NETIF_F_SG; + } + if (features & NETIF_F_TSO) { if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, "feature-gso-tcpv4", "%d", &val) < 0) val = 0; + if (!val) - return -ENOSYS; + features &= ~NETIF_F_TSO; } - return ethtool_op_set_tso(dev, data); + return features; } -static void xennet_set_features(struct net_device *dev) +static int xennet_set_features(struct net_device *dev, u32 features) { - /* Turn off all GSO bits except ROBUST. */ - dev->features &= ~NETIF_F_GSO_MASK; - dev->features |= NETIF_F_GSO_ROBUST; - xennet_set_sg(dev, 0); + if (!(features & NETIF_F_SG) && dev->mtu > ETH_DATA_LEN) { + netdev_info(dev, "Reducing MTU because no SG offload"); + dev->mtu = ETH_DATA_LEN; + } - /* We need checksum offload to enable scatter/gather and TSO. */ - if (!(dev->features & NETIF_F_IP_CSUM)) - return; - - if (!xennet_set_sg(dev, 1)) - xennet_set_tso(dev, 1); + return 0; } static int xennet_connect(struct net_device *dev) @@ -1582,7 +1574,7 @@ static int xennet_connect(struct net_device *dev) if (err) return err; - xennet_set_features(dev); + netdev_update_features(dev); spin_lock_bh(&np->rx_lock); spin_lock_irq(&np->tx_lock); @@ -1710,9 +1702,6 @@ static void xennet_get_strings(struct net_device *dev, u32 stringset, u8 * data) static const struct ethtool_ops xennet_ethtool_ops { - .set_tx_csum = ethtool_op_set_tx_csum, - .set_sg = xennet_set_sg, - .set_tso = xennet_set_tso, .get_link = ethtool_op_get_link, .get_sset_count = xennet_get_sset_count, -- 1.7.2.5
Ian Campbell
2011-Mar-31 11:13 UTC
[PATCH RESEND] net: convert xen-netfront to hw_features
On Thu, 2011-03-31 at 12:01 +0100, Micha? Miros?aw wrote:> Not tested in any way. The original code for offload setting seems broken > as it resets the features on every netback reconnect.Thanks, I've got a pending TODO item to test this and propagate similar changes to netback. I hope to get to it soon... Is this urgent (for 2.6.39) IYHO? I think it's been broken this way for a long time now... Ian.> > This will set GSO_ROBUST at device creation time (earlier than connect time). > > RX checksum offload is forced on - so advertise as it is. > > Signed-off-by: Micha? Miros?aw <mirq-linux at rere.qmqm.pl> > --- > [I don't know Xen code enough to say this is correct. There is Xen netback > driver coming in, that has similar changes to be made. Please match > them up if you can.] > > drivers/net/xen-netfront.c | 57 +++++++++++++++++-------------------------- > 1 files changed, 23 insertions(+), 34 deletions(-) > > diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c > index 5c8d9c3..2a71c9f 100644 > --- a/drivers/net/xen-netfront.c > +++ b/drivers/net/xen-netfront.c > @@ -1148,6 +1148,8 @@ static const struct net_device_ops xennet_netdev_ops = { > .ndo_change_mtu = xennet_change_mtu, > .ndo_set_mac_address = eth_mac_addr, > .ndo_validate_addr = eth_validate_addr, > + .ndo_fix_features = xennet_fix_features, > + .ndo_set_features = xennet_set_features, > }; > > static struct net_device * __devinit xennet_create_dev(struct xenbus_device *dev) > @@ -1209,7 +1211,9 @@ static struct net_device * __devinit xennet_create_dev(struct xenbus_device *dev > netdev->netdev_ops = &xennet_netdev_ops; > > netif_napi_add(netdev, &np->napi, xennet_poll, 64); > - netdev->features = NETIF_F_IP_CSUM; > + netdev->features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM | > + NETIF_F_GSO_ROBUST; > + netdev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO; > > SET_ETHTOOL_OPS(netdev, &xennet_ethtool_ops); > SET_NETDEV_DEV(netdev, &dev->dev); > @@ -1510,52 +1514,40 @@ again: > return err; > } > > -static int xennet_set_sg(struct net_device *dev, u32 data) > +static u32 xennet_fix_features(struct net_device *dev, u32 features) > { > - if (data) { > - struct netfront_info *np = netdev_priv(dev); > - int val; > + struct netfront_info *np = netdev_priv(dev); > + int val; > > + if (features & NETIF_F_SG) { > if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, "feature-sg", > "%d", &val) < 0) > val = 0; > + > if (!val) > - return -ENOSYS; > - } else if (dev->mtu > ETH_DATA_LEN) > - dev->mtu = ETH_DATA_LEN; > - > - return ethtool_op_set_sg(dev, data); > -} > - > -static int xennet_set_tso(struct net_device *dev, u32 data) > -{ > - if (data) { > - struct netfront_info *np = netdev_priv(dev); > - int val; > + features &= ~NETIF_F_SG; > + } > > + if (features & NETIF_F_TSO) { > if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, > "feature-gso-tcpv4", "%d", &val) < 0) > val = 0; > + > if (!val) > - return -ENOSYS; > + features &= ~NETIF_F_TSO; > } > > - return ethtool_op_set_tso(dev, data); > + return features; > } > > -static void xennet_set_features(struct net_device *dev) > +static int xennet_set_features(struct net_device *dev, u32 features) > { > - /* Turn off all GSO bits except ROBUST. */ > - dev->features &= ~NETIF_F_GSO_MASK; > - dev->features |= NETIF_F_GSO_ROBUST; > - xennet_set_sg(dev, 0); > + if (!(features & NETIF_F_SG) && dev->mtu > ETH_DATA_LEN) { > + netdev_info(dev, "Reducing MTU because no SG offload"); > + dev->mtu = ETH_DATA_LEN; > + } > > - /* We need checksum offload to enable scatter/gather and TSO. */ > - if (!(dev->features & NETIF_F_IP_CSUM)) > - return; > - > - if (!xennet_set_sg(dev, 1)) > - xennet_set_tso(dev, 1); > + return 0; > } > > static int xennet_connect(struct net_device *dev) > @@ -1582,7 +1574,7 @@ static int xennet_connect(struct net_device *dev) > if (err) > return err; > > - xennet_set_features(dev); > + netdev_update_features(dev); > > spin_lock_bh(&np->rx_lock); > spin_lock_irq(&np->tx_lock); > @@ -1710,9 +1702,6 @@ static void xennet_get_strings(struct net_device *dev, u32 stringset, u8 * data) > > static const struct ethtool_ops xennet_ethtool_ops > { > - .set_tx_csum = ethtool_op_set_tx_csum, > - .set_sg = xennet_set_sg, > - .set_tso = xennet_set_tso, > .get_link = ethtool_op_get_link, > > .get_sset_count = xennet_get_sset_count,
David Miller
2011-Apr-02 03:54 UTC
[PATCH RESEND] net: convert xen-netfront to hw_features
From: Micha? Miros?aw <mirq-linux at rere.qmqm.pl> Date: Thu, 31 Mar 2011 13:01:35 +0200 (CEST)> Not tested in any way. The original code for offload setting seems broken > as it resets the features on every netback reconnect. > > This will set GSO_ROBUST at device creation time (earlier than connect time). > > RX checksum offload is forced on - so advertise as it is. > > Signed-off-by: Micha? Miros?aw <mirq-linux at rere.qmqm.pl>Applied.
Le vendredi 01 avril 2011 ? 20:54 -0700, David Miller a ?crit :> From: Micha? Miros?aw <mirq-linux at rere.qmqm.pl> > Date: Thu, 31 Mar 2011 13:01:35 +0200 (CEST) > > > Not tested in any way. The original code for offload setting seems broken > > as it resets the features on every netback reconnect. > > > > This will set GSO_ROBUST at device creation time (earlier than connect time). > > > > RX checksum offload is forced on - so advertise as it is. > > > > Signed-off-by: Micha? Miros?aw <mirq-linux at rere.qmqm.pl> > > Applied.Hmm... I had to apply following patch to make it actually compile. Thanks [PATCH] xen: netfront: fix declaration order Must declare xennet_fix_features() and xennet_set_features() before using them. Signed-off-by: Eric Dumazet <eric.dumazet at gmail.com> Cc: Micha? Miros?aw <mirq-linux at rere.qmqm.pl> --- drivers/net/xen-netfront.c | 72 +++++++++++++++++------------------ 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index f6e7e27..0cfe4cc 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c @@ -1140,6 +1140,42 @@ static void xennet_uninit(struct net_device *dev) gnttab_free_grant_references(np->gref_rx_head); } +static u32 xennet_fix_features(struct net_device *dev, u32 features) +{ + struct netfront_info *np = netdev_priv(dev); + int val; + + if (features & NETIF_F_SG) { + if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, "feature-sg", + "%d", &val) < 0) + val = 0; + + if (!val) + features &= ~NETIF_F_SG; + } + + if (features & NETIF_F_TSO) { + if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, + "feature-gso-tcpv4", "%d", &val) < 0) + val = 0; + + if (!val) + features &= ~NETIF_F_TSO; + } + + return features; +} + +static int xennet_set_features(struct net_device *dev, u32 features) +{ + if (!(features & NETIF_F_SG) && dev->mtu > ETH_DATA_LEN) { + netdev_info(dev, "Reducing MTU because no SG offload"); + dev->mtu = ETH_DATA_LEN; + } + + return 0; +} + static const struct net_device_ops xennet_netdev_ops = { .ndo_open = xennet_open, .ndo_uninit = xennet_uninit, @@ -1513,42 +1549,6 @@ again: return err; } -static u32 xennet_fix_features(struct net_device *dev, u32 features) -{ - struct netfront_info *np = netdev_priv(dev); - int val; - - if (features & NETIF_F_SG) { - if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, "feature-sg", - "%d", &val) < 0) - val = 0; - - if (!val) - features &= ~NETIF_F_SG; - } - - if (features & NETIF_F_TSO) { - if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, - "feature-gso-tcpv4", "%d", &val) < 0) - val = 0; - - if (!val) - features &= ~NETIF_F_TSO; - } - - return features; -} - -static int xennet_set_features(struct net_device *dev, u32 features) -{ - if (!(features & NETIF_F_SG) && dev->mtu > ETH_DATA_LEN) { - netdev_info(dev, "Reducing MTU because no SG offload"); - dev->mtu = ETH_DATA_LEN; - } - - return 0; -} - static int xennet_connect(struct net_device *dev) { struct netfront_info *np = netdev_priv(dev);