]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - net/sched/cls_route.c
net_sched: destroy proto tp when all filters are gone
[mirror_ubuntu-bionic-kernel.git] / net / sched / cls_route.c
index bb8a60235d01c90e6de3a433c25559edd070b549..08a3b0a6f5abd3fd674d7bca32c62c2626608b15 100644 (file)
@@ -277,13 +277,20 @@ route4_delete_filter(struct rcu_head *head)
        kfree(f);
 }
 
-static void route4_destroy(struct tcf_proto *tp)
+static bool route4_destroy(struct tcf_proto *tp, bool force)
 {
        struct route4_head *head = rtnl_dereference(tp->root);
        int h1, h2;
 
        if (head == NULL)
-               return;
+               return true;
+
+       if (!force) {
+               for (h1 = 0; h1 <= 256; h1++) {
+                       if (rcu_access_pointer(head->table[h1]))
+                               return false;
+               }
+       }
 
        for (h1 = 0; h1 <= 256; h1++) {
                struct route4_bucket *b;
@@ -308,6 +315,7 @@ static void route4_destroy(struct tcf_proto *tp)
        }
        RCU_INIT_POINTER(tp->root, NULL);
        kfree_rcu(head, rcu);
+       return true;
 }
 
 static int route4_delete(struct tcf_proto *tp, unsigned long arg)