提交 b97b33a3 编写于 作者: E Eugenia Emantayev 提交者: David S. Miller

net/mlx4_en: Verify mlx4_en module parameters

Verify mlx4_en module parameters.
In case they are out of range - reset to default values.
Signed-off-by: NEugenia Emantayev <eugenia@mellanox.com>
Signed-off-by: NAmir Vadai <amirv@mellanox.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 fd8daa45
...@@ -72,6 +72,12 @@ MLX4_EN_PARM_INT(pfctx, 0, "Priority based Flow Control policy on TX[7:0]." ...@@ -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]." MLX4_EN_PARM_INT(pfcrx, 0, "Priority based Flow Control policy on RX[7:0]."
" Per priority bit mask"); " 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, int en_print(const char *level, const struct mlx4_en_priv *priv,
const char *format, ...) const char *format, ...)
{ {
...@@ -140,6 +146,7 @@ static int mlx4_en_get_profile(struct mlx4_en_dev *mdev) ...@@ -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 * params->prof[i].tx_ring_num = params->num_tx_rings_p_up *
MLX4_EN_NUM_UP; MLX4_EN_NUM_UP;
params->prof[i].rss_rings = 0; params->prof[i].rss_rings = 0;
params->prof[i].inline_thold = inline_thold;
} }
return 0; return 0;
...@@ -325,8 +332,31 @@ static struct mlx4_interface mlx4_en_interface = { ...@@ -325,8 +332,31 @@ static struct mlx4_interface mlx4_en_interface = {
.protocol = MLX4_PROT_ETH, .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) static int __init mlx4_en_init(void)
{ {
mlx4_en_verify_params();
return mlx4_register_interface(&mlx4_en_interface); return mlx4_register_interface(&mlx4_en_interface);
} }
......
...@@ -44,16 +44,6 @@ ...@@ -44,16 +44,6 @@
#include "mlx4_en.h" #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, int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
struct mlx4_en_tx_ring **pring, int qpn, u32 size, struct mlx4_en_tx_ring **pring, int qpn, u32 size,
u16 stride, int node, int queue_index) u16 stride, int node, int queue_index)
...@@ -75,8 +65,7 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, ...@@ -75,8 +65,7 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
ring->size = size; ring->size = size;
ring->size_mask = size - 1; ring->size_mask = size - 1;
ring->stride = stride; ring->stride = stride;
ring->inline_thold = priv->prof->inline_thold;
inline_thold = min(inline_thold, MAX_INLINE);
tmp = size * sizeof(struct mlx4_en_tx_info); tmp = size * sizeof(struct mlx4_en_tx_info);
ring->tx_info = vmalloc_node(tmp, node); 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, ...@@ -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; 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; void *ptr;
...@@ -580,7 +569,7 @@ static int get_real_size(struct sk_buff *skb, struct net_device *dev, ...@@ -580,7 +569,7 @@ static int get_real_size(struct sk_buff *skb, struct net_device *dev,
} }
} else { } else {
*lso_header_size = 0; *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; real_size = CTRL_SIZE + (skb_shinfo(skb)->nr_frags + 1) * DS_SIZE;
else else
real_size = inline_size(skb); real_size = inline_size(skb);
...@@ -747,11 +736,11 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -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->data_offset = (void *)data - (void *)tx_desc;
tx_info->linear = (lso_header_size < skb_headlen(skb) && 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; 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; tx_info->inl = 1;
} else { } else {
/* Map fragments */ /* Map fragments */
......
...@@ -187,6 +187,13 @@ enum { ...@@ -187,6 +187,13 @@ enum {
#define GET_AVG_PERF_COUNTER(cnt) (0) #define GET_AVG_PERF_COUNTER(cnt) (0)
#endif /* MLX4_EN_PERF_STAT */ #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 * Configurables
*/ */
...@@ -271,6 +278,7 @@ struct mlx4_en_tx_ring { ...@@ -271,6 +278,7 @@ struct mlx4_en_tx_ring {
bool bf_enabled; bool bf_enabled;
struct netdev_queue *tx_queue; struct netdev_queue *tx_queue;
int hwtstamp_tx_type; int hwtstamp_tx_type;
int inline_thold;
}; };
struct mlx4_en_rx_desc { struct mlx4_en_rx_desc {
...@@ -346,6 +354,7 @@ struct mlx4_en_port_profile { ...@@ -346,6 +354,7 @@ struct mlx4_en_port_profile {
u8 tx_pause; u8 tx_pause;
u8 tx_ppp; u8 tx_ppp;
int rss_rings; int rss_rings;
int inline_thold;
}; };
struct mlx4_en_profile { struct mlx4_en_profile {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册