Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

+16 -13
+2
drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c
··· 440 440 rhashtable_remove_fast(&mr_table->route_ht, 441 441 &mr_orig_route->ht_node, 442 442 mlxsw_sp_mr_route_ht_params); 443 + mutex_lock(&mr_table->route_list_lock); 443 444 list_del(&mr_orig_route->node); 445 + mutex_unlock(&mr_table->route_list_lock); 444 446 mlxsw_sp_mr_route_destroy(mr_table, mr_orig_route); 445 447 } 446 448
+14 -13
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
··· 2265 2265 if (!neigh_entry) 2266 2266 return NULL; 2267 2267 2268 + neigh_hold(n); 2268 2269 neigh_entry->key.n = n; 2269 2270 neigh_entry->rif = rif; 2270 2271 INIT_LIST_HEAD(&neigh_entry->nexthop_list); ··· 2275 2274 2276 2275 static void mlxsw_sp_neigh_entry_free(struct mlxsw_sp_neigh_entry *neigh_entry) 2277 2276 { 2277 + neigh_release(neigh_entry->key.n); 2278 2278 kfree(neigh_entry); 2279 2279 } 2280 2280 ··· 2860 2858 if (!net_work) 2861 2859 return NOTIFY_BAD; 2862 2860 2861 + /* Take a reference to ensure the neighbour won't be destructed until 2862 + * we drop the reference in the work item. 2863 + */ 2864 + neigh_clone(n); 2865 + 2863 2866 INIT_WORK(&net_work->work, cb); 2864 2867 net_work->mlxsw_sp = router->mlxsw_sp; 2865 2868 net_work->n = n; ··· 2888 2881 struct net *net; 2889 2882 2890 2883 net = neigh_parms_net(n->parms); 2891 - 2892 - /* Take a reference to ensure the neighbour won't be destructed until we 2893 - * drop the reference in delayed work. 2894 - */ 2895 - neigh_clone(n); 2896 2884 return mlxsw_sp_router_schedule_work(net, router, n, 2897 2885 mlxsw_sp_router_neigh_event_work); 2898 2886 } ··· 4322 4320 if (err) 4323 4321 goto err_neigh_entry_insert; 4324 4322 4323 + neigh_release(old_n); 4324 + 4325 4325 read_lock_bh(&n->lock); 4326 4326 nud_state = n->nud_state; 4327 4327 dead = n->dead; ··· 4332 4328 4333 4329 list_for_each_entry(nh, &neigh_entry->nexthop_list, 4334 4330 neigh_list_node) { 4335 - neigh_release(old_n); 4336 - neigh_clone(n); 4337 4331 __mlxsw_sp_nexthop_neigh_update(nh, !entry_connected); 4338 4332 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); 4339 4333 } 4340 - 4341 - neigh_release(n); 4342 4334 4343 4335 return 0; 4344 4336 ··· 4428 4428 } 4429 4429 } 4430 4430 4431 + /* Release the reference taken by neigh_lookup() / neigh_create() since 4432 + * neigh_entry already holds one. 4433 + */ 4434 + neigh_release(n); 4435 + 4431 4436 /* If that is the first nexthop connected to that neigh, add to 4432 4437 * nexthop_neighs_list 4433 4438 */ ··· 4459 4454 struct mlxsw_sp_nexthop *nh) 4460 4455 { 4461 4456 struct mlxsw_sp_neigh_entry *neigh_entry = nh->neigh_entry; 4462 - struct neighbour *n; 4463 4457 4464 4458 if (!neigh_entry) 4465 4459 return; 4466 - n = neigh_entry->key.n; 4467 4460 4468 4461 __mlxsw_sp_nexthop_neigh_update(nh, true); 4469 4462 list_del(&nh->neigh_list_node); ··· 4475 4472 4476 4473 if (!neigh_entry->connected && list_empty(&neigh_entry->nexthop_list)) 4477 4474 mlxsw_sp_neigh_entry_destroy(mlxsw_sp, neigh_entry); 4478 - 4479 - neigh_release(n); 4480 4475 } 4481 4476 4482 4477 static bool mlxsw_sp_ipip_netdev_ul_up(struct net_device *ol_dev)