Skip to content

Commit a67c01e

Browse files
committed
Merge branch 'ethtool-ringparam-upper-bound'
Tariq Toukan says: ==================== ethtool ringparam upper bound This patchset by Jenny adds sanity checks in ethtool ringparam operation for input upper bounds, similarly to what's done in ethtool_set_channels. The checks are added in patch 1, using a call to get_ringparam prior to calling set_ringparam NDO. Patch 2 changes the function's behavior in mlx4_en, so that it returns an error for out-of-range input, instead of rounding it to closest valid, similar to mlx5e. Patch 3 removes the upper bound checks in mlx5e_ethtool_set_ringparam as it becomes redundant. Series generated against net-next commit: f66faae Merge branch 'ipv6-ipv4-nexthop-align' ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 709af18 + bacc794 commit a67c01e

File tree

3 files changed

+24
-21
lines changed

3 files changed

+24
-21
lines changed

drivers/net/ethernet/mellanox/mlx4/en_ethtool.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,12 +1094,21 @@ static int mlx4_en_set_ringparam(struct net_device *dev,
10941094
if (param->rx_jumbo_pending || param->rx_mini_pending)
10951095
return -EINVAL;
10961096

1097+
if (param->rx_pending < MLX4_EN_MIN_RX_SIZE) {
1098+
en_warn(priv, "%s: rx_pending (%d) < min (%d)\n",
1099+
__func__, param->rx_pending,
1100+
MLX4_EN_MIN_RX_SIZE);
1101+
return -EINVAL;
1102+
}
1103+
if (param->tx_pending < MLX4_EN_MIN_TX_SIZE) {
1104+
en_warn(priv, "%s: tx_pending (%d) < min (%lu)\n",
1105+
__func__, param->tx_pending,
1106+
MLX4_EN_MIN_TX_SIZE);
1107+
return -EINVAL;
1108+
}
1109+
10971110
rx_size = roundup_pow_of_two(param->rx_pending);
1098-
rx_size = max_t(u32, rx_size, MLX4_EN_MIN_RX_SIZE);
1099-
rx_size = min_t(u32, rx_size, MLX4_EN_MAX_RX_SIZE);
11001111
tx_size = roundup_pow_of_two(param->tx_pending);
1101-
tx_size = max_t(u32, tx_size, MLX4_EN_MIN_TX_SIZE);
1102-
tx_size = min_t(u32, tx_size, MLX4_EN_MAX_TX_SIZE);
11031112

11041113
if (rx_size == (priv->port_up ? priv->rx_ring[0]->actual_size :
11051114
priv->rx_ring[0]->size) &&

drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,6 @@ int mlx5e_ethtool_set_ringparam(struct mlx5e_priv *priv,
296296
struct mlx5e_channels new_channels = {};
297297
u32 rx_pending_wqes;
298298
u32 min_rq_size;
299-
u32 max_rq_size;
300299
u8 log_rq_size;
301300
u8 log_sq_size;
302301
u32 num_mtts;
@@ -315,8 +314,6 @@ int mlx5e_ethtool_set_ringparam(struct mlx5e_priv *priv,
315314

316315
min_rq_size = mlx5e_rx_wqes_to_packets(priv, rq_wq_type,
317316
1 << mlx5_min_log_rq_size(rq_wq_type));
318-
max_rq_size = mlx5e_rx_wqes_to_packets(priv, rq_wq_type,
319-
1 << mlx5_max_log_rq_size(rq_wq_type));
320317
rx_pending_wqes = mlx5e_packets_to_rx_wqes(priv, rq_wq_type,
321318
param->rx_pending);
322319

@@ -326,12 +323,6 @@ int mlx5e_ethtool_set_ringparam(struct mlx5e_priv *priv,
326323
min_rq_size);
327324
return -EINVAL;
328325
}
329-
if (param->rx_pending > max_rq_size) {
330-
netdev_info(priv->netdev, "%s: rx_pending (%d) > max (%d)\n",
331-
__func__, param->rx_pending,
332-
max_rq_size);
333-
return -EINVAL;
334-
}
335326

336327
num_mtts = MLX5E_REQUIRED_MTTS(rx_pending_wqes);
337328
if (priv->channels.params.rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ &&
@@ -347,12 +338,6 @@ int mlx5e_ethtool_set_ringparam(struct mlx5e_priv *priv,
347338
1 << MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE);
348339
return -EINVAL;
349340
}
350-
if (param->tx_pending > (1 << MLX5E_PARAMS_MAXIMUM_LOG_SQ_SIZE)) {
351-
netdev_info(priv->netdev, "%s: tx_pending (%d) > max (%d)\n",
352-
__func__, param->tx_pending,
353-
1 << MLX5E_PARAMS_MAXIMUM_LOG_SQ_SIZE);
354-
return -EINVAL;
355-
}
356341

357342
log_rq_size = order_base_2(rx_pending_wqes);
358343
log_sq_size = order_base_2(param->tx_pending);

net/core/ethtool.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,14 +1693,23 @@ static int ethtool_get_ringparam(struct net_device *dev, void __user *useraddr)
16931693

16941694
static int ethtool_set_ringparam(struct net_device *dev, void __user *useraddr)
16951695
{
1696-
struct ethtool_ringparam ringparam;
1696+
struct ethtool_ringparam ringparam, max = { .cmd = ETHTOOL_GRINGPARAM };
16971697

1698-
if (!dev->ethtool_ops->set_ringparam)
1698+
if (!dev->ethtool_ops->set_ringparam || !dev->ethtool_ops->get_ringparam)
16991699
return -EOPNOTSUPP;
17001700

17011701
if (copy_from_user(&ringparam, useraddr, sizeof(ringparam)))
17021702
return -EFAULT;
17031703

1704+
dev->ethtool_ops->get_ringparam(dev, &max);
1705+
1706+
/* ensure new ring parameters are within the maximums */
1707+
if (ringparam.rx_pending > max.rx_max_pending ||
1708+
ringparam.rx_mini_pending > max.rx_mini_max_pending ||
1709+
ringparam.rx_jumbo_pending > max.rx_jumbo_max_pending ||
1710+
ringparam.tx_pending > max.tx_max_pending)
1711+
return -EINVAL;
1712+
17041713
return dev->ethtool_ops->set_ringparam(dev, &ringparam);
17051714
}
17061715

0 commit comments

Comments
 (0)