aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-07-22 22:53:55 -0400
committerDavid S. Miller <davem@davemloft.net>2014-07-22 22:53:55 -0400
commit2dbe82d0d11836279703dcf2679e711e18c23eec (patch)
treef68f7322365a1af4acc7354672466edd76e627e2
parent7861f12bfd9f63e346b33a2b9841136f541dfbe3 (diff)
parentea1c1af1396cac9f8a1160acdac17f80e4b4f2c4 (diff)
Merge branch 'mlx4-next'
Amir Vadai says: ==================== Mellanox driver update Jul-22-2014 This patchset contains a fix by Eyal to fix a bug in mlx4_en with bonding alb/tlb mode. The second patch, by me, is an ethtool private flag that enable turning off the BlueFlame hardware feature. The last two patches, introduce a new low memory profile for mlx4_en and mlx4_core. This mode is useful when running from a limited resources environment, like kdump. This will reduce the memory consumed by both drivers from more than 100M to ~30M. This patchset was applied and tested on commit 575a193 ("net: mvpp2: Fix error return code in mvpp2_probe") ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_ethtool.c57
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_main.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_rx.c5
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_tx.c13
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c28
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4_en.h6
-rw-r--r--include/linux/mlx4/device.h7
8 files changed, 113 insertions, 11 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index 68d763d2d030..50e85cc1d61f 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -98,6 +98,10 @@ mlx4_en_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo)
98 drvinfo->eedump_len = 0; 98 drvinfo->eedump_len = 0;
99} 99}
100 100
101static const char mlx4_en_priv_flags[][ETH_GSTRING_LEN] = {
102 "blueflame",
103};
104
101static const char main_strings[][ETH_GSTRING_LEN] = { 105static const char main_strings[][ETH_GSTRING_LEN] = {
102 "rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors", 106 "rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors",
103 "tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions", 107 "tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions",
@@ -235,6 +239,8 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset)
235 case ETH_SS_TEST: 239 case ETH_SS_TEST:
236 return MLX4_EN_NUM_SELF_TEST - !(priv->mdev->dev->caps.flags 240 return MLX4_EN_NUM_SELF_TEST - !(priv->mdev->dev->caps.flags
237 & MLX4_DEV_CAP_FLAG_UC_LOOPBACK) * 2; 241 & MLX4_DEV_CAP_FLAG_UC_LOOPBACK) * 2;
242 case ETH_SS_PRIV_FLAGS:
243 return ARRAY_SIZE(mlx4_en_priv_flags);
238 default: 244 default:
239 return -EOPNOTSUPP; 245 return -EOPNOTSUPP;
240 } 246 }
@@ -358,6 +364,12 @@ static void mlx4_en_get_strings(struct net_device *dev,
358#endif 364#endif
359 } 365 }
360 break; 366 break;
367 case ETH_SS_PRIV_FLAGS:
368 for (i = 0; i < ARRAY_SIZE(mlx4_en_priv_flags); i++)
369 strcpy(data + i * ETH_GSTRING_LEN,
370 mlx4_en_priv_flags[i]);
371 break;
372
361 } 373 }
362} 374}
363 375
@@ -1209,6 +1221,49 @@ static int mlx4_en_get_ts_info(struct net_device *dev,
1209 return ret; 1221 return ret;
1210} 1222}
1211 1223
1224int mlx4_en_set_priv_flags(struct net_device *dev, u32 flags)
1225{
1226 struct mlx4_en_priv *priv = netdev_priv(dev);
1227 bool bf_enabled_new = !!(flags & MLX4_EN_PRIV_FLAGS_BLUEFLAME);
1228 bool bf_enabled_old = !!(priv->pflags & MLX4_EN_PRIV_FLAGS_BLUEFLAME);
1229 int i;
1230
1231 if (bf_enabled_new == bf_enabled_old)
1232 return 0; /* Nothing to do */
1233
1234 if (bf_enabled_new) {
1235 bool bf_supported = true;
1236
1237 for (i = 0; i < priv->tx_ring_num; i++)
1238 bf_supported &= priv->tx_ring[i]->bf_alloced;
1239
1240 if (!bf_supported) {
1241 en_err(priv, "BlueFlame is not supported\n");
1242 return -EINVAL;
1243 }
1244
1245 priv->pflags |= MLX4_EN_PRIV_FLAGS_BLUEFLAME;
1246 } else {
1247 priv->pflags &= ~MLX4_EN_PRIV_FLAGS_BLUEFLAME;
1248 }
1249
1250 for (i = 0; i < priv->tx_ring_num; i++)
1251 priv->tx_ring[i]->bf_enabled = bf_enabled_new;
1252
1253 en_info(priv, "BlueFlame %s\n",
1254 bf_enabled_new ? "Enabled" : "Disabled");
1255
1256 return 0;
1257}
1258
1259u32 mlx4_en_get_priv_flags(struct net_device *dev)
1260{
1261 struct mlx4_en_priv *priv = netdev_priv(dev);
1262
1263 return priv->pflags;
1264}
1265
1266
1212const struct ethtool_ops mlx4_en_ethtool_ops = { 1267const struct ethtool_ops mlx4_en_ethtool_ops = {
1213 .get_drvinfo = mlx4_en_get_drvinfo, 1268 .get_drvinfo = mlx4_en_get_drvinfo,
1214 .get_settings = mlx4_en_get_settings, 1269 .get_settings = mlx4_en_get_settings,
@@ -1236,6 +1291,8 @@ const struct ethtool_ops mlx4_en_ethtool_ops = {
1236 .get_channels = mlx4_en_get_channels, 1291 .get_channels = mlx4_en_get_channels,
1237 .set_channels = mlx4_en_set_channels, 1292 .set_channels = mlx4_en_set_channels,
1238 .get_ts_info = mlx4_en_get_ts_info, 1293 .get_ts_info = mlx4_en_get_ts_info,
1294 .set_priv_flags = mlx4_en_set_priv_flags,
1295 .get_priv_flags = mlx4_en_get_priv_flags,
1239}; 1296};
1240 1297
1241 1298
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_main.c b/drivers/net/ethernet/mellanox/mlx4/en_main.c
index f953c1d7eae6..3626fdf4cb5d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_main.c
@@ -129,8 +129,10 @@ static int mlx4_en_get_profile(struct mlx4_en_dev *mdev)
129 int i; 129 int i;
130 130
131 params->udp_rss = udp_rss; 131 params->udp_rss = udp_rss;
132 params->num_tx_rings_p_up = min_t(int, num_online_cpus(), 132 params->num_tx_rings_p_up = mlx4_low_memory_profile() ?
133 MLX4_EN_MAX_TX_RING_P_UP); 133 MLX4_EN_MIN_TX_RING_P_UP :
134 min_t(int, num_online_cpus(), MLX4_EN_MAX_TX_RING_P_UP);
135
134 if (params->udp_rss && !(mdev->dev->caps.flags 136 if (params->udp_rss && !(mdev->dev->caps.flags
135 & MLX4_DEV_CAP_FLAG_UDP_RSS)) { 137 & MLX4_DEV_CAP_FLAG_UDP_RSS)) {
136 mlx4_warn(mdev, "UDP RSS is not supported on this device\n"); 138 mlx4_warn(mdev, "UDP RSS is not supported on this device\n");
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 887cf01d831d..bb536aa613f4 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -644,6 +644,7 @@ static int mlx4_en_get_qp(struct mlx4_en_priv *priv)
644 goto alloc_err; 644 goto alloc_err;
645 } 645 }
646 memcpy(entry->mac, priv->dev->dev_addr, sizeof(entry->mac)); 646 memcpy(entry->mac, priv->dev->dev_addr, sizeof(entry->mac));
647 memcpy(priv->current_mac, entry->mac, sizeof(priv->current_mac));
647 entry->reg_id = reg_id; 648 entry->reg_id = reg_id;
648 649
649 hlist_add_head_rcu(&entry->hlist, 650 hlist_add_head_rcu(&entry->hlist,
@@ -2464,6 +2465,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
2464 priv->port = port; 2465 priv->port = port;
2465 priv->port_up = false; 2466 priv->port_up = false;
2466 priv->flags = prof->flags; 2467 priv->flags = prof->flags;
2468 priv->pflags = MLX4_EN_PRIV_FLAGS_BLUEFLAME;
2467 priv->ctrl_flags = cpu_to_be32(MLX4_WQE_CTRL_CQ_UPDATE | 2469 priv->ctrl_flags = cpu_to_be32(MLX4_WQE_CTRL_CQ_UPDATE |
2468 MLX4_WQE_CTRL_SOLICITED); 2470 MLX4_WQE_CTRL_SOLICITED);
2469 priv->num_tx_rings_p_up = mdev->profile.num_tx_rings_p_up; 2471 priv->num_tx_rings_p_up = mdev->profile.num_tx_rings_p_up;
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index 7765a08f9e84..9c909d23f14c 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -335,8 +335,9 @@ void mlx4_en_set_num_rx_rings(struct mlx4_en_dev *mdev)
335 dev->caps.comp_pool/ 335 dev->caps.comp_pool/
336 dev->caps.num_ports) - 1; 336 dev->caps.num_ports) - 1;
337 337
338 num_rx_rings = min_t(int, num_of_eqs, 338 num_rx_rings = mlx4_low_memory_profile() ? MIN_RX_RINGS :
339 netif_get_num_default_rss_queues()); 339 min_t(int, num_of_eqs,
340 netif_get_num_default_rss_queues());
340 mdev->profile.prof[i].rx_ring_num = 341 mdev->profile.prof[i].rx_ring_num =
341 rounddown_pow_of_two(num_rx_rings); 342 rounddown_pow_of_two(num_rx_rings);
342 } 343 }
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
index 5045bab59633..dae3da6d8dd0 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
@@ -126,8 +126,13 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
126 ring->bf.uar = &mdev->priv_uar; 126 ring->bf.uar = &mdev->priv_uar;
127 ring->bf.uar->map = mdev->uar_map; 127 ring->bf.uar->map = mdev->uar_map;
128 ring->bf_enabled = false; 128 ring->bf_enabled = false;
129 } else 129 ring->bf_alloced = false;
130 ring->bf_enabled = true; 130 priv->pflags &= ~MLX4_EN_PRIV_FLAGS_BLUEFLAME;
131 } else {
132 ring->bf_alloced = true;
133 ring->bf_enabled = !!(priv->pflags &
134 MLX4_EN_PRIV_FLAGS_BLUEFLAME);
135 }
131 136
132 ring->hwtstamp_tx_type = priv->hwtstamp_config.tx_type; 137 ring->hwtstamp_tx_type = priv->hwtstamp_config.tx_type;
133 ring->queue_index = queue_index; 138 ring->queue_index = queue_index;
@@ -161,7 +166,7 @@ void mlx4_en_destroy_tx_ring(struct mlx4_en_priv *priv,
161 struct mlx4_en_tx_ring *ring = *pring; 166 struct mlx4_en_tx_ring *ring = *pring;
162 en_dbg(DRV, priv, "Destroying tx ring, qpn: %d\n", ring->qpn); 167 en_dbg(DRV, priv, "Destroying tx ring, qpn: %d\n", ring->qpn);
163 168
164 if (ring->bf_enabled) 169 if (ring->bf_alloced)
165 mlx4_bf_free(mdev->dev, &ring->bf); 170 mlx4_bf_free(mdev->dev, &ring->bf);
166 mlx4_qp_remove(mdev->dev, &ring->qp); 171 mlx4_qp_remove(mdev->dev, &ring->qp);
167 mlx4_qp_free(mdev->dev, &ring->qp); 172 mlx4_qp_free(mdev->dev, &ring->qp);
@@ -195,7 +200,7 @@ int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv,
195 200
196 mlx4_en_fill_qp_context(priv, ring->size, ring->stride, 1, 0, ring->qpn, 201 mlx4_en_fill_qp_context(priv, ring->size, ring->stride, 1, 0, ring->qpn,
197 ring->cqn, user_prio, &ring->context); 202 ring->cqn, user_prio, &ring->context);
198 if (ring->bf_enabled) 203 if (ring->bf_alloced)
199 ring->context.usr_page = cpu_to_be32(ring->bf.uar->index); 204 ring->context.usr_page = cpu_to_be32(ring->bf.uar->index);
200 205
201 err = mlx4_qp_to_ready(mdev->dev, &ring->wqres.mtt, &ring->context, 206 err = mlx4_qp_to_ready(mdev->dev, &ring->wqres.mtt, &ring->context,
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 82ab427290c3..80b8c5f30e4e 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -120,6 +120,16 @@ static struct mlx4_profile default_profile = {
120 .num_mtt = 1 << 20, /* It is really num mtt segements */ 120 .num_mtt = 1 << 20, /* It is really num mtt segements */
121}; 121};
122 122
123static struct mlx4_profile low_mem_profile = {
124 .num_qp = 1 << 17,
125 .num_srq = 1 << 6,
126 .rdmarc_per_qp = 1 << 4,
127 .num_cq = 1 << 8,
128 .num_mcg = 1 << 8,
129 .num_mpt = 1 << 9,
130 .num_mtt = 1 << 7,
131};
132
123static int log_num_mac = 7; 133static int log_num_mac = 7;
124module_param_named(log_num_mac, log_num_mac, int, 0444); 134module_param_named(log_num_mac, log_num_mac, int, 0444);
125MODULE_PARM_DESC(log_num_mac, "Log2 max number of MACs per ETH port (1-7)"); 135MODULE_PARM_DESC(log_num_mac, "Log2 max number of MACs per ETH port (1-7)");
@@ -129,6 +139,8 @@ module_param_named(log_num_vlan, log_num_vlan, int, 0444);
129MODULE_PARM_DESC(log_num_vlan, "Log2 max number of VLANs per ETH port (0-7)"); 139MODULE_PARM_DESC(log_num_vlan, "Log2 max number of VLANs per ETH port (0-7)");
130/* Log2 max number of VLANs per ETH port (0-7) */ 140/* Log2 max number of VLANs per ETH port (0-7) */
131#define MLX4_LOG_NUM_VLANS 7 141#define MLX4_LOG_NUM_VLANS 7
142#define MLX4_MIN_LOG_NUM_VLANS 0
143#define MLX4_MIN_LOG_NUM_MAC 1
132 144
133static bool use_prio; 145static bool use_prio;
134module_param_named(use_prio, use_prio, bool, 0444); 146module_param_named(use_prio, use_prio, bool, 0444);
@@ -287,8 +299,13 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
287 if (mlx4_is_mfunc(dev)) 299 if (mlx4_is_mfunc(dev))
288 dev->caps.flags &= ~MLX4_DEV_CAP_FLAG_SENSE_SUPPORT; 300 dev->caps.flags &= ~MLX4_DEV_CAP_FLAG_SENSE_SUPPORT;
289 301
290 dev->caps.log_num_macs = log_num_mac; 302 if (mlx4_low_memory_profile()) {
291 dev->caps.log_num_vlans = MLX4_LOG_NUM_VLANS; 303 dev->caps.log_num_macs = MLX4_MIN_LOG_NUM_MAC;
304 dev->caps.log_num_vlans = MLX4_MIN_LOG_NUM_VLANS;
305 } else {
306 dev->caps.log_num_macs = log_num_mac;
307 dev->caps.log_num_vlans = MLX4_LOG_NUM_VLANS;
308 }
292 309
293 for (i = 1; i <= dev->caps.num_ports; ++i) { 310 for (i = 1; i <= dev->caps.num_ports; ++i) {
294 dev->caps.port_type[i] = MLX4_PORT_TYPE_NONE; 311 dev->caps.port_type[i] = MLX4_PORT_TYPE_NONE;
@@ -1587,7 +1604,12 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
1587 if (mlx4_is_master(dev)) 1604 if (mlx4_is_master(dev))
1588 mlx4_parav_master_pf_caps(dev); 1605 mlx4_parav_master_pf_caps(dev);
1589 1606
1590 profile = default_profile; 1607 if (mlx4_low_memory_profile()) {
1608 mlx4_info(dev, "Running from within kdump kernel. Using low memory profile\n");
1609 profile = low_mem_profile;
1610 } else {
1611 profile = default_profile;
1612 }
1591 if (dev->caps.steering_mode == 1613 if (dev->caps.steering_mode ==
1592 MLX4_STEERING_MODE_DEVICE_MANAGED) 1614 MLX4_STEERING_MODE_DEVICE_MANAGED)
1593 profile.num_mcg = MLX4_FS_NUM_MCG; 1615 profile.num_mcg = MLX4_FS_NUM_MCG;
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index 2b19dd1f2c5d..3de41be49425 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -93,6 +93,8 @@
93 * OS related constants and tunables 93 * OS related constants and tunables
94 */ 94 */
95 95
96#define MLX4_EN_PRIV_FLAGS_BLUEFLAME 1
97
96#define MLX4_EN_WATCHDOG_TIMEOUT (15 * HZ) 98#define MLX4_EN_WATCHDOG_TIMEOUT (15 * HZ)
97 99
98/* Use the maximum between 16384 and a single page */ 100/* Use the maximum between 16384 and a single page */
@@ -119,6 +121,7 @@ enum {
119#define MLX4_EN_MIN_TX_SIZE (4096 / TXBB_SIZE) 121#define MLX4_EN_MIN_TX_SIZE (4096 / TXBB_SIZE)
120 122
121#define MLX4_EN_SMALL_PKT_SIZE 64 123#define MLX4_EN_SMALL_PKT_SIZE 64
124#define MLX4_EN_MIN_TX_RING_P_UP 1
122#define MLX4_EN_MAX_TX_RING_P_UP 32 125#define MLX4_EN_MAX_TX_RING_P_UP 32
123#define MLX4_EN_NUM_UP 8 126#define MLX4_EN_NUM_UP 8
124#define MLX4_EN_DEF_TX_RING_SIZE 512 127#define MLX4_EN_DEF_TX_RING_SIZE 512
@@ -278,6 +281,7 @@ struct mlx4_en_tx_ring {
278 unsigned long wake_queue; 281 unsigned long wake_queue;
279 struct mlx4_bf bf; 282 struct mlx4_bf bf;
280 bool bf_enabled; 283 bool bf_enabled;
284 bool bf_alloced;
281 struct netdev_queue *tx_queue; 285 struct netdev_queue *tx_queue;
282 int hwtstamp_tx_type; 286 int hwtstamp_tx_type;
283 int inline_thold; 287 int inline_thold;
@@ -592,6 +596,8 @@ struct mlx4_en_priv {
592#endif 596#endif
593 u64 tunnel_reg_id; 597 u64 tunnel_reg_id;
594 __be16 vxlan_port; 598 __be16 vxlan_port;
599
600 u32 pflags;
595}; 601};
596 602
597enum mlx4_en_wol { 603enum mlx4_en_wol {
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index fa660aedb822..e15b1544ea83 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -1254,4 +1254,11 @@ int mlx4_vf_smi_enabled(struct mlx4_dev *dev, int slave, int port);
1254int mlx4_vf_get_enable_smi_admin(struct mlx4_dev *dev, int slave, int port); 1254int mlx4_vf_get_enable_smi_admin(struct mlx4_dev *dev, int slave, int port);
1255int mlx4_vf_set_enable_smi_admin(struct mlx4_dev *dev, int slave, int port, 1255int mlx4_vf_set_enable_smi_admin(struct mlx4_dev *dev, int slave, int port,
1256 int enable); 1256 int enable);
1257
1258/* Returns true if running in low memory profile (kdump kernel) */
1259static inline bool mlx4_low_memory_profile(void)
1260{
1261 return reset_devices;
1262}
1263
1257#endif /* MLX4_DEVICE_H */ 1264#endif /* MLX4_DEVICE_H */