Skip to content

Commit 9a94d76

Browse files
committed
Merge tag 'mlx5-updates-2023-06-16' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
mlx5-updates-2023-06-16 1) Added a new event handler to firmware sync reset, which is used to support firmware sync reset flow on smart NIC. Adding this new stage to the flow enables the firmware to ensure host PFs unload before ECPFs unload, to avoid race of PFs recovery. 2) Debugfs for mlx5 eswitch bridge offloads 3) Added two new counters for vport stats 4) Minor Fixups and cleanups for net-next branch Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 2dc6af8 + 5f2cf75 commit 9a94d76

33 files changed

Lines changed: 435 additions & 167 deletions

File tree

Documentation/networking/device_drivers/ethernet/mellanox/mlx5/counters.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,16 @@ Counters on the NIC port that is connected to a eSwitch.
797797
RoCE/UD/RC traffic) [#accel]_.
798798
- Acceleration
799799

800+
* - `vport_loopback_packets`
801+
- Unicast, multicast and broadcast packets that were loop-back (received
802+
and transmitted), IB/Eth [#accel]_.
803+
- Acceleration
804+
805+
* - `vport_loopback_bytes`
806+
- Unicast, multicast and broadcast bytes that were loop-back (received
807+
and transmitted), IB/Eth [#accel]_.
808+
- Acceleration
809+
800810
* - `rx_steer_missed_packets`
801811
- Number of packets that was received by the NIC, however was discarded
802812
because it did not match any flow in the NIC flow table.

drivers/net/ethernet/mellanox/mlx5/core/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ mlx5_core-$(CONFIG_MLX5_ESWITCH) += esw/acl/helper.o \
7575
esw/acl/egress_lgcy.o esw/acl/egress_ofld.o \
7676
esw/acl/ingress_lgcy.o esw/acl/ingress_ofld.o
7777

78-
mlx5_core-$(CONFIG_MLX5_BRIDGE) += esw/bridge.o esw/bridge_mcast.o en/rep/bridge.o
78+
mlx5_core-$(CONFIG_MLX5_BRIDGE) += esw/bridge.o esw/bridge_mcast.o esw/bridge_debugfs.o \
79+
en/rep/bridge.o
7980

8081
mlx5_core-$(CONFIG_THERMAL) += thermal.o
8182
mlx5_core-$(CONFIG_MLX5_MPFS) += lib/mpfs.o

drivers/net/ethernet/mellanox/mlx5/core/en.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -165,15 +165,6 @@ struct page_pool;
165165
#define MLX5E_MAX_KLM_PER_WQE(mdev) \
166166
MLX5E_KLM_ENTRIES_PER_WQE(MLX5_SEND_WQE_BB * mlx5e_get_max_sq_aligned_wqebbs(mdev))
167167

168-
#define MLX5E_MSG_LEVEL NETIF_MSG_LINK
169-
170-
#define mlx5e_dbg(mlevel, priv, format, ...) \
171-
do { \
172-
if (NETIF_MSG_##mlevel & (priv)->msglevel) \
173-
netdev_warn(priv->netdev, format, \
174-
##__VA_ARGS__); \
175-
} while (0)
176-
177168
#define mlx5e_state_dereference(priv, p) \
178169
rcu_dereference_protected((p), lockdep_is_held(&(priv)->state_lock))
179170

@@ -880,7 +871,6 @@ struct mlx5e_priv {
880871
#endif
881872
/* priv data path fields - end */
882873

883-
u32 msglevel;
884874
unsigned long state;
885875
struct mutex state_lock; /* Protects Interface state */
886876
struct mlx5e_rq drop_rq;

drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,13 @@ int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
6565
MLX5_GET(bufferx_reg, buffer, xoff_threshold) * port_buff_cell_sz;
6666
total_used += port_buffer->buffer[i].size;
6767

68-
mlx5e_dbg(HW, priv, "buffer %d: size=%d, xon=%d, xoff=%d, epsb=%d, lossy=%d\n", i,
69-
port_buffer->buffer[i].size,
70-
port_buffer->buffer[i].xon,
71-
port_buffer->buffer[i].xoff,
72-
port_buffer->buffer[i].epsb,
73-
port_buffer->buffer[i].lossy);
68+
netdev_dbg(priv->netdev, "buffer %d: size=%d, xon=%d, xoff=%d, epsb=%d, lossy=%d\n",
69+
i,
70+
port_buffer->buffer[i].size,
71+
port_buffer->buffer[i].xon,
72+
port_buffer->buffer[i].xoff,
73+
port_buffer->buffer[i].epsb,
74+
port_buffer->buffer[i].lossy);
7475
}
7576

7677
port_buffer->internal_buffers_size = 0;
@@ -87,11 +88,11 @@ int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
8788
port_buffer->internal_buffers_size -
8889
port_buffer->headroom_size;
8990

90-
mlx5e_dbg(HW, priv,
91-
"total buffer size=%u, headroom buffer size=%u, internal buffers size=%u, spare buffer size=%u\n",
92-
port_buffer->port_buffer_size, port_buffer->headroom_size,
93-
port_buffer->internal_buffers_size,
94-
port_buffer->spare_buffer_size);
91+
netdev_dbg(priv->netdev,
92+
"total buffer size=%u, headroom buffer size=%u, internal buffers size=%u, spare buffer size=%u\n",
93+
port_buffer->port_buffer_size, port_buffer->headroom_size,
94+
port_buffer->internal_buffers_size,
95+
port_buffer->spare_buffer_size);
9596
out:
9697
kfree(out);
9798
return err;
@@ -352,7 +353,7 @@ static u32 calculate_xoff(struct mlx5e_priv *priv, unsigned int mtu)
352353

353354
xoff = (301 + 216 * priv->dcbx.cable_len / 100) * speed / 1000 + 272 * mtu / 100;
354355

355-
mlx5e_dbg(HW, priv, "%s: xoff=%d\n", __func__, xoff);
356+
netdev_dbg(priv->netdev, "%s: xoff=%d\n", __func__, xoff);
356357
return xoff;
357358
}
358359

@@ -484,6 +485,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
484485
u8 *prio2buffer)
485486
{
486487
u16 port_buff_cell_sz = priv->dcbx.port_buff_cell_sz;
488+
struct net_device *netdev = priv->netdev;
487489
struct mlx5e_port_buffer port_buffer;
488490
u32 xoff = calculate_xoff(priv, mtu);
489491
bool update_prio2buffer = false;
@@ -495,7 +497,7 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
495497
int err;
496498
int i;
497499

498-
mlx5e_dbg(HW, priv, "%s: change=%x\n", __func__, change);
500+
netdev_dbg(netdev, "%s: change=%x\n", __func__, change);
499501
max_mtu = max_t(unsigned int, priv->netdev->max_mtu, MINIMUM_MAX_MTU);
500502

501503
err = mlx5e_port_query_buffer(priv, &port_buffer);
@@ -510,8 +512,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
510512
}
511513

512514
if (change & MLX5E_PORT_BUFFER_PFC) {
513-
mlx5e_dbg(HW, priv, "%s: requested PFC per priority bitmask: 0x%x\n",
514-
__func__, pfc->pfc_en);
515+
netdev_dbg(netdev, "%s: requested PFC per priority bitmask: 0x%x\n",
516+
__func__, pfc->pfc_en);
515517
err = mlx5e_port_query_priority2buffer(priv->mdev, buffer);
516518
if (err)
517519
return err;
@@ -526,8 +528,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
526528
if (change & MLX5E_PORT_BUFFER_PRIO2BUFFER) {
527529
update_prio2buffer = true;
528530
for (i = 0; i < MLX5E_MAX_NETWORK_BUFFER; i++)
529-
mlx5e_dbg(HW, priv, "%s: requested to map prio[%d] to buffer %d\n",
530-
__func__, i, prio2buffer[i]);
531+
netdev_dbg(priv->netdev, "%s: requested to map prio[%d] to buffer %d\n",
532+
__func__, i, prio2buffer[i]);
531533

532534
err = fill_pfc_en(priv->mdev, &curr_pfc_en);
533535
if (err)
@@ -541,18 +543,18 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
541543

542544
if (change & MLX5E_PORT_BUFFER_SIZE) {
543545
for (i = 0; i < MLX5E_MAX_NETWORK_BUFFER; i++) {
544-
mlx5e_dbg(HW, priv, "%s: buffer[%d]=%d\n", __func__, i, buffer_size[i]);
546+
netdev_dbg(priv->netdev, "%s: buffer[%d]=%d\n", __func__, i, buffer_size[i]);
545547
if (!port_buffer.buffer[i].lossy && !buffer_size[i]) {
546-
mlx5e_dbg(HW, priv, "%s: lossless buffer[%d] size cannot be zero\n",
547-
__func__, i);
548+
netdev_dbg(priv->netdev, "%s: lossless buffer[%d] size cannot be zero\n",
549+
__func__, i);
548550
return -EINVAL;
549551
}
550552

551553
port_buffer.buffer[i].size = buffer_size[i];
552554
total_used += buffer_size[i];
553555
}
554556

555-
mlx5e_dbg(HW, priv, "%s: total buffer requested=%d\n", __func__, total_used);
557+
netdev_dbg(priv->netdev, "%s: total buffer requested=%d\n", __func__, total_used);
556558

557559
if (total_used > port_buffer.headroom_size &&
558560
(total_used - port_buffer.headroom_size) >

drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ static int mlx5_esw_bridge_port_changeupper(struct notifier_block *nb, void *ptr
136136
struct mlx5_eswitch *esw = br_offloads->esw;
137137
u16 vport_num, esw_owner_vhca_id;
138138
struct netlink_ext_ack *extack;
139-
int ifindex = upper->ifindex;
140139
int err = 0;
141140

142141
if (!netif_is_bridge_master(upper))
@@ -150,15 +149,15 @@ static int mlx5_esw_bridge_port_changeupper(struct notifier_block *nb, void *ptr
150149

151150
if (mlx5_esw_bridge_is_local(dev, rep, esw))
152151
err = info->linking ?
153-
mlx5_esw_bridge_vport_link(ifindex, vport_num, esw_owner_vhca_id,
152+
mlx5_esw_bridge_vport_link(upper, vport_num, esw_owner_vhca_id,
154153
br_offloads, extack) :
155-
mlx5_esw_bridge_vport_unlink(ifindex, vport_num, esw_owner_vhca_id,
154+
mlx5_esw_bridge_vport_unlink(upper, vport_num, esw_owner_vhca_id,
156155
br_offloads, extack);
157156
else if (mlx5_esw_bridge_dev_same_hw(rep, esw))
158157
err = info->linking ?
159-
mlx5_esw_bridge_vport_peer_link(ifindex, vport_num, esw_owner_vhca_id,
158+
mlx5_esw_bridge_vport_peer_link(upper, vport_num, esw_owner_vhca_id,
160159
br_offloads, extack) :
161-
mlx5_esw_bridge_vport_peer_unlink(ifindex, vport_num, esw_owner_vhca_id,
160+
mlx5_esw_bridge_vport_peer_unlink(upper, vport_num, esw_owner_vhca_id,
162161
br_offloads, extack);
163162

164163
return err;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -570,10 +570,10 @@ static struct mlx5_flow_handle *arfs_add_rule(struct mlx5e_priv *priv,
570570
if (IS_ERR(rule)) {
571571
err = PTR_ERR(rule);
572572
priv->channel_stats[arfs_rule->rxq]->rq.arfs_err++;
573-
mlx5e_dbg(HW, priv,
574-
"%s: add rule(filter id=%d, rq idx=%d, ip proto=0x%x) failed,err=%d\n",
575-
__func__, arfs_rule->filter_id, arfs_rule->rxq,
576-
tuple->ip_proto, err);
573+
netdev_dbg(priv->netdev,
574+
"%s: add rule(filter id=%d, rq idx=%d, ip proto=0x%x) failed,err=%d\n",
575+
__func__, arfs_rule->filter_id, arfs_rule->rxq,
576+
tuple->ip_proto, err);
577577
}
578578

579579
out:

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -275,10 +275,10 @@ static int mlx5e_dcbnl_ieee_setets_core(struct mlx5e_priv *priv, struct ieee_ets
275275
memcpy(priv->dcbx.tc_tsa, ets->tc_tsa, sizeof(ets->tc_tsa));
276276

277277
for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) {
278-
mlx5e_dbg(HW, priv, "%s: prio_%d <=> tc_%d\n",
279-
__func__, i, ets->prio_tc[i]);
280-
mlx5e_dbg(HW, priv, "%s: tc_%d <=> tx_bw_%d%%, group_%d\n",
281-
__func__, i, tc_tx_bw[i], tc_group[i]);
278+
netdev_dbg(priv->netdev, "%s: prio_%d <=> tc_%d\n",
279+
__func__, i, ets->prio_tc[i]);
280+
netdev_dbg(priv->netdev, "%s: tc_%d <=> tx_bw_%d%%, group_%d\n",
281+
__func__, i, tc_tx_bw[i], tc_group[i]);
282282
}
283283

284284
return err;
@@ -399,9 +399,9 @@ static int mlx5e_dcbnl_ieee_setpfc(struct net_device *dev,
399399
}
400400

401401
if (!ret) {
402-
mlx5e_dbg(HW, priv,
403-
"%s: PFC per priority bit mask: 0x%x\n",
404-
__func__, pfc->pfc_en);
402+
netdev_dbg(dev,
403+
"%s: PFC per priority bit mask: 0x%x\n",
404+
__func__, pfc->pfc_en);
405405
}
406406
return ret;
407407
}
@@ -611,8 +611,8 @@ static int mlx5e_dcbnl_ieee_setmaxrate(struct net_device *netdev,
611611
}
612612

613613
for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) {
614-
mlx5e_dbg(HW, priv, "%s: tc_%d <=> max_bw %d Gbps\n",
615-
__func__, i, max_bw_value[i]);
614+
netdev_dbg(netdev, "%s: tc_%d <=> max_bw %d Gbps\n",
615+
__func__, i, max_bw_value[i]);
616616
}
617617

618618
return mlx5_modify_port_ets_rate_limit(mdev, max_bw_value, max_bw_unit);
@@ -640,10 +640,10 @@ static u8 mlx5e_dcbnl_setall(struct net_device *netdev)
640640
ets.tc_rx_bw[i] = cee_cfg->pg_bw_pct[i];
641641
ets.tc_tsa[i] = IEEE_8021QAZ_TSA_ETS;
642642
ets.prio_tc[i] = cee_cfg->prio_to_pg_map[i];
643-
mlx5e_dbg(HW, priv,
644-
"%s: Priority group %d: tx_bw %d, rx_bw %d, prio_tc %d\n",
645-
__func__, i, ets.tc_tx_bw[i], ets.tc_rx_bw[i],
646-
ets.prio_tc[i]);
643+
netdev_dbg(netdev,
644+
"%s: Priority group %d: tx_bw %d, rx_bw %d, prio_tc %d\n",
645+
__func__, i, ets.tc_tx_bw[i], ets.tc_rx_bw[i],
646+
ets.prio_tc[i]);
647647
}
648648

649649
err = mlx5e_dbcnl_validate_ets(netdev, &ets, true);

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

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,16 +1689,6 @@ static int mlx5e_set_fecparam(struct net_device *netdev,
16891689
return 0;
16901690
}
16911691

1692-
static u32 mlx5e_get_msglevel(struct net_device *dev)
1693-
{
1694-
return ((struct mlx5e_priv *)netdev_priv(dev))->msglevel;
1695-
}
1696-
1697-
static void mlx5e_set_msglevel(struct net_device *dev, u32 val)
1698-
{
1699-
((struct mlx5e_priv *)netdev_priv(dev))->msglevel = val;
1700-
}
1701-
17021692
static int mlx5e_set_phys_id(struct net_device *dev,
17031693
enum ethtool_phys_id_state state)
17041694
{
@@ -1952,9 +1942,9 @@ int mlx5e_modify_rx_cqe_compression_locked(struct mlx5e_priv *priv, bool new_val
19521942
if (err)
19531943
return err;
19541944

1955-
mlx5e_dbg(DRV, priv, "MLX5E: RxCqeCmprss was turned %s\n",
1956-
MLX5E_GET_PFLAG(&priv->channels.params,
1957-
MLX5E_PFLAG_RX_CQE_COMPRESS) ? "ON" : "OFF");
1945+
netdev_dbg(priv->netdev, "MLX5E: RxCqeCmprss was turned %s\n",
1946+
MLX5E_GET_PFLAG(&priv->channels.params,
1947+
MLX5E_PFLAG_RX_CQE_COMPRESS) ? "ON" : "OFF");
19581948

19591949
return 0;
19601950
}
@@ -2444,8 +2434,6 @@ const struct ethtool_ops mlx5e_ethtool_ops = {
24442434
.get_priv_flags = mlx5e_get_priv_flags,
24452435
.set_priv_flags = mlx5e_set_priv_flags,
24462436
.self_test = mlx5e_self_test,
2447-
.get_msglevel = mlx5e_get_msglevel,
2448-
.set_msglevel = mlx5e_set_msglevel,
24492437
.get_fec_stats = mlx5e_get_fec_stats,
24502438
.get_fecparam = mlx5e_get_fecparam,
24512439
.set_fecparam = mlx5e_set_fecparam,

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2401,7 +2401,7 @@ static int mlx5e_channel_stats_alloc(struct mlx5e_priv *priv, int ix, int cpu)
24012401
/* Asymmetric dynamic memory allocation.
24022402
* Freed in mlx5e_priv_arrays_free, not on channel closure.
24032403
*/
2404-
mlx5e_dbg(DRV, priv, "Creating channel stats %d\n", ix);
2404+
netdev_dbg(priv->netdev, "Creating channel stats %d\n", ix);
24052405
priv->channel_stats[ix] = kvzalloc_node(sizeof(**priv->channel_stats),
24062406
GFP_KERNEL, cpu_to_node(cpu));
24072407
if (!priv->channel_stats[ix])
@@ -2779,7 +2779,7 @@ int mlx5e_update_tx_netdev_queues(struct mlx5e_priv *priv)
27792779
if (MLX5E_GET_PFLAG(&priv->channels.params, MLX5E_PFLAG_TX_PORT_TS))
27802780
num_txqs += ntc;
27812781

2782-
mlx5e_dbg(DRV, priv, "Setting num_txqs %d\n", num_txqs);
2782+
netdev_dbg(priv->netdev, "Setting num_txqs %d\n", num_txqs);
27832783
err = netif_set_real_num_tx_queues(priv->netdev, num_txqs);
27842784
if (err)
27852785
netdev_warn(priv->netdev, "netif_set_real_num_tx_queues failed, %d\n", err);
@@ -5585,7 +5585,6 @@ int mlx5e_priv_init(struct mlx5e_priv *priv,
55855585
/* priv init */
55865586
priv->mdev = mdev;
55875587
priv->netdev = netdev;
5588-
priv->msglevel = MLX5E_MSG_LEVEL;
55895588
priv->max_nch = nch;
55905589
priv->max_opened_tc = 1;
55915590

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
* SOFTWARE.
3131
*/
3232

33-
#include "lib/mlx5.h"
33+
#include "lib/events.h"
3434
#include "en.h"
3535
#include "en_accel/ktls.h"
3636
#include "en_accel/en_accel.h"
@@ -748,11 +748,22 @@ static const struct counter_desc vport_stats_desc[] = {
748748
VPORT_COUNTER_OFF(transmitted_ib_multicast.octets) },
749749
};
750750

751+
static const struct counter_desc vport_loopback_stats_desc[] = {
752+
{ "vport_loopback_packets",
753+
VPORT_COUNTER_OFF(local_loopback.packets) },
754+
{ "vport_loopback_bytes",
755+
VPORT_COUNTER_OFF(local_loopback.octets) },
756+
};
757+
751758
#define NUM_VPORT_COUNTERS ARRAY_SIZE(vport_stats_desc)
759+
#define NUM_VPORT_LOOPBACK_COUNTERS(dev) \
760+
(MLX5_CAP_GEN(dev, vport_counter_local_loopback) ? \
761+
ARRAY_SIZE(vport_loopback_stats_desc) : 0)
752762

753763
static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vport)
754764
{
755-
return NUM_VPORT_COUNTERS;
765+
return NUM_VPORT_COUNTERS +
766+
NUM_VPORT_LOOPBACK_COUNTERS(priv->mdev);
756767
}
757768

758769
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vport)
@@ -761,6 +772,11 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vport)
761772

762773
for (i = 0; i < NUM_VPORT_COUNTERS; i++)
763774
strcpy(data + (idx++) * ETH_GSTRING_LEN, vport_stats_desc[i].format);
775+
776+
for (i = 0; i < NUM_VPORT_LOOPBACK_COUNTERS(priv->mdev); i++)
777+
strcpy(data + (idx++) * ETH_GSTRING_LEN,
778+
vport_loopback_stats_desc[i].format);
779+
764780
return idx;
765781
}
766782

@@ -771,6 +787,11 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vport)
771787
for (i = 0; i < NUM_VPORT_COUNTERS; i++)
772788
data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out,
773789
vport_stats_desc, i);
790+
791+
for (i = 0; i < NUM_VPORT_LOOPBACK_COUNTERS(priv->mdev); i++)
792+
data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out,
793+
vport_loopback_stats_desc, i);
794+
774795
return idx;
775796
}
776797

0 commit comments

Comments
 (0)