Commit 9e37aaa3 authored by David S. Miller's avatar David S. Miller

Merge branch 'mlxsw-fixes'

Jiri Pirko says:

====================
mlxsw: Couple of fixes

Please, queue-up both for stable. Thanks!
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents a055450a 42cdb338
...@@ -231,7 +231,7 @@ mlxsw_sp_span_entry_create(struct mlxsw_sp_port *port) ...@@ -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 ...@@ -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 ...@@ -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;
......
...@@ -800,6 +800,26 @@ static void mlxsw_sp_router_neigh_rec_process(struct mlxsw_sp *mlxsw_sp, ...@@ -800,6 +800,26 @@ static void mlxsw_sp_router_neigh_rec_process(struct mlxsw_sp *mlxsw_sp,
} }
} }
static bool mlxsw_sp_router_rauhtd_is_full(char *rauhtd_pl)
{
u8 num_rec, last_rec_index, num_entries;
num_rec = mlxsw_reg_rauhtd_num_rec_get(rauhtd_pl);
last_rec_index = num_rec - 1;
if (num_rec < MLXSW_REG_RAUHTD_REC_MAX_NUM)
return false;
if (mlxsw_reg_rauhtd_rec_type_get(rauhtd_pl, last_rec_index) ==
MLXSW_REG_RAUHTD_TYPE_IPV6)
return true;
num_entries = mlxsw_reg_rauhtd_ipv4_rec_num_entries_get(rauhtd_pl,
last_rec_index);
if (++num_entries == MLXSW_REG_RAUHTD_IPV4_ENT_PER_REC)
return true;
return false;
}
static int mlxsw_sp_router_neighs_update_rauhtd(struct mlxsw_sp *mlxsw_sp) static int mlxsw_sp_router_neighs_update_rauhtd(struct mlxsw_sp *mlxsw_sp)
{ {
char *rauhtd_pl; char *rauhtd_pl;
...@@ -826,7 +846,7 @@ static int mlxsw_sp_router_neighs_update_rauhtd(struct mlxsw_sp *mlxsw_sp) ...@@ -826,7 +846,7 @@ static int mlxsw_sp_router_neighs_update_rauhtd(struct mlxsw_sp *mlxsw_sp)
for (i = 0; i < num_rec; i++) for (i = 0; i < num_rec; i++)
mlxsw_sp_router_neigh_rec_process(mlxsw_sp, rauhtd_pl, mlxsw_sp_router_neigh_rec_process(mlxsw_sp, rauhtd_pl,
i); i);
} while (num_rec); } while (mlxsw_sp_router_rauhtd_is_full(rauhtd_pl));
rtnl_unlock(); rtnl_unlock();
kfree(rauhtd_pl); kfree(rauhtd_pl);
......
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