Skip to content

Commit 2d1c882

Browse files
committed
Merge tag 'mlx5-fixes-2023-10-12' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed says: ==================== mlx5 fixes 2023-10-12 This series provides bug fixes to mlx5 driver. * tag 'mlx5-fixes-2023-10-12' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux: net/mlx5e: Fix VF representors reporting zero counters to "ip -s" command net/mlx5e: Don't offload internal port if filter device is out device net/mlx5e: Take RTNL lock before triggering netdev notifiers net/mlx5e: XDP, Fix XDP_REDIRECT mpwqe page fragment leaks on shutdown net/mlx5e: RX, Fix page_pool allocation failure recovery for legacy rq net/mlx5e: RX, Fix page_pool allocation failure recovery for striding rq net/mlx5: Handle fw tracer change ownership event based on MTRC net/mlx5: Bridge, fix peer entry ageing in LAG mode net/mlx5: E-switch, register event handler before arming the event net/mlx5: Perform DMA operations in the right locations ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents aeae0ef + 80f1241 commit 2d1c882

File tree

13 files changed

+130
-65
lines changed

13 files changed

+130
-65
lines changed

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

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2186,52 +2186,23 @@ static u16 cmdif_rev(struct mlx5_core_dev *dev)
21862186

21872187
int mlx5_cmd_init(struct mlx5_core_dev *dev)
21882188
{
2189-
int size = sizeof(struct mlx5_cmd_prot_block);
2190-
int align = roundup_pow_of_two(size);
21912189
struct mlx5_cmd *cmd = &dev->cmd;
2192-
u32 cmd_l;
2193-
int err;
2194-
2195-
cmd->pool = dma_pool_create("mlx5_cmd", mlx5_core_dma_dev(dev), size, align, 0);
2196-
if (!cmd->pool)
2197-
return -ENOMEM;
21982190

2199-
err = alloc_cmd_page(dev, cmd);
2200-
if (err)
2201-
goto err_free_pool;
2202-
2203-
cmd_l = (u32)(cmd->dma);
2204-
if (cmd_l & 0xfff) {
2205-
mlx5_core_err(dev, "invalid command queue address\n");
2206-
err = -ENOMEM;
2207-
goto err_cmd_page;
2208-
}
22092191
cmd->checksum_disabled = 1;
22102192

22112193
spin_lock_init(&cmd->alloc_lock);
22122194
spin_lock_init(&cmd->token_lock);
22132195

2214-
create_msg_cache(dev);
2215-
22162196
set_wqname(dev);
22172197
cmd->wq = create_singlethread_workqueue(cmd->wq_name);
22182198
if (!cmd->wq) {
22192199
mlx5_core_err(dev, "failed to create command workqueue\n");
2220-
err = -ENOMEM;
2221-
goto err_cache;
2200+
return -ENOMEM;
22222201
}
22232202

22242203
mlx5_cmdif_debugfs_init(dev);
22252204

22262205
return 0;
2227-
2228-
err_cache:
2229-
destroy_msg_cache(dev);
2230-
err_cmd_page:
2231-
free_cmd_page(dev, cmd);
2232-
err_free_pool:
2233-
dma_pool_destroy(cmd->pool);
2234-
return err;
22352206
}
22362207

22372208
void mlx5_cmd_cleanup(struct mlx5_core_dev *dev)
@@ -2240,15 +2211,15 @@ void mlx5_cmd_cleanup(struct mlx5_core_dev *dev)
22402211

22412212
mlx5_cmdif_debugfs_cleanup(dev);
22422213
destroy_workqueue(cmd->wq);
2243-
destroy_msg_cache(dev);
2244-
free_cmd_page(dev, cmd);
2245-
dma_pool_destroy(cmd->pool);
22462214
}
22472215

22482216
int mlx5_cmd_enable(struct mlx5_core_dev *dev)
22492217
{
2218+
int size = sizeof(struct mlx5_cmd_prot_block);
2219+
int align = roundup_pow_of_two(size);
22502220
struct mlx5_cmd *cmd = &dev->cmd;
22512221
u32 cmd_h, cmd_l;
2222+
int err;
22522223

22532224
memset(&cmd->vars, 0, sizeof(cmd->vars));
22542225
cmd->vars.cmdif_rev = cmdif_rev(dev);
@@ -2281,10 +2252,21 @@ int mlx5_cmd_enable(struct mlx5_core_dev *dev)
22812252
sema_init(&cmd->vars.pages_sem, 1);
22822253
sema_init(&cmd->vars.throttle_sem, DIV_ROUND_UP(cmd->vars.max_reg_cmds, 2));
22832254

2255+
cmd->pool = dma_pool_create("mlx5_cmd", mlx5_core_dma_dev(dev), size, align, 0);
2256+
if (!cmd->pool)
2257+
return -ENOMEM;
2258+
2259+
err = alloc_cmd_page(dev, cmd);
2260+
if (err)
2261+
goto err_free_pool;
2262+
22842263
cmd_h = (u32)((u64)(cmd->dma) >> 32);
22852264
cmd_l = (u32)(cmd->dma);
2286-
if (WARN_ON(cmd_l & 0xfff))
2287-
return -EINVAL;
2265+
if (cmd_l & 0xfff) {
2266+
mlx5_core_err(dev, "invalid command queue address\n");
2267+
err = -ENOMEM;
2268+
goto err_cmd_page;
2269+
}
22882270

22892271
iowrite32be(cmd_h, &dev->iseg->cmdq_addr_h);
22902272
iowrite32be(cmd_l, &dev->iseg->cmdq_addr_l_sz);
@@ -2297,17 +2279,27 @@ int mlx5_cmd_enable(struct mlx5_core_dev *dev)
22972279
cmd->mode = CMD_MODE_POLLING;
22982280
cmd->allowed_opcode = CMD_ALLOWED_OPCODE_ALL;
22992281

2282+
create_msg_cache(dev);
23002283
create_debugfs_files(dev);
23012284

23022285
return 0;
2286+
2287+
err_cmd_page:
2288+
free_cmd_page(dev, cmd);
2289+
err_free_pool:
2290+
dma_pool_destroy(cmd->pool);
2291+
return err;
23032292
}
23042293

23052294
void mlx5_cmd_disable(struct mlx5_core_dev *dev)
23062295
{
23072296
struct mlx5_cmd *cmd = &dev->cmd;
23082297

2309-
clean_debug_files(dev);
23102298
flush_workqueue(cmd->wq);
2299+
clean_debug_files(dev);
2300+
destroy_msg_cache(dev);
2301+
free_cmd_page(dev, cmd);
2302+
dma_pool_destroy(cmd->pool);
23112303
}
23122304

23132305
void mlx5_cmd_set_state(struct mlx5_core_dev *dev,

drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,7 @@ static void mlx5_fw_tracer_ownership_change(struct work_struct *work)
848848

849849
mlx5_core_dbg(tracer->dev, "FWTracer: ownership changed, current=(%d)\n", tracer->owner);
850850
if (tracer->owner) {
851-
tracer->owner = false;
851+
mlx5_fw_tracer_ownership_acquire(tracer);
852852
return;
853853
}
854854

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,17 @@ static int mlx5_esw_bridge_switchdev_event(struct notifier_block *nb,
467467
/* only handle the event on peers */
468468
if (mlx5_esw_bridge_is_local(dev, rep, esw))
469469
break;
470+
471+
fdb_info = container_of(info,
472+
struct switchdev_notifier_fdb_info,
473+
info);
474+
/* Mark for deletion to prevent the update wq task from
475+
* spuriously refreshing the entry which would mark it again as
476+
* offloaded in SW bridge. After this fallthrough to regular
477+
* async delete code.
478+
*/
479+
mlx5_esw_bridge_fdb_mark_deleted(dev, vport_num, esw_owner_vhca_id, br_offloads,
480+
fdb_info);
470481
fallthrough;
471482
case SWITCHDEV_FDB_ADD_TO_DEVICE:
472483
case SWITCHDEV_FDB_DEL_TO_DEVICE:

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ static int mlx5e_set_int_port_tunnel(struct mlx5e_priv *priv,
2424

2525
route_dev = dev_get_by_index(dev_net(e->out_dev), e->route_dev_ifindex);
2626

27-
if (!route_dev || !netif_is_ovs_master(route_dev))
27+
if (!route_dev || !netif_is_ovs_master(route_dev) ||
28+
attr->parse_attr->filter_dev == e->out_dev)
2829
goto out;
2930

3031
err = mlx5e_set_fwd_to_int_port_actions(priv, attr, e->route_dev_ifindex,

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -874,11 +874,11 @@ int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
874874
}
875875

876876
out:
877-
if (flags & XDP_XMIT_FLUSH) {
878-
if (sq->mpwqe.wqe)
879-
mlx5e_xdp_mpwqe_complete(sq);
877+
if (sq->mpwqe.wqe)
878+
mlx5e_xdp_mpwqe_complete(sq);
879+
880+
if (flags & XDP_XMIT_FLUSH)
880881
mlx5e_xmit_xdp_doorbell(sq);
881-
}
882882

883883
return nxmit;
884884
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ mlx5e_rep_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
701701

702702
/* update HW stats in background for next time */
703703
mlx5e_queue_update_stats(priv);
704-
memcpy(stats, &priv->stats.vf_vport, sizeof(*stats));
704+
mlx5e_stats_copy_rep_stats(stats, &priv->stats.rep_stats);
705705
}
706706

707707
static int mlx5e_rep_change_mtu(struct net_device *netdev, int new_mtu)
@@ -769,6 +769,7 @@ static int mlx5e_rep_max_nch_limit(struct mlx5_core_dev *mdev)
769769

770770
static void mlx5e_build_rep_params(struct net_device *netdev)
771771
{
772+
const bool take_rtnl = netdev->reg_state == NETREG_REGISTERED;
772773
struct mlx5e_priv *priv = netdev_priv(netdev);
773774
struct mlx5e_rep_priv *rpriv = priv->ppriv;
774775
struct mlx5_eswitch_rep *rep = rpriv->rep;
@@ -794,8 +795,15 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
794795
/* RQ */
795796
mlx5e_build_rq_params(mdev, params);
796797

798+
/* If netdev is already registered (e.g. move from nic profile to uplink,
799+
* RTNL lock must be held before triggering netdev notifiers.
800+
*/
801+
if (take_rtnl)
802+
rtnl_lock();
797803
/* update XDP supported features */
798804
mlx5e_set_xdp_feature(netdev);
805+
if (take_rtnl)
806+
rtnl_unlock();
799807

800808
/* CQ moderation params */
801809
params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation);

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

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -457,26 +457,41 @@ static int mlx5e_alloc_rx_wqes(struct mlx5e_rq *rq, u16 ix, int wqe_bulk)
457457
static int mlx5e_refill_rx_wqes(struct mlx5e_rq *rq, u16 ix, int wqe_bulk)
458458
{
459459
int remaining = wqe_bulk;
460-
int i = 0;
460+
int total_alloc = 0;
461+
int refill_alloc;
462+
int refill;
461463

462464
/* The WQE bulk is split into smaller bulks that are sized
463465
* according to the page pool cache refill size to avoid overflowing
464466
* the page pool cache due to too many page releases at once.
465467
*/
466468
do {
467-
int refill = min_t(u16, rq->wqe.info.refill_unit, remaining);
468-
int alloc_count;
469+
refill = min_t(u16, rq->wqe.info.refill_unit, remaining);
469470

470-
mlx5e_free_rx_wqes(rq, ix + i, refill);
471-
alloc_count = mlx5e_alloc_rx_wqes(rq, ix + i, refill);
472-
i += alloc_count;
473-
if (unlikely(alloc_count != refill))
474-
break;
471+
mlx5e_free_rx_wqes(rq, ix + total_alloc, refill);
472+
refill_alloc = mlx5e_alloc_rx_wqes(rq, ix + total_alloc, refill);
473+
if (unlikely(refill_alloc != refill))
474+
goto err_free;
475475

476+
total_alloc += refill_alloc;
476477
remaining -= refill;
477478
} while (remaining);
478479

479-
return i;
480+
return total_alloc;
481+
482+
err_free:
483+
mlx5e_free_rx_wqes(rq, ix, total_alloc + refill_alloc);
484+
485+
for (int i = 0; i < total_alloc + refill; i++) {
486+
int j = mlx5_wq_cyc_ctr2ix(&rq->wqe.wq, ix + i);
487+
struct mlx5e_wqe_frag_info *frag;
488+
489+
frag = get_frag(rq, j);
490+
for (int k = 0; k < rq->wqe.info.num_frags; k++, frag++)
491+
frag->flags |= BIT(MLX5E_WQE_FRAG_SKIP_RELEASE);
492+
}
493+
494+
return 0;
480495
}
481496

482497
static void
@@ -816,6 +831,8 @@ static int mlx5e_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
816831
mlx5e_page_release_fragmented(rq, frag_page);
817832
}
818833

834+
bitmap_fill(wi->skip_release_bitmap, rq->mpwqe.pages_per_wqe);
835+
819836
err:
820837
rq->stats->buff_alloc_err++;
821838

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,11 +484,20 @@ struct mlx5e_stats {
484484
struct mlx5e_vnic_env_stats vnic;
485485
struct mlx5e_vport_stats vport;
486486
struct mlx5e_pport_stats pport;
487-
struct rtnl_link_stats64 vf_vport;
488487
struct mlx5e_pcie_stats pcie;
489488
struct mlx5e_rep_stats rep_stats;
490489
};
491490

491+
static inline void mlx5e_stats_copy_rep_stats(struct rtnl_link_stats64 *vf_vport,
492+
struct mlx5e_rep_stats *rep_stats)
493+
{
494+
memset(vf_vport, 0, sizeof(*vf_vport));
495+
vf_vport->rx_packets = rep_stats->vport_rx_packets;
496+
vf_vport->tx_packets = rep_stats->vport_tx_packets;
497+
vf_vport->rx_bytes = rep_stats->vport_rx_bytes;
498+
vf_vport->tx_bytes = rep_stats->vport_tx_bytes;
499+
}
500+
492501
extern mlx5e_stats_grp_t mlx5e_nic_stats_grps[];
493502
unsigned int mlx5e_nic_stats_grps_num(struct mlx5e_priv *priv);
494503

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4972,7 +4972,8 @@ static int scan_tc_matchall_fdb_actions(struct mlx5e_priv *priv,
49724972
if (err)
49734973
return err;
49744974

4975-
rpriv->prev_vf_vport_stats = priv->stats.vf_vport;
4975+
mlx5e_stats_copy_rep_stats(&rpriv->prev_vf_vport_stats,
4976+
&priv->stats.rep_stats);
49764977
break;
49774978
default:
49784979
NL_SET_ERR_MSG_MOD(extack, "mlx5 supports only police action for matchall");
@@ -5012,7 +5013,7 @@ void mlx5e_tc_stats_matchall(struct mlx5e_priv *priv,
50125013
u64 dbytes;
50135014
u64 dpkts;
50145015

5015-
cur_stats = priv->stats.vf_vport;
5016+
mlx5e_stats_copy_rep_stats(&cur_stats, &priv->stats.rep_stats);
50165017
dpkts = cur_stats.rx_packets - rpriv->prev_vf_vport_stats.rx_packets;
50175018
dbytes = cur_stats.rx_bytes - rpriv->prev_vf_vport_stats.rx_bytes;
50185019
rpriv->prev_vf_vport_stats = cur_stats;

drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1748,6 +1748,28 @@ void mlx5_esw_bridge_fdb_update_used(struct net_device *dev, u16 vport_num, u16
17481748
entry->lastuse = jiffies;
17491749
}
17501750

1751+
void mlx5_esw_bridge_fdb_mark_deleted(struct net_device *dev, u16 vport_num, u16 esw_owner_vhca_id,
1752+
struct mlx5_esw_bridge_offloads *br_offloads,
1753+
struct switchdev_notifier_fdb_info *fdb_info)
1754+
{
1755+
struct mlx5_esw_bridge_fdb_entry *entry;
1756+
struct mlx5_esw_bridge *bridge;
1757+
1758+
bridge = mlx5_esw_bridge_from_port_lookup(vport_num, esw_owner_vhca_id, br_offloads);
1759+
if (!bridge)
1760+
return;
1761+
1762+
entry = mlx5_esw_bridge_fdb_lookup(bridge, fdb_info->addr, fdb_info->vid);
1763+
if (!entry) {
1764+
esw_debug(br_offloads->esw->dev,
1765+
"FDB mark deleted entry with specified key not found (MAC=%pM,vid=%u,vport=%u)\n",
1766+
fdb_info->addr, fdb_info->vid, vport_num);
1767+
return;
1768+
}
1769+
1770+
entry->flags |= MLX5_ESW_BRIDGE_FLAG_DELETED;
1771+
}
1772+
17511773
void mlx5_esw_bridge_fdb_create(struct net_device *dev, u16 vport_num, u16 esw_owner_vhca_id,
17521774
struct mlx5_esw_bridge_offloads *br_offloads,
17531775
struct switchdev_notifier_fdb_info *fdb_info)
@@ -1810,7 +1832,8 @@ void mlx5_esw_bridge_update(struct mlx5_esw_bridge_offloads *br_offloads)
18101832
unsigned long lastuse =
18111833
(unsigned long)mlx5_fc_query_lastuse(entry->ingress_counter);
18121834

1813-
if (entry->flags & MLX5_ESW_BRIDGE_FLAG_ADDED_BY_USER)
1835+
if (entry->flags & (MLX5_ESW_BRIDGE_FLAG_ADDED_BY_USER |
1836+
MLX5_ESW_BRIDGE_FLAG_DELETED))
18141837
continue;
18151838

18161839
if (time_after(lastuse, entry->lastuse))

0 commit comments

Comments
 (0)