Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'mlx5-fixes-2022-07-06' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux

Saeed Mahameed says:

====================
mlx5 fixes 2022-07-06

This series provides bug fixes to mlx5 driver.

* tag 'mlx5-fixes-2022-07-06' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux:
net/mlx5e: Ring the TX doorbell on DMA errors
net/mlx5e: Fix capability check for updating vnic env counters
net/mlx5e: CT: Use own workqueue instead of mlx5e priv
net/mlx5: Lag, correct get the port select mode str
net/mlx5e: Fix enabling sriov while tc nic rules are offloaded
net/mlx5e: kTLS, Fix build time constant test in RX
net/mlx5e: kTLS, Fix build time constant test in TX
net/mlx5: Lag, decouple FDB selection and shared FDB
net/mlx5: TC, allow offload from uplink to other PF's VF
====================

Link: https://lore.kernel.org/r/20220706231309.38579-1-saeed@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+76 -38
+12 -8
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c
··· 76 76 struct mlx5_ct_fs *fs; 77 77 struct mlx5_ct_fs_ops *fs_ops; 78 78 spinlock_t ht_lock; /* protects ft entries */ 79 + struct workqueue_struct *wq; 79 80 80 81 struct mlx5_tc_ct_debugfs debugfs; 81 82 }; ··· 942 941 static void 943 942 __mlx5_tc_ct_entry_put(struct mlx5_ct_entry *entry) 944 943 { 945 - struct mlx5e_priv *priv; 946 - 947 944 if (!refcount_dec_and_test(&entry->refcnt)) 948 945 return; 949 946 950 - priv = netdev_priv(entry->ct_priv->netdev); 951 947 INIT_WORK(&entry->work, mlx5_tc_ct_entry_del_work); 952 - queue_work(priv->wq, &entry->work); 948 + queue_work(entry->ct_priv->wq, &entry->work); 953 949 } 954 950 955 951 static struct mlx5_ct_counter * ··· 1757 1759 static void 1758 1760 mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft) 1759 1761 { 1760 - struct mlx5e_priv *priv; 1761 - 1762 1762 if (!refcount_dec_and_test(&ft->refcount)) 1763 1763 return; 1764 1764 1765 + flush_workqueue(ct_priv->wq); 1765 1766 nf_flow_table_offload_del_cb(ft->nf_ft, 1766 1767 mlx5_tc_ct_block_flow_offload, ft); 1767 1768 rhashtable_remove_fast(&ct_priv->zone_ht, &ft->node, zone_params); 1768 1769 rhashtable_free_and_destroy(&ft->ct_entries_ht, 1769 1770 mlx5_tc_ct_flush_ft_entry, 1770 1771 ct_priv); 1771 - priv = netdev_priv(ct_priv->netdev); 1772 - flush_workqueue(priv->wq); 1773 1772 mlx5_tc_ct_free_pre_ct_tables(ft); 1774 1773 mapping_remove(ct_priv->zone_mapping, ft->zone_restore_id); 1775 1774 kfree(ft); ··· 2171 2176 if (rhashtable_init(&ct_priv->ct_tuples_nat_ht, &tuples_nat_ht_params)) 2172 2177 goto err_ct_tuples_nat_ht; 2173 2178 2179 + ct_priv->wq = alloc_ordered_workqueue("mlx5e_ct_priv_wq", 0); 2180 + if (!ct_priv->wq) { 2181 + err = -ENOMEM; 2182 + goto err_wq; 2183 + } 2184 + 2174 2185 err = mlx5_tc_ct_fs_init(ct_priv); 2175 2186 if (err) 2176 2187 goto err_init_fs; ··· 2185 2184 return ct_priv; 2186 2185 2187 2186 err_init_fs: 2187 + destroy_workqueue(ct_priv->wq); 2188 + err_wq: 2188 2189 rhashtable_destroy(&ct_priv->ct_tuples_nat_ht); 2189 2190 err_ct_tuples_nat_ht: 2190 2191 rhashtable_destroy(&ct_priv->ct_tuples_ht); ··· 2216 2213 if (!ct_priv) 2217 2214 return; 2218 2215 2216 + destroy_workqueue(ct_priv->wq); 2219 2217 mlx5_ct_tc_remove_dbgfs(ct_priv); 2220 2218 chains = ct_priv->chains; 2221 2219
+1 -2
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
··· 231 231 struct mlx5e_ktls_offload_context_rx **ctx = 232 232 __tls_driver_ctx(tls_ctx, TLS_OFFLOAD_CTX_DIR_RX); 233 233 234 - BUILD_BUG_ON(sizeof(struct mlx5e_ktls_offload_context_rx *) > 235 - TLS_OFFLOAD_CONTEXT_SIZE_RX); 234 + BUILD_BUG_ON(sizeof(priv_rx) > TLS_DRIVER_STATE_SIZE_RX); 236 235 237 236 *ctx = priv_rx; 238 237 }
+1 -2
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c
··· 68 68 struct mlx5e_ktls_offload_context_tx **ctx = 69 69 __tls_driver_ctx(tls_ctx, TLS_OFFLOAD_CTX_DIR_TX); 70 70 71 - BUILD_BUG_ON(sizeof(struct mlx5e_ktls_offload_context_tx *) > 72 - TLS_OFFLOAD_CONTEXT_SIZE_TX); 71 + BUILD_BUG_ON(sizeof(priv_tx) > TLS_DRIVER_STATE_SIZE_TX); 73 72 74 73 *ctx = priv_tx; 75 74 }
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/en_stats.c
··· 688 688 u32 in[MLX5_ST_SZ_DW(query_vnic_env_in)] = {}; 689 689 struct mlx5_core_dev *mdev = priv->mdev; 690 690 691 - if (!MLX5_CAP_GEN(priv->mdev, nic_receive_steering_discard)) 691 + if (!mlx5e_stats_grp_vnic_env_num_stats(priv)) 692 692 return; 693 693 694 694 MLX5_SET(query_vnic_env_in, in, opcode, MLX5_CMD_OP_QUERY_VNIC_ENV);
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
··· 3793 3793 3794 3794 static bool is_multiport_eligible(struct mlx5e_priv *priv, struct net_device *out_dev) 3795 3795 { 3796 - if (mlx5e_eswitch_uplink_rep(out_dev) && 3796 + if (same_hw_reps(priv, out_dev) && 3797 3797 MLX5_CAP_PORT_SELECTION(priv->mdev, port_select_flow_table) && 3798 3798 MLX5_CAP_GEN(priv->mdev, create_lag_when_not_master_up)) 3799 3799 return true;
+30 -9
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
··· 341 341 } 342 342 } 343 343 344 + static void mlx5e_tx_flush(struct mlx5e_txqsq *sq) 345 + { 346 + struct mlx5e_tx_wqe_info *wi; 347 + struct mlx5e_tx_wqe *wqe; 348 + u16 pi; 349 + 350 + /* Must not be called when a MPWQE session is active but empty. */ 351 + mlx5e_tx_mpwqe_ensure_complete(sq); 352 + 353 + pi = mlx5_wq_cyc_ctr2ix(&sq->wq, sq->pc); 354 + wi = &sq->db.wqe_info[pi]; 355 + 356 + *wi = (struct mlx5e_tx_wqe_info) { 357 + .num_wqebbs = 1, 358 + }; 359 + 360 + wqe = mlx5e_post_nop(&sq->wq, sq->sqn, &sq->pc); 361 + mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, &wqe->ctrl); 362 + } 363 + 344 364 static inline void 345 365 mlx5e_txwqe_complete(struct mlx5e_txqsq *sq, struct sk_buff *skb, 346 366 const struct mlx5e_tx_attr *attr, ··· 479 459 err_drop: 480 460 stats->dropped++; 481 461 dev_kfree_skb_any(skb); 462 + mlx5e_tx_flush(sq); 482 463 } 483 464 484 465 static bool mlx5e_tx_skb_supports_mpwqe(struct sk_buff *skb, struct mlx5e_tx_attr *attr) ··· 581 560 struct mlx5_wqe_ctrl_seg *cseg; 582 561 struct mlx5e_xmit_data txd; 583 562 563 + txd.data = skb->data; 564 + txd.len = skb->len; 565 + 566 + txd.dma_addr = dma_map_single(sq->pdev, txd.data, txd.len, DMA_TO_DEVICE); 567 + if (unlikely(dma_mapping_error(sq->pdev, txd.dma_addr))) 568 + goto err_unmap; 569 + 584 570 if (!mlx5e_tx_mpwqe_session_is_active(sq)) { 585 571 mlx5e_tx_mpwqe_session_start(sq, eseg); 586 572 } else if (!mlx5e_tx_mpwqe_same_eseg(sq, eseg)) { ··· 597 569 598 570 sq->stats->xmit_more += xmit_more; 599 571 600 - txd.data = skb->data; 601 - txd.len = skb->len; 602 - 603 - txd.dma_addr = dma_map_single(sq->pdev, txd.data, txd.len, DMA_TO_DEVICE); 604 - if (unlikely(dma_mapping_error(sq->pdev, txd.dma_addr))) 605 - goto err_unmap; 606 572 mlx5e_dma_push(sq, txd.dma_addr, txd.len, MLX5E_DMA_MAP_SINGLE); 607 - 608 573 mlx5e_skb_fifo_push(&sq->db.skb_fifo, skb); 609 - 610 574 mlx5e_tx_mpwqe_add_dseg(sq, &txd); 611 - 612 575 mlx5e_tx_skb_update_hwts_flags(skb); 613 576 614 577 if (unlikely(mlx5e_tx_mpwqe_is_full(&sq->mpwqe, sq->max_sq_mpw_wqebbs))) { ··· 621 602 mlx5e_dma_unmap_wqe_err(sq, 1); 622 603 sq->stats->dropped++; 623 604 dev_kfree_skb_any(skb); 605 + mlx5e_tx_flush(sq); 624 606 } 625 607 626 608 void mlx5e_tx_mpwqe_ensure_complete(struct mlx5e_txqsq *sq) ··· 1026 1006 err_drop: 1027 1007 stats->dropped++; 1028 1008 dev_kfree_skb_any(skb); 1009 + mlx5e_tx_flush(sq); 1029 1010 } 1030 1011 #endif
+3 -2
drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c
··· 11 11 #include "mlx5_core.h" 12 12 #include "eswitch.h" 13 13 #include "fs_core.h" 14 + #include "fs_ft_pool.h" 14 15 #include "esw/qos.h" 15 16 16 17 enum { ··· 96 95 if (!flow_group_in) 97 96 return -ENOMEM; 98 97 99 - table_size = BIT(MLX5_CAP_ESW_FLOWTABLE_FDB(dev, log_max_ft_size)); 100 - ft_attr.max_fte = table_size; 98 + ft_attr.max_fte = POOL_NEXT_SIZE; 101 99 ft_attr.prio = LEGACY_FDB_PRIO; 102 100 fdb = mlx5_create_flow_table(root_ns, &ft_attr); 103 101 if (IS_ERR(fdb)) { ··· 105 105 goto out; 106 106 } 107 107 esw->fdb_table.legacy.fdb = fdb; 108 + table_size = fdb->max_fte; 108 109 109 110 /* Addresses group : Full match unicast/multicast addresses */ 110 111 MLX5_SET(create_flow_group_in, flow_group_in, match_criteria_enable,
+11 -3
drivers/net/ethernet/mellanox/mlx5/core/lag/debugfs.c
··· 44 44 ldev = dev->priv.lag; 45 45 mutex_lock(&ldev->lock); 46 46 if (__mlx5_lag_is_active(ldev)) 47 - mode = mlx5_get_str_port_sel_mode(ldev); 47 + mode = mlx5_get_str_port_sel_mode(ldev->mode, ldev->mode_flags); 48 48 else 49 49 ret = -EINVAL; 50 50 mutex_unlock(&ldev->lock); ··· 72 72 static int flags_show(struct seq_file *file, void *priv) 73 73 { 74 74 struct mlx5_core_dev *dev = file->private; 75 + bool fdb_sel_mode_native; 75 76 struct mlx5_lag *ldev; 76 77 bool shared_fdb; 77 78 bool lag_active; ··· 80 79 ldev = dev->priv.lag; 81 80 mutex_lock(&ldev->lock); 82 81 lag_active = __mlx5_lag_is_active(ldev); 83 - if (lag_active) 84 - shared_fdb = test_bit(MLX5_LAG_MODE_FLAG_SHARED_FDB, &ldev->mode_flags); 82 + if (!lag_active) 83 + goto unlock; 85 84 85 + shared_fdb = test_bit(MLX5_LAG_MODE_FLAG_SHARED_FDB, &ldev->mode_flags); 86 + fdb_sel_mode_native = test_bit(MLX5_LAG_MODE_FLAG_FDB_SEL_MODE_NATIVE, 87 + &ldev->mode_flags); 88 + 89 + unlock: 86 90 mutex_unlock(&ldev->lock); 87 91 if (!lag_active) 88 92 return -EINVAL; 89 93 90 94 seq_printf(file, "%s:%s\n", "shared_fdb", shared_fdb ? "on" : "off"); 95 + seq_printf(file, "%s:%s\n", "fdb_selection_mode", 96 + fdb_sel_mode_native ? "native" : "affinity"); 91 97 return 0; 92 98 } 93 99
+12 -6
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c
··· 68 68 static int mlx5_cmd_create_lag(struct mlx5_core_dev *dev, u8 *ports, int mode, 69 69 unsigned long flags) 70 70 { 71 - bool shared_fdb = test_bit(MLX5_LAG_MODE_FLAG_SHARED_FDB, &flags); 71 + bool fdb_sel_mode = test_bit(MLX5_LAG_MODE_FLAG_FDB_SEL_MODE_NATIVE, 72 + &flags); 72 73 int port_sel_mode = get_port_sel_mode(mode, flags); 73 74 u32 in[MLX5_ST_SZ_DW(create_lag_in)] = {}; 74 75 void *lag_ctx; 75 76 76 77 lag_ctx = MLX5_ADDR_OF(create_lag_in, in, ctx); 77 78 MLX5_SET(create_lag_in, in, opcode, MLX5_CMD_OP_CREATE_LAG); 78 - MLX5_SET(lagc, lag_ctx, fdb_selection_mode, shared_fdb); 79 + MLX5_SET(lagc, lag_ctx, fdb_selection_mode, fdb_sel_mode); 79 80 if (port_sel_mode == MLX5_LAG_PORT_SELECT_MODE_QUEUE_AFFINITY) { 80 81 MLX5_SET(lagc, lag_ctx, tx_remap_affinity_1, ports[0]); 81 82 MLX5_SET(lagc, lag_ctx, tx_remap_affinity_2, ports[1]); ··· 472 471 bool roce_lag = mode == MLX5_LAG_MODE_ROCE; 473 472 474 473 *flags = 0; 475 - if (shared_fdb) 474 + if (shared_fdb) { 476 475 set_bit(MLX5_LAG_MODE_FLAG_SHARED_FDB, flags); 476 + set_bit(MLX5_LAG_MODE_FLAG_FDB_SEL_MODE_NATIVE, flags); 477 + } 478 + 479 + if (mode == MLX5_LAG_MODE_MPESW) 480 + set_bit(MLX5_LAG_MODE_FLAG_FDB_SEL_MODE_NATIVE, flags); 477 481 478 482 if (roce_lag) 479 483 return mlx5_lag_set_port_sel_mode_roce(ldev, flags); ··· 487 481 return 0; 488 482 } 489 483 490 - char *mlx5_get_str_port_sel_mode(struct mlx5_lag *ldev) 484 + char *mlx5_get_str_port_sel_mode(enum mlx5_lag_mode mode, unsigned long flags) 491 485 { 492 - int port_sel_mode = get_port_sel_mode(ldev->mode, ldev->mode_flags); 486 + int port_sel_mode = get_port_sel_mode(mode, flags); 493 487 494 488 switch (port_sel_mode) { 495 489 case MLX5_LAG_PORT_SELECT_MODE_QUEUE_AFFINITY: return "queue_affinity"; ··· 513 507 if (tracker) 514 508 mlx5_lag_print_mapping(dev0, ldev, tracker, flags); 515 509 mlx5_core_info(dev0, "shared_fdb:%d mode:%s\n", 516 - shared_fdb, mlx5_get_str_port_sel_mode(ldev)); 510 + shared_fdb, mlx5_get_str_port_sel_mode(mode, flags)); 517 511 518 512 err = mlx5_cmd_create_lag(dev0, ldev->v2p_map, mode, flags); 519 513 if (err) {
+2 -1
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.h
··· 24 24 enum { 25 25 MLX5_LAG_MODE_FLAG_HASH_BASED, 26 26 MLX5_LAG_MODE_FLAG_SHARED_FDB, 27 + MLX5_LAG_MODE_FLAG_FDB_SEL_MODE_NATIVE, 27 28 }; 28 29 29 30 enum mlx5_lag_mode { ··· 115 114 void mlx5_lag_del_mpesw_rule(struct mlx5_core_dev *dev); 116 115 int mlx5_lag_add_mpesw_rule(struct mlx5_core_dev *dev); 117 116 118 - char *mlx5_get_str_port_sel_mode(struct mlx5_lag *ldev); 117 + char *mlx5_get_str_port_sel_mode(enum mlx5_lag_mode mode, unsigned long flags); 119 118 void mlx5_infer_tx_enabled(struct lag_tracker *tracker, u8 num_ports, 120 119 u8 *ports, int *num_enabled); 121 120
+2 -3
drivers/net/ethernet/mellanox/mlx5/core/lag/mpesw.c
··· 41 41 int mlx5_lag_add_mpesw_rule(struct mlx5_core_dev *dev) 42 42 { 43 43 struct mlx5_lag *ldev = dev->priv.lag; 44 - bool shared_fdb; 45 44 int err = 0; 46 45 47 46 if (!ldev) ··· 54 55 err = -EINVAL; 55 56 goto out; 56 57 } 57 - shared_fdb = mlx5_shared_fdb_supported(ldev); 58 - err = mlx5_activate_lag(ldev, NULL, MLX5_LAG_MODE_MPESW, shared_fdb); 58 + 59 + err = mlx5_activate_lag(ldev, NULL, MLX5_LAG_MODE_MPESW, false); 59 60 if (err) 60 61 mlx5_core_warn(dev, "Failed to create LAG in MPESW mode (%d)\n", err); 61 62