History

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 ====================

Jakub Kicinski committed 4 years ago

Commit fe5235a2 parents 0680e20 5b759bf11 files · +76 −38Browse files

Unified · Split

11 files
  1. drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c +12 −8
  2. drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c +1 −2
  3. drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c +1 −2
  4. drivers/net/ethernet/mellanox/mlx5/core/en_stats.c +1 −1
  5. drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +1 −1
  6. drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +30 −9
  7. drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c +3 −2
  8. drivers/net/ethernet/mellanox/mlx5/core/lag/debugfs.c +11 −3
  9. drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c +12 −6
  10. drivers/net/ethernet/mellanox/mlx5/core/lag/lag.h +2 −1
  11. drivers/net/ethernet/mellanox/mlx5/core/lag/mpesw.c +2 −3
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c+12−8
@@ -76,6 +76,7 @@ struct mlx5_tc_ct_priv { · 75 unmodified lines
7676 struct mlx5_ct_fs *fs;
7777 struct mlx5_ct_fs_ops *fs_ops;
7878 spinlock_t ht_lock; /* protects ft entries */
79+ struct workqueue_struct *wq;
7980
8081 struct mlx5_tc_ct_debugfs debugfs;
8182 };
@@ -941,14 +942,11 @@ static void mlx5_tc_ct_entry_del_work(struct work_struct *work) · 859 unmodified lines
941942 static void
942943 __mlx5_tc_ct_entry_put(struct mlx5_ct_entry *entry)
943944 {
944− struct mlx5e_priv *priv;
945−
946945 if (!refcount_dec_and_test(&entry->refcnt))
947946 return;
948947
949− priv = netdev_priv(entry->ct_priv->netdev);
950948 INIT_WORK(&entry->work, mlx5_tc_ct_entry_del_work);
951− queue_work(priv->wq, &entry->work);
949+ queue_work(entry->ct_priv->wq, &entry->work);
952950 }
953951
954952 static struct mlx5_ct_counter *
@@ -1759,19 +1757,16 @@ mlx5_tc_ct_flush_ft_entry(void *ptr, void *arg) · 804 unmodified lines
17591757 static void
17601758 mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft)
17611759 {
1762− struct mlx5e_priv *priv;
1763−
17641760 if (!refcount_dec_and_test(&ft->refcount))
17651761 return;
17661762
1763+ flush_workqueue(ct_priv->wq);
17671764 nf_flow_table_offload_del_cb(ft->nf_ft,
17681765 mlx5_tc_ct_block_flow_offload, ft);
17691766 rhashtable_remove_fast(&ct_priv->zone_ht, &ft->node, zone_params);
17701767 rhashtable_free_and_destroy(&ft->ct_entries_ht,
17711768 mlx5_tc_ct_flush_ft_entry,
17721769 ct_priv);
1773− priv = netdev_priv(ct_priv->netdev);
1774− flush_workqueue(priv->wq);
17751770 mlx5_tc_ct_free_pre_ct_tables(ft);
17761771 mapping_remove(ct_priv->zone_mapping, ft->zone_restore_id);
17771772 kfree(ft);
@@ -2176,6 +2171,12 @@ mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains, · 398 unmodified lines
21762171 if (rhashtable_init(&ct_priv->ct_tuples_nat_ht, &tuples_nat_ht_params))
21772172 goto err_ct_tuples_nat_ht;
21782173
2174+ ct_priv->wq = alloc_ordered_workqueue("mlx5e_ct_priv_wq", 0);
2175+ if (!ct_priv->wq) {
2176+ err = -ENOMEM;
2177+ goto err_wq;
2178+ }
2179+
21792180 err = mlx5_tc_ct_fs_init(ct_priv);
21802181 if (err)
21812182 goto err_init_fs;
@@ -2184,6 +2185,8 @@ mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains, · 2 unmodified lines
21842185 return ct_priv;
21852186
21862187 err_init_fs:
2188+ destroy_workqueue(ct_priv->wq);
2189+err_wq:
21872190 rhashtable_destroy(&ct_priv->ct_tuples_nat_ht);
21882191 err_ct_tuples_nat_ht:
21892192 rhashtable_destroy(&ct_priv->ct_tuples_ht);
@@ -2213,6 +2216,7 @@ mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv) · 23 unmodified lines
22132216 if (!ct_priv)
22142217 return;
22152218
2219+ destroy_workqueue(ct_priv->wq);
22162220 mlx5_ct_tc_remove_dbgfs(ct_priv);
22172221 chains = ct_priv->chains;
22182222
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c+1−2
@@ -231,8 +231,7 @@ mlx5e_set_ktls_rx_priv_ctx(struct tls_context *tls_ctx, · 230 unmodified lines
231231 struct mlx5e_ktls_offload_context_rx **ctx =
232232 __tls_driver_ctx(tls_ctx, TLS_OFFLOAD_CTX_DIR_RX);
233233
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);
236235
237236 *ctx = priv_rx;
238237 }
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c+1−2
@@ -68,8 +68,7 @@ mlx5e_set_ktls_tx_priv_ctx(struct tls_context *tls_ctx, · 67 unmodified lines
6868 struct mlx5e_ktls_offload_context_tx **ctx =
6969 __tls_driver_ctx(tls_ctx, TLS_OFFLOAD_CTX_DIR_TX);
7070
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);
7372
7473 *ctx = priv_tx;
7574 }
drivers/net/ethernet/mellanox/mlx5/core/en_stats.c+1−1
@@ -688,7 +688,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vnic_env) · 687 unmodified lines
688688 u32 in[MLX5_ST_SZ_DW(query_vnic_env_in)] = {};
689689 struct mlx5_core_dev *mdev = priv->mdev;
690690
691− if (!MLX5_CAP_GEN(priv->mdev, nic_receive_steering_discard))
691+ if (!mlx5e_stats_grp_vnic_env_num_stats(priv))
692692 return;
693693
694694 MLX5_SET(query_vnic_env_in, in, opcode, MLX5_CMD_OP_QUERY_VNIC_ENV);
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c+1−1
@@ -3793,7 +3793,7 @@ static bool is_lag_dev(struct mlx5e_priv *priv, · 3792 unmodified lines
37933793
37943794 static bool is_multiport_eligible(struct mlx5e_priv *priv, struct net_device *out_dev)
37953795 {
3796− if (mlx5e_eswitch_uplink_rep(out_dev) &&
3796+ if (same_hw_reps(priv, out_dev) &&
37973797 MLX5_CAP_PORT_SELECTION(priv->mdev, port_select_flow_table) &&
37983798 MLX5_CAP_GEN(priv->mdev, create_lag_when_not_master_up))
37993799 return true;
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c+30−9
@@ -341,6 +341,26 @@ static void mlx5e_tx_check_stop(struct mlx5e_txqsq *sq) · 340 unmodified lines
341341 }
342342 }
343343
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+
344364 static inline void
345365 mlx5e_txwqe_complete(struct mlx5e_txqsq *sq, struct sk_buff *skb,
346366 const struct mlx5e_tx_attr *attr,
@@ -459,6 +479,7 @@ mlx5e_sq_xmit_wqe(struct mlx5e_txqsq *sq, struct sk_buff *skb, · 112 unmodified lines
459479 err_drop:
460480 stats->dropped++;
461481 dev_kfree_skb_any(skb);
482+ mlx5e_tx_flush(sq);
462483 }
463484
464485 static bool mlx5e_tx_skb_supports_mpwqe(struct sk_buff *skb, struct mlx5e_tx_attr *attr)
@@ -560,6 +581,13 @@ mlx5e_sq_xmit_mpwqe(struct mlx5e_txqsq *sq, struct sk_buff *skb, · 95 unmodified lines
560581 struct mlx5_wqe_ctrl_seg *cseg;
561582 struct mlx5e_xmit_data txd;
562583
584+ txd.data = skb->data;
585+ txd.len = skb->len;
586+
587+ txd.dma_addr = dma_map_single(sq->pdev, txd.data, txd.len, DMA_TO_DEVICE);
588+ if (unlikely(dma_mapping_error(sq->pdev, txd.dma_addr)))
589+ goto err_unmap;
590+
563591 if (!mlx5e_tx_mpwqe_session_is_active(sq)) {
564592 mlx5e_tx_mpwqe_session_start(sq, eseg);
565593 } else if (!mlx5e_tx_mpwqe_same_eseg(sq, eseg)) {
@@ -569,18 +597,9 @@ mlx5e_sq_xmit_mpwqe(struct mlx5e_txqsq *sq, struct sk_buff *skb, · 3 unmodified lines
569597
570598 sq->stats->xmit_more += xmit_more;
571599
572− txd.data = skb->data;
573− txd.len = skb->len;
574−
575− txd.dma_addr = dma_map_single(sq->pdev, txd.data, txd.len, DMA_TO_DEVICE);
576− if (unlikely(dma_mapping_error(sq->pdev, txd.dma_addr)))
577− goto err_unmap;
578600 mlx5e_dma_push(sq, txd.dma_addr, txd.len, MLX5E_DMA_MAP_SINGLE);
579−
580601 mlx5e_skb_fifo_push(&sq->db.skb_fifo, skb);
581−
582602 mlx5e_tx_mpwqe_add_dseg(sq, &txd);
583−
584603 mlx5e_tx_skb_update_hwts_flags(skb);
585604
586605 if (unlikely(mlx5e_tx_mpwqe_is_full(&sq->mpwqe, sq->max_sq_mpw_wqebbs))) {
@@ -602,6 +621,7 @@ err_unmap: · 15 unmodified lines
602621 mlx5e_dma_unmap_wqe_err(sq, 1);
603622 sq->stats->dropped++;
604623 dev_kfree_skb_any(skb);
624+ mlx5e_tx_flush(sq);
605625 }
606626
607627 void mlx5e_tx_mpwqe_ensure_complete(struct mlx5e_txqsq *sq)
@@ -1006,5 +1026,6 @@ void mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb, · 398 unmodified lines
10061026 err_drop:
10071027 stats->dropped++;
10081028 dev_kfree_skb_any(skb);
1029+ mlx5e_tx_flush(sq);
10091030 }
10101031 #endif
drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c+3−2
@@ -11,6 +11,7 @@ · 10 unmodified lines
1111 #include "mlx5_core.h"
1212 #include "eswitch.h"
1313 #include "fs_core.h"
14+#include "fs_ft_pool.h"
1415 #include "esw/qos.h"
1516
1617 enum {
@@ -95,8 +96,7 @@ static int esw_create_legacy_fdb_table(struct mlx5_eswitch *esw) · 78 unmodified lines
9596 if (!flow_group_in)
9697 return -ENOMEM;
9798
98− table_size = BIT(MLX5_CAP_ESW_FLOWTABLE_FDB(dev, log_max_ft_size));
99− ft_attr.max_fte = table_size;
99+ ft_attr.max_fte = POOL_NEXT_SIZE;
100100 ft_attr.prio = LEGACY_FDB_PRIO;
101101 fdb = mlx5_create_flow_table(root_ns, &ft_attr);
102102 if (IS_ERR(fdb)) {
@@ -105,6 +105,7 @@ static int esw_create_legacy_fdb_table(struct mlx5_eswitch *esw) · 2 unmodified lines
105105 goto out;
106106 }
107107 esw->fdb_table.legacy.fdb = fdb;
108+ table_size = fdb->max_fte;
108109
109110 /* Addresses group : Full match unicast/multicast addresses */
110111 MLX5_SET(create_flow_group_in, flow_group_in, match_criteria_enable,
drivers/net/ethernet/mellanox/mlx5/core/lag/debugfs.c+11−3
@@ -44,7 +44,7 @@ static int port_sel_mode_show(struct seq_file *file, void *priv) · 43 unmodified lines
4444 ldev = dev->priv.lag;
4545 mutex_lock(&ldev->lock);
4646 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);
4848 else
4949 ret = -EINVAL;
5050 mutex_unlock(&ldev->lock);
@@ -72,6 +72,7 @@ static int state_show(struct seq_file *file, void *priv) · 21 unmodified lines
7272 static int flags_show(struct seq_file *file, void *priv)
7373 {
7474 struct mlx5_core_dev *dev = file->private;
75+ bool fdb_sel_mode_native;
7576 struct mlx5_lag *ldev;
7677 bool shared_fdb;
7778 bool lag_active;
@@ -79,14 +80,21 @@ static int flags_show(struct seq_file *file, void *priv) · 1 unmodified line
7980 ldev = dev->priv.lag;
8081 mutex_lock(&ldev->lock);
8182 lag_active = __mlx5_lag_is_active(ldev);
82− if (lag_active)
83− shared_fdb = test_bit(MLX5_LAG_MODE_FLAG_SHARED_FDB, &ldev->mode_flags);
83+ if (!lag_active)
84+ goto unlock;
85+
86+ shared_fdb = test_bit(MLX5_LAG_MODE_FLAG_SHARED_FDB, &ldev->mode_flags);
87+ fdb_sel_mode_native = test_bit(MLX5_LAG_MODE_FLAG_FDB_SEL_MODE_NATIVE,
88+ &ldev->mode_flags);
8489
90+unlock:
8591 mutex_unlock(&ldev->lock);
8692 if (!lag_active)
8793 return -EINVAL;
8894
8995 seq_printf(file, "%s:%s\n", "shared_fdb", shared_fdb ? "on" : "off");
96+ seq_printf(file, "%s:%s\n", "fdb_selection_mode",
97+ fdb_sel_mode_native ? "native" : "affinity");
9098 return 0;
9199 }
92100
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c+12−6
@@ -68,14 +68,15 @@ static int get_port_sel_mode(enum mlx5_lag_mode mode, unsigned long flags) · 67 unmodified lines
6868 static int mlx5_cmd_create_lag(struct mlx5_core_dev *dev, u8 *ports, int mode,
6969 unsigned long flags)
7070 {
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);
7273 int port_sel_mode = get_port_sel_mode(mode, flags);
7374 u32 in[MLX5_ST_SZ_DW(create_lag_in)] = {};
7475 void *lag_ctx;
7576
7677 lag_ctx = MLX5_ADDR_OF(create_lag_in, in, ctx);
7778 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);
7980 if (port_sel_mode == MLX5_LAG_PORT_SELECT_MODE_QUEUE_AFFINITY) {
8081 MLX5_SET(lagc, lag_ctx, tx_remap_affinity_1, ports[0]);
8182 MLX5_SET(lagc, lag_ctx, tx_remap_affinity_2, ports[1]);
@@ -471,8 +472,13 @@ static int mlx5_lag_set_flags(struct mlx5_lag *ldev, enum mlx5_lag_mode mode, · 389 unmodified lines
471472 bool roce_lag = mode == MLX5_LAG_MODE_ROCE;
472473
473474 *flags = 0;
474− if (shared_fdb)
475+ if (shared_fdb) {
475476 set_bit(MLX5_LAG_MODE_FLAG_SHARED_FDB, flags);
477+ set_bit(MLX5_LAG_MODE_FLAG_FDB_SEL_MODE_NATIVE, flags);
478+ }
479+
480+ if (mode == MLX5_LAG_MODE_MPESW)
481+ set_bit(MLX5_LAG_MODE_FLAG_FDB_SEL_MODE_NATIVE, flags);
476482
477483 if (roce_lag)
478484 return mlx5_lag_set_port_sel_mode_roce(ldev, flags);
@@ -481,9 +487,9 @@ static int mlx5_lag_set_flags(struct mlx5_lag *ldev, enum mlx5_lag_mode mode, · 2 unmodified lines
481487 return 0;
482488 }
483489
484−char *mlx5_get_str_port_sel_mode(struct mlx5_lag *ldev)
490+char *mlx5_get_str_port_sel_mode(enum mlx5_lag_mode mode, unsigned long flags)
485491 {
486− int port_sel_mode = get_port_sel_mode(ldev->mode, ldev->mode_flags);
492+ int port_sel_mode = get_port_sel_mode(mode, flags);
487493
488494 switch (port_sel_mode) {
489495 case MLX5_LAG_PORT_SELECT_MODE_QUEUE_AFFINITY: return "queue_affinity";
@@ -507,7 +513,7 @@ static int mlx5_create_lag(struct mlx5_lag *ldev, · 17 unmodified lines
507513 if (tracker)
508514 mlx5_lag_print_mapping(dev0, ldev, tracker, flags);
509515 mlx5_core_info(dev0, "shared_fdb:%d mode:%s\n",
510− shared_fdb, mlx5_get_str_port_sel_mode(ldev));
516+ shared_fdb, mlx5_get_str_port_sel_mode(mode, flags));
511517
512518 err = mlx5_cmd_create_lag(dev0, ldev->v2p_map, mode, flags);
513519 if (err) {
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.h+2−1
@@ -24,6 +24,7 @@ enum { · 23 unmodified lines
2424 enum {
2525 MLX5_LAG_MODE_FLAG_HASH_BASED,
2626 MLX5_LAG_MODE_FLAG_SHARED_FDB,
27+ MLX5_LAG_MODE_FLAG_FDB_SEL_MODE_NATIVE,
2728 };
2829
2930 enum mlx5_lag_mode {
@@ -114,7 +115,7 @@ bool mlx5_shared_fdb_supported(struct mlx5_lag *ldev); · 84 unmodified lines
114115 void mlx5_lag_del_mpesw_rule(struct mlx5_core_dev *dev);
115116 int mlx5_lag_add_mpesw_rule(struct mlx5_core_dev *dev);
116117
117−char *mlx5_get_str_port_sel_mode(struct mlx5_lag *ldev);
118+char *mlx5_get_str_port_sel_mode(enum mlx5_lag_mode mode, unsigned long flags);
118119 void mlx5_infer_tx_enabled(struct lag_tracker *tracker, u8 num_ports,
119120 u8 *ports, int *num_enabled);
120121
drivers/net/ethernet/mellanox/mlx5/core/lag/mpesw.c+2−3
@@ -41,7 +41,6 @@ void mlx5_lag_del_mpesw_rule(struct mlx5_core_dev *dev) · 40 unmodified lines
4141 int mlx5_lag_add_mpesw_rule(struct mlx5_core_dev *dev)
4242 {
4343 struct mlx5_lag *ldev = dev->priv.lag;
44− bool shared_fdb;
4544 int err = 0;
4645
4746 if (!ldev)
@@ -55,8 +54,8 @@ int mlx5_lag_add_mpesw_rule(struct mlx5_core_dev *dev) · 7 unmodified lines
5554 err = -EINVAL;
5655 goto out;
5756 }
58− shared_fdb = mlx5_shared_fdb_supported(ldev);
59− err = mlx5_activate_lag(ldev, NULL, MLX5_LAG_MODE_MPESW, shared_fdb);
57+
58+ err = mlx5_activate_lag(ldev, NULL, MLX5_LAG_MODE_MPESW, false);
6059 if (err)
6160 mlx5_core_warn(dev, "Failed to create LAG in MPESW mode (%d)\n", err);
6261