net: marvell: prestera: Fix deinit sequence for router
authorYevhen Orlov <yevhen.orlov@plvision.eu>
Tue, 11 Jan 2022 01:11:29 +0000 (03:11 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 12 Jan 2022 18:17:11 +0000 (10:17 -0800)
* Add missed call prestera_router_fini in prestera_switch_fini
* Add prestera_router_hw_fini, which verify lists are empty

Fixes: 69204174cc5c ("net: marvell: prestera: Add prestera router infra")
Signed-off-by: Yevhen Orlov <yevhen.orlov@plvision.eu>
Link: https://lore.kernel.org/r/20220111011129.5457-1-yevhen.orlov@plvision.eu
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/prestera/prestera_main.c
drivers/net/ethernet/marvell/prestera/prestera_router.c
drivers/net/ethernet/marvell/prestera/prestera_router_hw.c
drivers/net/ethernet/marvell/prestera/prestera_router_hw.h

index 08fdd1e..cad93f7 100644 (file)
@@ -982,6 +982,7 @@ static void prestera_switch_fini(struct prestera_switch *sw)
        prestera_event_handlers_unregister(sw);
        prestera_rxtx_switch_fini(sw);
        prestera_switchdev_fini(sw);
+       prestera_router_fini(sw);
        prestera_netdev_event_handler_unregister(sw);
        prestera_hw_switch_fini(sw);
 }
index 607b88b..6ef4d32 100644 (file)
@@ -168,7 +168,7 @@ int prestera_router_init(struct prestera_switch *sw)
 err_register_inetaddr_notifier:
        unregister_inetaddr_validator_notifier(&router->inetaddr_valid_nb);
 err_register_inetaddr_validator_notifier:
-       /* prestera_router_hw_fini */
+       prestera_router_hw_fini(sw);
 err_router_lib_init:
        kfree(sw->router);
        return err;
@@ -178,7 +178,7 @@ void prestera_router_fini(struct prestera_switch *sw)
 {
        unregister_inetaddr_notifier(&sw->router->inetaddr_nb);
        unregister_inetaddr_validator_notifier(&sw->router->inetaddr_valid_nb);
-       /* router_hw_fini */
+       prestera_router_hw_fini(sw);
        kfree(sw->router);
        sw->router = NULL;
 }
index 490e9b6..e5592b6 100644 (file)
@@ -29,6 +29,12 @@ int prestera_router_hw_init(struct prestera_switch *sw)
        return 0;
 }
 
+void prestera_router_hw_fini(struct prestera_switch *sw)
+{
+       WARN_ON(!list_empty(&sw->router->vr_list));
+       WARN_ON(!list_empty(&sw->router->rif_entry_list));
+}
+
 static struct prestera_vr *__prestera_vr_find(struct prestera_switch *sw,
                                              u32 tb_id)
 {
index ab5e013..b6b0285 100644 (file)
@@ -32,5 +32,6 @@ prestera_rif_entry_create(struct prestera_switch *sw,
                          struct prestera_rif_entry_key *k,
                          u32 tb_id, const unsigned char *addr);
 int prestera_router_hw_init(struct prestera_switch *sw);
+void prestera_router_hw_fini(struct prestera_switch *sw);
 
 #endif /* _PRESTERA_ROUTER_HW_H_ */