From: Ido Schimmel <ido...@mellanox.com> Make sure the device has a complete view of the FIB tables by invoking their dump during module init.
Signed-off-by: Ido Schimmel <ido...@mellanox.com> Signed-off-by: Jiri Pirko <j...@mellanox.com> --- .../net/ethernet/mellanox/mlxsw/spectrum_router.c | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index 14bed1d..d176047 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c @@ -2027,8 +2027,23 @@ static int mlxsw_sp_router_fib_event(struct notifier_block *nb, return NOTIFY_DONE; } +static void mlxsw_sp_router_fib_dump_flush(struct notifier_block *nb) +{ + struct mlxsw_sp *mlxsw_sp = container_of(nb, struct mlxsw_sp, fib_nb); + + /* Flush pending FIB notifications and then flush the device's + * table before requesting another dump. Do that with RTNL held, + * as FIB notification block is already registered. + */ + mlxsw_core_flush_owq(); + rtnl_lock(); + mlxsw_sp_router_fib_flush(mlxsw_sp); + rtnl_unlock(); +} + int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp) { + fib_dump_cb_t *cb = mlxsw_sp_router_fib_dump_flush; int err; INIT_LIST_HEAD(&mlxsw_sp->router.nexthop_neighs_list); @@ -2048,8 +2063,16 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp) mlxsw_sp->fib_nb.notifier_call = mlxsw_sp_router_fib_event; register_fib_notifier(&mlxsw_sp->fib_nb); + if (!fib_notifier_dump(&mlxsw_sp->fib_nb, &init_net, cb)) { + err = -EBUSY; + goto err_fib_notifier_dump; + } + return 0; +err_fib_notifier_dump: + unregister_fib_notifier(&mlxsw_sp->fib_nb); + mlxsw_sp_neigh_fini(mlxsw_sp); err_neigh_init: mlxsw_sp_vrs_fini(mlxsw_sp); err_vrs_init: -- 2.7.4