ソースを参照

mlxsw: spectrum: Fix refcount bug on span entries

When binding port to a newly created span entry, its refcount is
initialized to zero even though it has a bound port. That leads
to unexpected behaviour when the user tries to delete that port
from the span entry.

Fix this by initializing the reference count to 1.

Also add a warning to put function.

Fixes: 763b4b70afcd ("mlxsw: spectrum: Add support in matchall mirror TC offloading")
Signed-off-by: Yotam Gigi <yotamg@mellanox.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Yotam Gigi 8 年 前
コミット
2d644d4c75
1 ファイル変更3 行追加1 行削除
  1. 3 1
      drivers/net/ethernet/mellanox/mlxsw/spectrum.c

+ 3 - 1
drivers/net/ethernet/mellanox/mlxsw/spectrum.c

@@ -231,7 +231,7 @@ mlxsw_sp_span_entry_create(struct mlxsw_sp_port *port)
 
 
 	span_entry->used = true;
 	span_entry->used = true;
 	span_entry->id = index;
 	span_entry->id = index;
-	span_entry->ref_count = 0;
+	span_entry->ref_count = 1;
 	span_entry->local_port = local_port;
 	span_entry->local_port = local_port;
 	return span_entry;
 	return span_entry;
 }
 }
@@ -270,6 +270,7 @@ static struct mlxsw_sp_span_entry
 
 
 	span_entry = mlxsw_sp_span_entry_find(port);
 	span_entry = mlxsw_sp_span_entry_find(port);
 	if (span_entry) {
 	if (span_entry) {
+		/* Already exists, just take a reference */
 		span_entry->ref_count++;
 		span_entry->ref_count++;
 		return span_entry;
 		return span_entry;
 	}
 	}
@@ -280,6 +281,7 @@ static struct mlxsw_sp_span_entry
 static int mlxsw_sp_span_entry_put(struct mlxsw_sp *mlxsw_sp,
 static int mlxsw_sp_span_entry_put(struct mlxsw_sp *mlxsw_sp,
 				   struct mlxsw_sp_span_entry *span_entry)
 				   struct mlxsw_sp_span_entry *span_entry)
 {
 {
+	WARN_ON(!span_entry->ref_count);
 	if (--span_entry->ref_count == 0)
 	if (--span_entry->ref_count == 0)
 		mlxsw_sp_span_entry_destroy(mlxsw_sp, span_entry);
 		mlxsw_sp_span_entry_destroy(mlxsw_sp, span_entry);
 	return 0;
 	return 0;