net/mlx4_en: Use the new tx_copybreak to set inline threshold
authorEric Dumazet <edumazet@google.com>
Sun, 5 Oct 2014 09:35:22 +0000 (12:35 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 6 Oct 2014 05:04:16 +0000 (01:04 -0400)
Instead of setting inline threshold using module parameter only on
driver load, use set_tunable() to set it dynamically.
No need to store the threshold per ring, using instead the netdev global
priv->prof->inline_thold
Initial value still is set using the module parameter, therefore
backward compatability is kept.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
drivers/net/ethernet/mellanox/mlx4/en_tx.c
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

index 42c9f8b09a6e25e619367c1bb216c8afefc6d6b0..ae83da9cd18a3f870ab51bc3ff9cb207b6f0432e 100644 (file)
@@ -1267,6 +1267,48 @@ static u32 mlx4_en_get_priv_flags(struct net_device *dev)
        return priv->pflags;
 }
 
+static int mlx4_en_get_tunable(struct net_device *dev,
+                              const struct ethtool_tunable *tuna,
+                              void *data)
+{
+       const struct mlx4_en_priv *priv = netdev_priv(dev);
+       int ret = 0;
+
+       switch (tuna->id) {
+       case ETHTOOL_TX_COPYBREAK:
+               *(u32 *)data = priv->prof->inline_thold;
+               break;
+       default:
+               ret = -EINVAL;
+               break;
+       }
+
+       return ret;
+}
+
+static int mlx4_en_set_tunable(struct net_device *dev,
+                              const struct ethtool_tunable *tuna,
+                              const void *data)
+{
+       struct mlx4_en_priv *priv = netdev_priv(dev);
+       int val, ret = 0;
+
+       switch (tuna->id) {
+       case ETHTOOL_TX_COPYBREAK:
+               val = *(u32 *)data;
+               if (val < MIN_PKT_LEN || val > MAX_INLINE)
+                       ret = -EINVAL;
+               else
+                       priv->prof->inline_thold = val;
+               break;
+       default:
+               ret = -EINVAL;
+               break;
+       }
+
+       return ret;
+}
+
 
 const struct ethtool_ops mlx4_en_ethtool_ops = {
        .get_drvinfo = mlx4_en_get_drvinfo,
@@ -1297,6 +1339,8 @@ const struct ethtool_ops mlx4_en_ethtool_ops = {
        .get_ts_info = mlx4_en_get_ts_info,
        .set_priv_flags = mlx4_en_set_priv_flags,
        .get_priv_flags = mlx4_en_get_priv_flags,
+       .get_tunable            = mlx4_en_get_tunable,
+       .set_tunable            = mlx4_en_set_tunable,
 };
 
 
index f0080c5417c3f16566e68d968a7154569a833d7d..92a7cf46d9af9260d601a0d65ec5bba49fdc3908 100644 (file)
@@ -66,7 +66,6 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
        ring->size = size;
        ring->size_mask = size - 1;
        ring->stride = stride;
-       ring->inline_thold = priv->prof->inline_thold;
 
        tmp = size * sizeof(struct mlx4_en_tx_info);
        ring->tx_info = kmalloc_node(tmp, GFP_KERNEL | __GFP_NOWARN, node);
index a90403000577fccb224d10f7a2058fadb4c0240d..8fef65840b3b5e4176d512b4a2e36d510a1da311 100644 (file)
@@ -295,7 +295,6 @@ struct mlx4_en_tx_ring {
        bool                    bf_alloced;
        struct netdev_queue     *tx_queue;
        int                     hwtstamp_tx_type;
-       int                     inline_thold;
 } ____cacheline_aligned_in_smp;
 
 struct mlx4_en_rx_desc {