net/mlx5e: Remove flow encap entry in the correct place
authorRoi Dayan <roid@mellanox.com>
Wed, 30 Nov 2016 15:59:43 +0000 (17:59 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 2 Dec 2016 15:47:03 +0000 (10:47 -0500)
Handling flow encap entry should be inside tc del flow
and is only relevant for offloaded eswitch TC rules.

Fixes: 11a457e9b6c1 ("net/mlx5e: Add basic TC tunnel set action for SRIOV offloads")
Signed-off-by: Roi Dayan <roid@mellanox.com>
Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index 3875c1cf52fd83f971bdb2c77dd430c3ff22bd77..f07ef8c7da559985112d202cf9b26e2b82d4b3ca 100644 (file)
@@ -142,6 +142,24 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
        return mlx5_eswitch_add_offloaded_rule(esw, spec, attr);
 }
 
+static void mlx5e_detach_encap(struct mlx5e_priv *priv,
+                              struct mlx5e_tc_flow *flow) {
+       struct list_head *next = flow->encap.next;
+
+       list_del(&flow->encap);
+       if (list_empty(next)) {
+               struct mlx5_encap_entry *e;
+
+               e = list_entry(next, struct mlx5_encap_entry, flows);
+               if (e->n) {
+                       mlx5_encap_dealloc(priv->mdev, e->encap_id);
+                       neigh_release(e->n);
+               }
+               hlist_del_rcu(&e->encap_hlist);
+               kfree(e);
+       }
+}
+
 static void mlx5e_tc_del_flow(struct mlx5e_priv *priv,
                              struct mlx5e_tc_flow *flow)
 {
@@ -152,8 +170,11 @@ static void mlx5e_tc_del_flow(struct mlx5e_priv *priv,
 
        mlx5_del_flow_rules(flow->rule);
 
-       if (esw && esw->mode == SRIOV_OFFLOADS)
+       if (esw && esw->mode == SRIOV_OFFLOADS) {
                mlx5_eswitch_del_vlan_action(esw, flow->attr);
+               if (flow->attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP)
+                       mlx5e_detach_encap(priv, flow);
+       }
 
        mlx5_fc_destroy(priv->mdev, counter);
 
@@ -973,24 +994,6 @@ out:
        return err;
 }
 
-static void mlx5e_detach_encap(struct mlx5e_priv *priv,
-                              struct mlx5e_tc_flow *flow) {
-       struct list_head *next = flow->encap.next;
-
-       list_del(&flow->encap);
-       if (list_empty(next)) {
-               struct mlx5_encap_entry *e;
-
-               e = list_entry(next, struct mlx5_encap_entry, flows);
-               if (e->n) {
-                       mlx5_encap_dealloc(priv->mdev, e->encap_id);
-                       neigh_release(e->n);
-               }
-               hlist_del_rcu(&e->encap_hlist);
-               kfree(e);
-       }
-}
-
 int mlx5e_delete_flower(struct mlx5e_priv *priv,
                        struct tc_cls_flower_offload *f)
 {
@@ -1006,8 +1009,6 @@ int mlx5e_delete_flower(struct mlx5e_priv *priv,
 
        mlx5e_tc_del_flow(priv, flow);
 
-       if (flow->attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP)
-               mlx5e_detach_encap(priv, flow);
 
        kfree(flow);