Commit 73edca73 authored by Vlad Buslov's avatar Vlad Buslov Committed by Saeed Mahameed

net/mlx5e: Protect hairpin entry flows list with spinlock

To remove dependency on rtnl lock, extend hairpin entry with spinlock and
use it to protect list of flows attached to hairpin entry from concurrent
modifications.
Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
Reviewed-by: default avatarJianbo Liu <jianbol@mellanox.com>
Reviewed-by: default avatarRoi Dayan <roid@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent e4f9abbd
...@@ -162,6 +162,8 @@ struct mlx5e_hairpin_entry { ...@@ -162,6 +162,8 @@ struct mlx5e_hairpin_entry {
/* a node of a hash table which keeps all the hairpin entries */ /* a node of a hash table which keeps all the hairpin entries */
struct hlist_node hairpin_hlist; struct hlist_node hairpin_hlist;
/* protects flows list */
spinlock_t flows_lock;
/* flows sharing the same hairpin */ /* flows sharing the same hairpin */
struct list_head flows; struct list_head flows;
...@@ -735,6 +737,7 @@ static int mlx5e_hairpin_flow_add(struct mlx5e_priv *priv, ...@@ -735,6 +737,7 @@ static int mlx5e_hairpin_flow_add(struct mlx5e_priv *priv,
if (!hpe) if (!hpe)
return -ENOMEM; return -ENOMEM;
spin_lock_init(&hpe->flows_lock);
INIT_LIST_HEAD(&hpe->flows); INIT_LIST_HEAD(&hpe->flows);
hpe->peer_vhca_id = peer_id; hpe->peer_vhca_id = peer_id;
hpe->prio = match_prio; hpe->prio = match_prio;
...@@ -782,7 +785,9 @@ static int mlx5e_hairpin_flow_add(struct mlx5e_priv *priv, ...@@ -782,7 +785,9 @@ static int mlx5e_hairpin_flow_add(struct mlx5e_priv *priv,
flow->nic_attr->hairpin_tirn = hpe->hp->tirn; flow->nic_attr->hairpin_tirn = hpe->hp->tirn;
} }
flow->hpe = hpe; flow->hpe = hpe;
spin_lock(&hpe->flows_lock);
list_add(&flow->hairpin, &hpe->flows); list_add(&flow->hairpin, &hpe->flows);
spin_unlock(&hpe->flows_lock);
return 0; return 0;
...@@ -798,7 +803,10 @@ static void mlx5e_hairpin_flow_del(struct mlx5e_priv *priv, ...@@ -798,7 +803,10 @@ static void mlx5e_hairpin_flow_del(struct mlx5e_priv *priv,
if (!flow->hpe) if (!flow->hpe)
return; return;
spin_lock(&flow->hpe->flows_lock);
list_del(&flow->hairpin); list_del(&flow->hairpin);
spin_unlock(&flow->hpe->flows_lock);
mlx5e_hairpin_put(priv, flow->hpe); mlx5e_hairpin_put(priv, flow->hpe);
flow->hpe = NULL; flow->hpe = NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment