Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2d644d4c authored by Yotam Gigi's avatar Yotam Gigi Committed by David S. Miller
Browse files

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: 763b4b70 ("mlxsw: spectrum: Add support in matchall mirror TC offloading")
Signed-off-by: default avatarYotam Gigi <yotamg@mellanox.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a055450a
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -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;