WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PoC PATCH] net: convert xen-netfront to hw_features

To: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
Subject: [Xen-devel] [PoC PATCH] net: convert xen-netfront to hw_features
From: Michał Mirosław <mirq-linux@xxxxxxxxxxxx>
From: Michał Mirosław <mirqus@xxxxxxxxx>
Date: Thu, 10 Mar 2011 18:43:57 +0100 (CET)
Cc: Jeremy Fitzhardinge <jeremy@xxxxxxxx>, xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>, Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>, "netdev@xxxxxxxxxxxxxxx" <netdev@xxxxxxxxxxxxxxx>, Francois Romieu <romieu@xxxxxxxxxxxxx>, Ben Hutchings <bhutchings@xxxxxxxxxxxxxx>
Delivery-date: Fri, 11 Mar 2011 09:53:46 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <AANLkTinHyFLRkeb60x4Q6uUw6p43XBjk5rpqCMo49WKF@xxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <AANLkTinHyFLRkeb60x4Q6uUw6p43XBjk5rpqCMo49WKF@xxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
This patch converts xen-netfront to hw_features.

It's 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.

netdev_update_features() should be called whenever offload conditions change.
This in turn calls ndo_fix_features() and ndo_set_features() to verify them.
I leave this to you as I don't know when or how the notifications get passed.

Signed-off-by: Michał Mirosław <mirq-linux@xxxxxxxxxxxx>
---
 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 da1f121..c642fd3 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.3


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel