net/mlx4_en: Verify mlx4_en module parameters
authorEugenia Emantayev <eugenia@mellanox.com>
Sun, 2 Mar 2014 08:24:58 +0000 (10:24 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 Mar 2014 01:04:00 +0000 (20:04 -0500)
Verify mlx4_en module parameters.
In case they are out of range - reset to default values.

Signed-off-by: Eugenia Emantayev <eugenia@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/en_main.c
drivers/net/ethernet/mellanox/mlx4/en_tx.c
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

index fa2f6e76f69bb03f9a822fb23f5af1f3875174c3..3454437fcd95121e9a12f1bcde87dc9de96cd4c6 100644 (file)
@@ -72,6 +72,12 @@ MLX4_EN_PARM_INT(pfctx, 0, "Priority based Flow Control policy on TX[7:0]."
 MLX4_EN_PARM_INT(pfcrx, 0, "Priority based Flow Control policy on RX[7:0]."
                           " Per priority bit mask");
 
+MLX4_EN_PARM_INT(inline_thold, MAX_INLINE,
+                "Threshold for using inline data (range: 17-104, default: 104)");
+
+#define MAX_PFC_TX     0xff
+#define MAX_PFC_RX     0xff
+
 int en_print(const char *level, const struct mlx4_en_priv *priv,
             const char *format, ...)
 {
@@ -140,6 +146,7 @@ static int mlx4_en_get_profile(struct mlx4_en_dev *mdev)
                params->prof[i].tx_ring_num = params->num_tx_rings_p_up *
                        MLX4_EN_NUM_UP;
                params->prof[i].rss_rings = 0;
+               params->prof[i].inline_thold = inline_thold;
        }
 
        return 0;
@@ -325,8 +332,31 @@ static struct mlx4_interface mlx4_en_interface = {
        .protocol       = MLX4_PROT_ETH,
 };
 
+void mlx4_en_verify_params(void)
+{
+       if (pfctx > MAX_PFC_TX) {
+               pr_warn("mlx4_en: WARNING: illegal module parameter pfctx 0x%x - should be in range 0-0x%x, will be changed to default (0)\n",
+                       pfctx, MAX_PFC_TX);
+               pfctx = 0;
+       }
+
+       if (pfcrx > MAX_PFC_RX) {
+               pr_warn("mlx4_en: WARNING: illegal module parameter pfcrx 0x%x - should be in range 0-0x%x, will be changed to default (0)\n",
+                       pfcrx, MAX_PFC_RX);
+               pfcrx = 0;
+       }
+
+       if (inline_thold < MIN_PKT_LEN || inline_thold > MAX_INLINE) {
+               pr_warn("mlx4_en: WARNING: illegal module parameter inline_thold %d - should be in range %d-%d, will be changed to default (%d)\n",
+                       inline_thold, MIN_PKT_LEN, MAX_INLINE, MAX_INLINE);
+               inline_thold = MAX_INLINE;
+       }
+}
+
 static int __init mlx4_en_init(void)
 {
+       mlx4_en_verify_params();
+
        return mlx4_register_interface(&mlx4_en_interface);
 }
 
index 13457032d15ff09489cff354b3322f06011e1c2b..8dc7637f5844b7500b84bd64d3c65029e4623273 100644 (file)
 
 #include "mlx4_en.h"
 
-enum {
-       MAX_INLINE = 104, /* 128 - 16 - 4 - 4 */
-       MAX_BF = 256,
-};
-
-static int inline_thold __read_mostly = MAX_INLINE;
-
-module_param_named(inline_thold, inline_thold, int, 0444);
-MODULE_PARM_DESC(inline_thold, "threshold for using inline data");
-
 int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
                           struct mlx4_en_tx_ring **pring, int qpn, u32 size,
                           u16 stride, int node, int queue_index)
@@ -75,8 +65,7 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
        ring->size = size;
        ring->size_mask = size - 1;
        ring->stride = stride;
-
-       inline_thold = min(inline_thold, MAX_INLINE);
+       ring->inline_thold = priv->prof->inline_thold;
 
        tmp = size * sizeof(struct mlx4_en_tx_info);
        ring->tx_info = vmalloc_node(tmp, node);
@@ -520,7 +509,7 @@ static struct mlx4_en_tx_desc *mlx4_en_bounce_to_desc(struct mlx4_en_priv *priv,
        return ring->buf + index * TXBB_SIZE;
 }
 
-static int is_inline(struct sk_buff *skb, void **pfrag)
+static int is_inline(int inline_thold, struct sk_buff *skb, void **pfrag)
 {
        void *ptr;
 
@@ -580,7 +569,7 @@ static int get_real_size(struct sk_buff *skb, struct net_device *dev,
                }
        } else {
                *lso_header_size = 0;
-               if (!is_inline(skb, NULL))
+               if (!is_inline(priv->prof->inline_thold, skb, NULL))
                        real_size = CTRL_SIZE + (skb_shinfo(skb)->nr_frags + 1) * DS_SIZE;
                else
                        real_size = inline_size(skb);
@@ -747,11 +736,11 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
        tx_info->data_offset = (void *)data - (void *)tx_desc;
 
        tx_info->linear = (lso_header_size < skb_headlen(skb) &&
-                          !is_inline(skb, NULL)) ? 1 : 0;
+                          !is_inline(ring->inline_thold, skb, NULL)) ? 1 : 0;
 
        data += skb_shinfo(skb)->nr_frags + tx_info->linear - 1;
 
-       if (is_inline(skb, &fragptr)) {
+       if (is_inline(ring->inline_thold, skb, &fragptr)) {
                tx_info->inl = 1;
        } else {
                /* Map fragments */
index 3c25c7bf3dba6bac301f3207e41c01bf5f1b1954..2610cc53fb4aed5dde80e17c4189a6c7057dd315 100644 (file)
@@ -187,6 +187,13 @@ enum {
 #define GET_AVG_PERF_COUNTER(cnt)      (0)
 #endif /* MLX4_EN_PERF_STAT */
 
+/* Constants for TX flow */
+enum {
+       MAX_INLINE = 104, /* 128 - 16 - 4 - 4 */
+       MAX_BF = 256,
+       MIN_PKT_LEN = 17,
+};
+
 /*
  * Configurables
  */
@@ -271,6 +278,7 @@ struct mlx4_en_tx_ring {
        bool bf_enabled;
        struct netdev_queue *tx_queue;
        int hwtstamp_tx_type;
+       int inline_thold;
 };
 
 struct mlx4_en_rx_desc {
@@ -346,6 +354,7 @@ struct mlx4_en_port_profile {
        u8 tx_pause;
        u8 tx_ppp;
        int rss_rings;
+       int inline_thold;
 };
 
 struct mlx4_en_profile {