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> --- drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index 14bed1d..36a71d2 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c @@ -2027,6 +2027,21 @@ static int mlxsw_sp_router_fib_event(struct notifier_block *nb, return NOTIFY_DONE; } +static void mlxsw_sp_router_fib_dump(struct mlxsw_sp *mlxsw_sp) +{ + while (!fib_notifier_dump(&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) { int err; @@ -2048,6 +2063,7 @@ 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); + mlxsw_sp_router_fib_dump(mlxsw_sp); return 0; err_neigh_init: -- 2.7.4