mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 09:04:39 +02:00
Merge branch 'mlxsw-three-m-router-fixes'
Petr Machata says: ==================== mlxsw: Three (m)router fixes This patchset contains two fixes in mlxsw Spectrum router code, and one for the Spectrum multicast router code. Please see the individual patches for more details. ==================== Link: https://patch.msgid.link/cover.1764695650.git.petrm@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
e7a9530d12
|
|
@ -440,7 +440,9 @@ int mlxsw_sp_mr_route_add(struct mlxsw_sp_mr_table *mr_table,
|
|||
rhashtable_remove_fast(&mr_table->route_ht,
|
||||
&mr_orig_route->ht_node,
|
||||
mlxsw_sp_mr_route_ht_params);
|
||||
mutex_lock(&mr_table->route_list_lock);
|
||||
list_del(&mr_orig_route->node);
|
||||
mutex_unlock(&mr_table->route_list_lock);
|
||||
mlxsw_sp_mr_route_destroy(mr_table, mr_orig_route);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2265,6 +2265,7 @@ mlxsw_sp_neigh_entry_alloc(struct mlxsw_sp *mlxsw_sp, struct neighbour *n,
|
|||
if (!neigh_entry)
|
||||
return NULL;
|
||||
|
||||
neigh_hold(n);
|
||||
neigh_entry->key.n = n;
|
||||
neigh_entry->rif = rif;
|
||||
INIT_LIST_HEAD(&neigh_entry->nexthop_list);
|
||||
|
|
@ -2274,6 +2275,7 @@ mlxsw_sp_neigh_entry_alloc(struct mlxsw_sp *mlxsw_sp, struct neighbour *n,
|
|||
|
||||
static void mlxsw_sp_neigh_entry_free(struct mlxsw_sp_neigh_entry *neigh_entry)
|
||||
{
|
||||
neigh_release(neigh_entry->key.n);
|
||||
kfree(neigh_entry);
|
||||
}
|
||||
|
||||
|
|
@ -2858,6 +2860,11 @@ static int mlxsw_sp_router_schedule_work(struct net *net,
|
|||
if (!net_work)
|
||||
return NOTIFY_BAD;
|
||||
|
||||
/* Take a reference to ensure the neighbour won't be destructed until
|
||||
* we drop the reference in the work item.
|
||||
*/
|
||||
neigh_clone(n);
|
||||
|
||||
INIT_WORK(&net_work->work, cb);
|
||||
net_work->mlxsw_sp = router->mlxsw_sp;
|
||||
net_work->n = n;
|
||||
|
|
@ -2881,11 +2888,6 @@ static int mlxsw_sp_router_schedule_neigh_work(struct mlxsw_sp_router *router,
|
|||
struct net *net;
|
||||
|
||||
net = neigh_parms_net(n->parms);
|
||||
|
||||
/* Take a reference to ensure the neighbour won't be destructed until we
|
||||
* drop the reference in delayed work.
|
||||
*/
|
||||
neigh_clone(n);
|
||||
return mlxsw_sp_router_schedule_work(net, router, n,
|
||||
mlxsw_sp_router_neigh_event_work);
|
||||
}
|
||||
|
|
@ -4320,6 +4322,8 @@ mlxsw_sp_nexthop_dead_neigh_replace(struct mlxsw_sp *mlxsw_sp,
|
|||
if (err)
|
||||
goto err_neigh_entry_insert;
|
||||
|
||||
neigh_release(old_n);
|
||||
|
||||
read_lock_bh(&n->lock);
|
||||
nud_state = n->nud_state;
|
||||
dead = n->dead;
|
||||
|
|
@ -4328,14 +4332,10 @@ mlxsw_sp_nexthop_dead_neigh_replace(struct mlxsw_sp *mlxsw_sp,
|
|||
|
||||
list_for_each_entry(nh, &neigh_entry->nexthop_list,
|
||||
neigh_list_node) {
|
||||
neigh_release(old_n);
|
||||
neigh_clone(n);
|
||||
__mlxsw_sp_nexthop_neigh_update(nh, !entry_connected);
|
||||
mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp);
|
||||
}
|
||||
|
||||
neigh_release(n);
|
||||
|
||||
return 0;
|
||||
|
||||
err_neigh_entry_insert:
|
||||
|
|
@ -4428,6 +4428,11 @@ static int mlxsw_sp_nexthop_neigh_init(struct mlxsw_sp *mlxsw_sp,
|
|||
}
|
||||
}
|
||||
|
||||
/* Release the reference taken by neigh_lookup() / neigh_create() since
|
||||
* neigh_entry already holds one.
|
||||
*/
|
||||
neigh_release(n);
|
||||
|
||||
/* If that is the first nexthop connected to that neigh, add to
|
||||
* nexthop_neighs_list
|
||||
*/
|
||||
|
|
@ -4454,11 +4459,9 @@ static void mlxsw_sp_nexthop_neigh_fini(struct mlxsw_sp *mlxsw_sp,
|
|||
struct mlxsw_sp_nexthop *nh)
|
||||
{
|
||||
struct mlxsw_sp_neigh_entry *neigh_entry = nh->neigh_entry;
|
||||
struct neighbour *n;
|
||||
|
||||
if (!neigh_entry)
|
||||
return;
|
||||
n = neigh_entry->key.n;
|
||||
|
||||
__mlxsw_sp_nexthop_neigh_update(nh, true);
|
||||
list_del(&nh->neigh_list_node);
|
||||
|
|
@ -4472,8 +4475,6 @@ static void mlxsw_sp_nexthop_neigh_fini(struct mlxsw_sp *mlxsw_sp,
|
|||
|
||||
if (!neigh_entry->connected && list_empty(&neigh_entry->nexthop_list))
|
||||
mlxsw_sp_neigh_entry_destroy(mlxsw_sp, neigh_entry);
|
||||
|
||||
neigh_release(n);
|
||||
}
|
||||
|
||||
static bool mlxsw_sp_ipip_netdev_ul_up(struct net_device *ol_dev)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user