]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
net/mlx5: E-Switch, Restore chain id on miss
authorPaul Blakey <paulb@mellanox.com>
Sun, 16 Feb 2020 10:01:30 +0000 (12:01 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Thu, 20 Feb 2020 01:49:48 +0000 (17:49 -0800)
Chain ids are mapped to the lower part of reg C, and after loopback
are copied to to CQE via a restore rule's flow_tag.

To let tc continue in the correct chain, we find the corresponding
chain id in the eswitch chain id <-> reg C mapping, and set the SKB's
tc extension chain to it.

That tells tc to continue processing from this set chain.

Signed-off-by: Paul Blakey <paulb@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
drivers/net/ethernet/mellanox/mlx5/core/en_tc.h

index 454ce4c38b06af3719e5235fcda79bed141bf793..e0abe797741e57f6370b671ba0e4bd6b0425eb55 100644 (file)
@@ -1225,6 +1225,9 @@ void mlx5e_handle_rx_cqe_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
        if (rep->vlan && skb_vlan_tag_present(skb))
                skb_vlan_pop(skb);
 
+       if (!mlx5e_tc_rep_update_skb(cqe, skb))
+               goto free_wqe;
+
        napi_gro_receive(rq->cq.napi, skb);
 
 free_wqe:
@@ -1275,6 +1278,9 @@ void mlx5e_handle_rx_cqe_mpwrq_rep(struct mlx5e_rq *rq,
 
        mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
 
+       if (!mlx5e_tc_rep_update_skb(cqe, skb))
+               goto mpwrq_cqe_out;
+
        napi_gro_receive(rq->cq.napi, skb);
 
 mpwrq_cqe_out:
index 2ee80f0ae2a9e69ecb4088f3e08dd67f3ac7e75c..ac1ecf89d8add95554dd69cffd16c1544110e35b 100644 (file)
@@ -4339,3 +4339,46 @@ void mlx5e_tc_reoffload_flows_work(struct work_struct *work)
        }
        mutex_unlock(&rpriv->unready_flows_lock);
 }
+
+bool mlx5e_tc_rep_update_skb(struct mlx5_cqe64 *cqe,
+                            struct sk_buff *skb)
+{
+#if IS_ENABLED(CONFIG_NET_TC_SKB_EXT)
+       struct tc_skb_ext *tc_skb_ext;
+       struct mlx5_eswitch *esw;
+       struct mlx5e_priv *priv;
+       u32 chain = 0, reg_c0;
+       int err;
+
+       reg_c0 = (be32_to_cpu(cqe->sop_drop_qpn) & MLX5E_TC_FLOW_ID_MASK);
+       if (reg_c0 == MLX5_FS_DEFAULT_FLOW_TAG)
+               reg_c0 = 0;
+
+       if (!reg_c0)
+               return true;
+
+       priv = netdev_priv(skb->dev);
+       esw = priv->mdev->priv.eswitch;
+
+       err = mlx5_eswitch_get_chain_for_tag(esw, reg_c0, &chain);
+       if (err) {
+               netdev_dbg(priv->netdev,
+                          "Couldn't find chain for chain tag: %d, err: %d\n",
+                          reg_c0, err);
+               return false;
+       }
+
+       if (!chain)
+               return true;
+
+       tc_skb_ext = skb_ext_add(skb, TC_SKB_EXT);
+       if (!tc_skb_ext) {
+               WARN_ON_ONCE(1);
+               return false;
+       }
+
+       tc_skb_ext->chain = chain;
+#endif /* CONFIG_NET_TC_SKB_EXT */
+
+       return true;
+}
index e2dbbae6d4d7c11c4eb3db039d0901d617f39e21..9d5fcf61650c0c8971155206f52c0a1577778ecb 100644 (file)
@@ -106,6 +106,8 @@ extern struct mlx5e_tc_attr_to_reg_mapping mlx5e_tc_attr_to_reg_mappings[];
 bool mlx5e_is_valid_eswitch_fwd_dev(struct mlx5e_priv *priv,
                                    struct net_device *out_dev);
 
+bool mlx5e_tc_rep_update_skb(struct mlx5_cqe64 *cqe, struct sk_buff *skb);
+
 #else /* CONFIG_MLX5_ESWITCH */
 static inline int  mlx5e_tc_nic_init(struct mlx5e_priv *priv) { return 0; }
 static inline void mlx5e_tc_nic_cleanup(struct mlx5e_priv *priv) {}