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

Reply via email to