net: marvell: prestera: Add cleanup of allocated fib_nodes
authorYevhen Orlov <yevhen.orlov@plvision.eu>
Sat, 1 Oct 2022 09:34:10 +0000 (12:34 +0300)
committerJakub Kicinski <kuba@kernel.org>
Tue, 4 Oct 2022 00:14:52 +0000 (17:14 -0700)
Do explicity cleanup on router_hw_fini, to ensure, that all allocated
objects cleaned. This will be used in cases,
when upper layer (cache) is not mapped to router_hw layer.

Co-developed-by: Taras Chornyi <tchornyi@marvell.com>
Signed-off-by: Taras Chornyi <tchornyi@marvell.com>
Co-developed-by: Oleksandr Mazur <oleksandr.mazur@plvision.eu>
Signed-off-by: Oleksandr Mazur <oleksandr.mazur@plvision.eu>
Signed-off-by: Yevhen Orlov <yevhen.orlov@plvision.eu>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/prestera/prestera_router_hw.c

index db9d2e9..4f65df0 100644 (file)
@@ -56,6 +56,7 @@ static int prestera_nexthop_group_set(struct prestera_switch *sw,
 static bool
 prestera_nexthop_group_util_hw_state(struct prestera_switch *sw,
                                     struct prestera_nexthop_group *nh_grp);
+static void prestera_fib_node_destroy_ht_cb(void *ptr, void *arg);
 
 /* TODO: move to router.h as macros */
 static bool prestera_nh_neigh_key_is_valid(struct prestera_nh_neigh_key *key)
@@ -97,6 +98,8 @@ err_nh_neigh_ht_init:
 
 void prestera_router_hw_fini(struct prestera_switch *sw)
 {
+       rhashtable_free_and_destroy(&sw->router->fib_ht,
+                                   prestera_fib_node_destroy_ht_cb, sw);
        WARN_ON(!list_empty(&sw->router->vr_list));
        WARN_ON(!list_empty(&sw->router->rif_entry_list));
        rhashtable_destroy(&sw->router->fib_ht);
@@ -605,6 +608,15 @@ void prestera_fib_node_destroy(struct prestera_switch *sw,
        kfree(fib_node);
 }
 
+static void prestera_fib_node_destroy_ht_cb(void *ptr, void *arg)
+{
+       struct prestera_fib_node *node = ptr;
+       struct prestera_switch *sw = arg;
+
+       __prestera_fib_node_destruct(sw, node);
+       kfree(node);
+}
+
 struct prestera_fib_node *
 prestera_fib_node_create(struct prestera_switch *sw,
                         struct prestera_fib_key *key,