net/mlx5e: Refactor RSS related objects and code
authorOr Gerlitz <ogerlitz@mellanox.com>
Wed, 6 Dec 2017 19:05:01 +0000 (21:05 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 19 Jan 2018 20:41:32 +0000 (22:41 +0200)
In order to use RSS for hairpin, we refactor the code that deals with
setup of the TTC steering tables. This is done using an interim ttc
params object that has the flow table attributes, TIR numbers, etc.

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c

index 7b98859..10620c3 100644 (file)
@@ -44,6 +44,7 @@
 #include <linux/mlx5/port.h>
 #include <linux/mlx5/vport.h>
 #include <linux/mlx5/transobj.h>
+#include <linux/mlx5/fs.h>
 #include <linux/rhashtable.h>
 #include <net/switchdev.h>
 #include <net/xdp.h>
@@ -1024,11 +1025,26 @@ int mlx5e_create_direct_tirs(struct mlx5e_priv *priv);
 void mlx5e_destroy_direct_tirs(struct mlx5e_priv *priv);
 void mlx5e_destroy_rqt(struct mlx5e_priv *priv, struct mlx5e_rqt *rqt);
 
-int mlx5e_create_ttc_table(struct mlx5e_priv *priv);
-void mlx5e_destroy_ttc_table(struct mlx5e_priv *priv);
+struct ttc_params {
+       struct mlx5_flow_table_attr ft_attr;
+       u32 any_tt_tirn;
+       u32 indir_tirn[MLX5E_NUM_INDIR_TIRS];
+       struct mlx5e_ttc_table *inner_ttc;
+};
+
+void mlx5e_set_ttc_basic_params(struct mlx5e_priv *priv, struct ttc_params *ttc_params);
+void mlx5e_set_ttc_ft_params(struct ttc_params *ttc_params);
+void mlx5e_set_inner_ttc_ft_params(struct ttc_params *ttc_params);
+
+int mlx5e_create_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
+                          struct mlx5e_ttc_table *ttc);
+void mlx5e_destroy_ttc_table(struct mlx5e_priv *priv,
+                            struct mlx5e_ttc_table *ttc);
 
-int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv);
-void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv);
+int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
+                                struct mlx5e_ttc_table *ttc);
+void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv,
+                                  struct mlx5e_ttc_table *ttc);
 
 int mlx5e_create_tis(struct mlx5_core_dev *mdev, int tc,
                     u32 underlay_qpn, u32 *tisn);
index def5134..f64dda2 100644 (file)
@@ -806,25 +806,25 @@ mlx5e_generate_ttc_rule(struct mlx5e_priv *priv,
        return err ? ERR_PTR(err) : rule;
 }
 
-static int mlx5e_generate_ttc_table_rules(struct mlx5e_priv *priv)
+static int mlx5e_generate_ttc_table_rules(struct mlx5e_priv *priv,
+                                         struct ttc_params *params,
+                                         struct mlx5e_ttc_table *ttc)
 {
        struct mlx5_flow_destination dest = {};
-       struct mlx5e_ttc_table *ttc;
        struct mlx5_flow_handle **rules;
        struct mlx5_flow_table *ft;
        int tt;
        int err;
 
-       ttc = &priv->fs.ttc;
        ft = ttc->ft.t;
        rules = ttc->rules;
 
        dest.type = MLX5_FLOW_DESTINATION_TYPE_TIR;
        for (tt = 0; tt < MLX5E_NUM_TT; tt++) {
                if (tt == MLX5E_TT_ANY)
-                       dest.tir_num = priv->direct_tir[0].tirn;
+                       dest.tir_num = params->any_tt_tirn;
                else
-                       dest.tir_num = priv->indir_tir[tt].tirn;
+                       dest.tir_num = params->indir_tirn[tt];
                rules[tt] = mlx5e_generate_ttc_rule(priv, ft, &dest,
                                                    ttc_rules[tt].etype,
                                                    ttc_rules[tt].proto);
@@ -832,12 +832,12 @@ static int mlx5e_generate_ttc_table_rules(struct mlx5e_priv *priv)
                        goto del_rules;
        }
 
-       if (!mlx5e_tunnel_inner_ft_supported(priv->mdev))
+       if (!params->inner_ttc || !mlx5e_tunnel_inner_ft_supported(priv->mdev))
                return 0;
 
        rules     = ttc->tunnel_rules;
        dest.type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE;
-       dest.ft   = priv->fs.inner_ttc.ft.t;
+       dest.ft   = params->inner_ttc->ft.t;
        for (tt = 0; tt < MLX5E_NUM_TUNNEL_TT; tt++) {
                rules[tt] = mlx5e_generate_ttc_rule(priv, ft, &dest,
                                                    ttc_tunnel_rules[tt].etype,
@@ -977,25 +977,25 @@ mlx5e_generate_inner_ttc_rule(struct mlx5e_priv *priv,
        return err ? ERR_PTR(err) : rule;
 }
 
-static int mlx5e_generate_inner_ttc_table_rules(struct mlx5e_priv *priv)
+static int mlx5e_generate_inner_ttc_table_rules(struct mlx5e_priv *priv,
+                                               struct ttc_params *params,
+                                               struct mlx5e_ttc_table *ttc)
 {
        struct mlx5_flow_destination dest = {};
        struct mlx5_flow_handle **rules;
-       struct mlx5e_ttc_table *ttc;
        struct mlx5_flow_table *ft;
        int err;
        int tt;
 
-       ttc =  &priv->fs.inner_ttc;
        ft = ttc->ft.t;
        rules = ttc->rules;
 
        dest.type = MLX5_FLOW_DESTINATION_TYPE_TIR;
        for (tt = 0; tt < MLX5E_NUM_TT; tt++) {
                if (tt == MLX5E_TT_ANY)
-                       dest.tir_num = priv->direct_tir[0].tirn;
+                       dest.tir_num = params->any_tt_tirn;
                else
-                       dest.tir_num = priv->inner_indir_tir[tt].tirn;
+                       dest.tir_num = params->indir_tirn[tt];
 
                rules[tt] = mlx5e_generate_inner_ttc_rule(priv, ft, &dest,
                                                          ttc_rules[tt].etype,
@@ -1075,21 +1075,42 @@ err:
        return err;
 }
 
-int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv)
+void mlx5e_set_ttc_basic_params(struct mlx5e_priv *priv,
+                               struct ttc_params *ttc_params)
+{
+       ttc_params->any_tt_tirn = priv->direct_tir[0].tirn;
+       ttc_params->inner_ttc = &priv->fs.inner_ttc;
+}
+
+void mlx5e_set_inner_ttc_ft_params(struct ttc_params *ttc_params)
+{
+       struct mlx5_flow_table_attr *ft_attr = &ttc_params->ft_attr;
+
+       ft_attr->max_fte = MLX5E_INNER_TTC_TABLE_SIZE;
+       ft_attr->level = MLX5E_INNER_TTC_FT_LEVEL;
+       ft_attr->prio = MLX5E_NIC_PRIO;
+}
+
+void mlx5e_set_ttc_ft_params(struct ttc_params *ttc_params)
+
+{
+       struct mlx5_flow_table_attr *ft_attr = &ttc_params->ft_attr;
+
+       ft_attr->max_fte = MLX5E_TTC_TABLE_SIZE;
+       ft_attr->level = MLX5E_TTC_FT_LEVEL;
+       ft_attr->prio = MLX5E_NIC_PRIO;
+}
+
+int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
+                                struct mlx5e_ttc_table *ttc)
 {
-       struct mlx5e_ttc_table *ttc = &priv->fs.inner_ttc;
-       struct mlx5_flow_table_attr ft_attr = {};
        struct mlx5e_flow_table *ft = &ttc->ft;
        int err;
 
        if (!mlx5e_tunnel_inner_ft_supported(priv->mdev))
                return 0;
 
-       ft_attr.max_fte = MLX5E_INNER_TTC_TABLE_SIZE;
-       ft_attr.level   = MLX5E_INNER_TTC_FT_LEVEL;
-       ft_attr.prio    = MLX5E_NIC_PRIO;
-
-       ft->t = mlx5_create_flow_table(priv->fs.ns, &ft_attr);
+       ft->t = mlx5_create_flow_table(priv->fs.ns, &params->ft_attr);
        if (IS_ERR(ft->t)) {
                err = PTR_ERR(ft->t);
                ft->t = NULL;
@@ -1100,7 +1121,7 @@ int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv)
        if (err)
                goto err;
 
-       err = mlx5e_generate_inner_ttc_table_rules(priv);
+       err = mlx5e_generate_inner_ttc_table_rules(priv, params, ttc);
        if (err)
                goto err;
 
@@ -1111,10 +1132,9 @@ err:
        return err;
 }
 
-void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv)
+void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv,
+                                  struct mlx5e_ttc_table *ttc)
 {
-       struct mlx5e_ttc_table *ttc = &priv->fs.inner_ttc;
-
        if (!mlx5e_tunnel_inner_ft_supported(priv->mdev))
                return;
 
@@ -1122,27 +1142,21 @@ void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv)
        mlx5e_destroy_flow_table(&ttc->ft);
 }
 
-void mlx5e_destroy_ttc_table(struct mlx5e_priv *priv)
+void mlx5e_destroy_ttc_table(struct mlx5e_priv *priv,
+                            struct mlx5e_ttc_table *ttc)
 {
-       struct mlx5e_ttc_table *ttc = &priv->fs.ttc;
-
        mlx5e_cleanup_ttc_rules(ttc);
        mlx5e_destroy_flow_table(&ttc->ft);
 }
 
-int mlx5e_create_ttc_table(struct mlx5e_priv *priv)
+int mlx5e_create_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
+                          struct mlx5e_ttc_table *ttc)
 {
        bool match_ipv_outer = MLX5_CAP_FLOWTABLE_NIC_RX(priv->mdev, ft_field_support.outer_ip_version);
-       struct mlx5e_ttc_table *ttc = &priv->fs.ttc;
-       struct mlx5_flow_table_attr ft_attr = {};
        struct mlx5e_flow_table *ft = &ttc->ft;
        int err;
 
-       ft_attr.max_fte = MLX5E_TTC_TABLE_SIZE;
-       ft_attr.level = MLX5E_TTC_FT_LEVEL;
-       ft_attr.prio = MLX5E_NIC_PRIO;
-
-       ft->t = mlx5_create_flow_table(priv->fs.ns, &ft_attr);
+       ft->t = mlx5_create_flow_table(priv->fs.ns, &params->ft_attr);
        if (IS_ERR(ft->t)) {
                err = PTR_ERR(ft->t);
                ft->t = NULL;
@@ -1153,7 +1167,7 @@ int mlx5e_create_ttc_table(struct mlx5e_priv *priv)
        if (err)
                goto err;
 
-       err = mlx5e_generate_ttc_table_rules(priv);
+       err = mlx5e_generate_ttc_table_rules(priv, params, ttc);
        if (err)
                goto err;
 
@@ -1474,7 +1488,8 @@ static void mlx5e_destroy_vlan_table(struct mlx5e_priv *priv)
 
 int mlx5e_create_flow_steering(struct mlx5e_priv *priv)
 {
-       int err;
+       struct ttc_params ttc_params = {};
+       int tt, err;
 
        priv->fs.ns = mlx5_get_flow_namespace(priv->mdev,
                                               MLX5_FLOW_NAMESPACE_KERNEL);
@@ -1489,14 +1504,23 @@ int mlx5e_create_flow_steering(struct mlx5e_priv *priv)
                priv->netdev->hw_features &= ~NETIF_F_NTUPLE;
        }
 
-       err = mlx5e_create_inner_ttc_table(priv);
+       mlx5e_set_ttc_basic_params(priv, &ttc_params);
+       mlx5e_set_inner_ttc_ft_params(&ttc_params);
+       for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++)
+               ttc_params.indir_tirn[tt] = priv->inner_indir_tir[tt].tirn;
+
+       err = mlx5e_create_inner_ttc_table(priv, &ttc_params, &priv->fs.inner_ttc);
        if (err) {
                netdev_err(priv->netdev, "Failed to create inner ttc table, err=%d\n",
                           err);
                goto err_destroy_arfs_tables;
        }
 
-       err = mlx5e_create_ttc_table(priv);
+       mlx5e_set_ttc_ft_params(&ttc_params);
+       for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++)
+               ttc_params.indir_tirn[tt] = priv->indir_tir[tt].tirn;
+
+       err = mlx5e_create_ttc_table(priv, &ttc_params, &priv->fs.ttc);
        if (err) {
                netdev_err(priv->netdev, "Failed to create ttc table, err=%d\n",
                           err);
@@ -1524,9 +1548,9 @@ int mlx5e_create_flow_steering(struct mlx5e_priv *priv)
 err_destroy_l2_table:
        mlx5e_destroy_l2_table(priv);
 err_destroy_ttc_table:
-       mlx5e_destroy_ttc_table(priv);
+       mlx5e_destroy_ttc_table(priv, &priv->fs.ttc);
 err_destroy_inner_ttc_table:
-       mlx5e_destroy_inner_ttc_table(priv);
+       mlx5e_destroy_inner_ttc_table(priv, &priv->fs.inner_ttc);
 err_destroy_arfs_tables:
        mlx5e_arfs_destroy_tables(priv);
 
@@ -1537,8 +1561,8 @@ void mlx5e_destroy_flow_steering(struct mlx5e_priv *priv)
 {
        mlx5e_destroy_vlan_table(priv);
        mlx5e_destroy_l2_table(priv);
-       mlx5e_destroy_ttc_table(priv);
-       mlx5e_destroy_inner_ttc_table(priv);
+       mlx5e_destroy_ttc_table(priv, &priv->fs.ttc);
+       mlx5e_destroy_inner_ttc_table(priv, &priv->fs.inner_ttc);
        mlx5e_arfs_destroy_tables(priv);
        mlx5e_ethtool_cleanup_steering(priv);
 }
index 2743525..264504a 100644 (file)
@@ -241,7 +241,8 @@ static void mlx5i_cleanup_tx(struct mlx5e_priv *priv)
 
 static int mlx5i_create_flow_steering(struct mlx5e_priv *priv)
 {
-       int err;
+       struct ttc_params ttc_params = {};
+       int tt, err;
 
        priv->fs.ns = mlx5_get_flow_namespace(priv->mdev,
                                               MLX5_FLOW_NAMESPACE_KERNEL);
@@ -256,14 +257,23 @@ static int mlx5i_create_flow_steering(struct mlx5e_priv *priv)
                priv->netdev->hw_features &= ~NETIF_F_NTUPLE;
        }
 
-       err = mlx5e_create_inner_ttc_table(priv);
+       mlx5e_set_ttc_basic_params(priv, &ttc_params);
+       mlx5e_set_inner_ttc_ft_params(&ttc_params);
+       for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++)
+               ttc_params.indir_tirn[tt] = priv->inner_indir_tir[tt].tirn;
+
+       err = mlx5e_create_inner_ttc_table(priv, &ttc_params, &priv->fs.inner_ttc);
        if (err) {
                netdev_err(priv->netdev, "Failed to create inner ttc table, err=%d\n",
                           err);
                goto err_destroy_arfs_tables;
        }
 
-       err = mlx5e_create_ttc_table(priv);
+       mlx5e_set_ttc_ft_params(&ttc_params);
+       for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++)
+               ttc_params.indir_tirn[tt] = priv->inner_indir_tir[tt].tirn;
+
+       err = mlx5e_create_ttc_table(priv, &ttc_params, &priv->fs.ttc);
        if (err) {
                netdev_err(priv->netdev, "Failed to create ttc table, err=%d\n",
                           err);
@@ -273,7 +283,7 @@ static int mlx5i_create_flow_steering(struct mlx5e_priv *priv)
        return 0;
 
 err_destroy_inner_ttc_table:
-       mlx5e_destroy_inner_ttc_table(priv);
+       mlx5e_destroy_inner_ttc_table(priv, &priv->fs.inner_ttc);
 err_destroy_arfs_tables:
        mlx5e_arfs_destroy_tables(priv);
 
@@ -282,8 +292,8 @@ err_destroy_arfs_tables:
 
 static void mlx5i_destroy_flow_steering(struct mlx5e_priv *priv)
 {
-       mlx5e_destroy_ttc_table(priv);
-       mlx5e_destroy_inner_ttc_table(priv);
+       mlx5e_destroy_ttc_table(priv, &priv->fs.ttc);
+       mlx5e_destroy_inner_ttc_table(priv, &priv->fs.inner_ttc);
        mlx5e_arfs_destroy_tables(priv);
 }